summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tex/context/base/cont-log.mkiv6
-rw-r--r--tex/context/base/cont-new.mkii2
-rw-r--r--tex/context/base/cont-new.mkiv2
-rw-r--r--tex/context/base/context.mkii2
-rw-r--r--tex/context/base/context.mkiv2
-rw-r--r--tex/context/base/font-afm.lua2
-rw-r--r--tex/context/base/font-chk.lua2
-rw-r--r--tex/context/base/font-col.lua6
-rw-r--r--tex/context/base/font-con.lua153
-rw-r--r--tex/context/base/font-ctx.lua97
-rw-r--r--tex/context/base/font-enh.lua36
-rw-r--r--tex/context/base/font-ext.lua4
-rw-r--r--tex/context/base/font-fbk.lua4
-rw-r--r--tex/context/base/font-ini.mkiv35
-rw-r--r--tex/context/base/font-log.lua2
-rw-r--r--tex/context/base/font-map.lua4
-rw-r--r--tex/context/base/font-ota.lua2
-rw-r--r--tex/context/base/font-otb.lua8
-rw-r--r--tex/context/base/font-otf.lua12
-rw-r--r--tex/context/base/math-act.lua142
-rw-r--r--tex/context/base/math-dim.lua30
-rw-r--r--tex/context/base/math-ext.lua4
-rw-r--r--tex/context/base/math-ini.lua134
-rw-r--r--tex/context/base/math-ini.mkiv1
-rw-r--r--tex/context/base/math-noa.lua2
-rw-r--r--tex/context/base/math-vfu.lua25
-rw-r--r--tex/context/base/node-inj.lua2
-rw-r--r--tex/context/base/status-files.pdfbin23563 -> 23537 bytes
-rw-r--r--tex/generic/context/luatex-fonts-def.lua2
-rw-r--r--tex/generic/context/luatex-fonts-merged.lua185
30 files changed, 455 insertions, 453 deletions
diff --git a/tex/context/base/cont-log.mkiv b/tex/context/base/cont-log.mkiv
index 158aee85c..171949ba0 100644
--- a/tex/context/base/cont-log.mkiv
+++ b/tex/context/base/cont-log.mkiv
@@ -219,7 +219,7 @@
% \ifx\fontalternative\c!bi -\else
% \ifx\fontalternative\c!bs -\fi\fi\fi\fi
-\def\LuaTeX
+\unexpanded\def\LuaTeX
{\dontleavehmode
\begingroup
Lua%
@@ -246,4 +246,8 @@
\let\luaTeX \LuaTeX
\let\LUATEX \LuaTeX
+\unexpanded\def\MKII{MkII}
+\unexpanded\def\MKIV{MkIV}
+\unexpanded\def\MKVI{MkVI}
+
\protect \endinput
diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
index c0af3ec21..c188839a8 100644
--- a/tex/context/base/cont-new.mkii
+++ b/tex/context/base/cont-new.mkii
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2011.03.26 12:41}
+\newcontextversion{2011.03.27 14:17}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index 8aed059b9..a2e84d9b7 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2011.03.26 12:41}
+\newcontextversion{2011.03.27 14:17}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
index f96fa884e..850a83f3f 100644
--- a/tex/context/base/context.mkii
+++ b/tex/context/base/context.mkii
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2011.03.26 12:41}
+\edef\contextversion{2011.03.27 14:17}
%D For those who want to use this:
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index 97a319cf4..f058e8266 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2011.03.26 12:41}
+\edef\contextversion{2011.03.27 14:17}
%D For those who want to use this:
diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua
index 8d35be9d6..09cd64491 100644
--- a/tex/context/base/font-afm.lua
+++ b/tex/context/base/font-afm.lua
@@ -380,7 +380,7 @@ unify = function(data, filename)
if not code then
code = private
private = private + 1
- report_afm("assigning private slot U+%04X for unknown glyph name %s", code, name)
+ report_afm("assigning private slot U+%05X for unknown glyph name %s", code, name)
end
end
local index = blob.index
diff --git a/tex/context/base/font-chk.lua b/tex/context/base/font-chk.lua
index 819586532..e3679f06d 100644
--- a/tex/context/base/font-chk.lua
+++ b/tex/context/base/font-chk.lua
@@ -47,7 +47,7 @@ local function onetimemessage(font,char,message)
messages[message] = category
end
if not category[char] then
- report_fonts("char U+%04X in font '%s' with id %s: %s",char,tfmdata.properties.fullname,font,message)
+ report_fonts("char U+%05X in font '%s' with id %s: %s",char,tfmdata.properties.fullname,font,message)
category[char] = true
end
end
diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua
index bf24737ba..945d35d43 100644
--- a/tex/context/base/font-col.lua
+++ b/tex/context/base/font-col.lua
@@ -72,12 +72,12 @@ function collections.define(name,font,ranges,details)
if start and stop then
if trace_collecting then
if description then
- report_fonts("def: using range %s (U+%04x-U+%04X, %s)",s,start,stop,description)
+ report_fonts("def: using range %s (U+%05x-U+%05X, %s)",s,start,stop,description)
end
for i=1,#d do
local di = d[i]
if (start >= di.start and start <= di.stop) or (stop >= di.start and stop <= di.stop) then
- report_fonts("def: overlapping ranges U+%04x-U+%04X and U+%04x-U+%04X",start,stop,di.start,di.stop)
+ report_fonts("def: overlapping ranges U+%05x-U+%05X and U+%05x-U+%05X",start,stop,di.start,di.stop)
end
end
end
@@ -107,7 +107,7 @@ function collections.stage_2(name)
local id = list[i]
local start, stop = f.start, f.stop
if trace_collecting then
- report_fonts("def: remapping font %s to %s for range U+%04X - U+%04X",current,id,start,stop)
+ report_fonts("def: remapping font %s to %s for range U+%05X - U+%05X",current,id,start,stop)
end
local check = toboolean(f.check or "false",true)
local force = toboolean(f.force or "true",true)
diff --git a/tex/context/base/font-con.lua b/tex/context/base/font-con.lua
index 434f64215..7e823c6e2 100644
--- a/tex/context/base/font-con.lua
+++ b/tex/context/base/font-con.lua
@@ -39,7 +39,6 @@ local contextnumbers = specifiers.contextnumbers
-- will be directives
-constructors.sharebasekerns = false -- true (.5 sec slower on mk but brings down mem from 410M to 310M, beware: then script/lang share too)
constructors.dontembed = allocate()
constructors.mathactions = { }
constructors.autocleanup = true
@@ -97,47 +96,6 @@ in the process; numbers are of course copies. Here 65536 equals 1pt. (Due to
excessive memory usage in CJK fonts, we no longer pass the boundingbox.)</p>
--ldx]]--
--- the following hack costs a bit of runtime but safes memory
---
--- basekerns are scaled and will be hashed by table id
--- sharedkerns are unscaled and are be hashed by concatenated indexes
-
---~ function constructors.check_base_kerns(tfmdata)
---~ if constructors.sharebasekerns then
---~ local sharedkerns = tfmdata.sharedkerns
---~ if sharedkerns then
---~ local basekerns = { }
---~ tfmdata.basekerns = basekerns
---~ return sharedkerns, basekerns
---~ end
---~ end
---~ return nil, nil
---~ end
-
---~ function constructors.prepare_base_kerns(tfmdata)
---~ if constructors.sharebasekerns and not tfmdata.sharedkerns then
---~ local sharedkerns = { }
---~ tfmdata.sharedkerns = sharedkerns
---~ for u, chr in next, tfmdata.characters do
---~ local kerns = chr.kerns
---~ if kerns then
---~ local hash = concat(sortedkeys(kerns), " ")
---~ local base = sharedkerns[hash]
---~ if not base then
---~ sharedkerns[hash] = kerns
---~ else
---~ chr.kerns = base
---~ end
---~ end
---~ end
---~ end
---~ end
-
--- we can cache scaled characters when we are in node mode and don't have
--- protruding and expansion: hash == fullname @ size @ protruding @ expansion
--- but in practice (except from mk) the otf hash will be enough already so it
--- makes no sense to mess up the code now
-
-- The scaler is only used for otf and afm and virtual fonts. If
-- a virtual font has italic correction make sure to set the
-- italic_correction flag. Some more flags will be added in
@@ -186,6 +144,34 @@ function constructors.calculatescale(tfmdata,scaledpoints)
return scaledpoints, scaledpoints / (parameters.units or 1000) -- delta
end
+function constructors.assignmathparameters(target,tfmdata)
+ -- when a tfm file is loaded, it has already been scaled
+ -- and it never enters the scaled so this is otf only
+ local mathparameters = original.mathparameters
+ if mathparameters and next(mathparameters) then
+ local targetparameters = target.parameters
+ local targetmathparameters = { }
+ local factor = targetparameters.factor
+ for name, value in next, mathparameters do
+ if name == "RadicalDegreeBottomRaisePercent" then
+ targetmathparameters[name] = value
+ else
+ targetmathparameters[name] = value * factor
+ end
+ end
+ if not targetmathparameters.AccentBaseHeight then
+ targetmathparameters.AccentBaseHeight = nil -- safeguard, still needed?
+ end
+ if not targetmathparameters.FractionDelimiterSize then
+ targetmathparameters.FractionDelimiterSize = 0
+ end
+ if not mathparameters.FractionDelimiterDisplayStyleSize then
+ targetmathparameters.FractionDelimiterDisplayStyleSize = 0
+ end
+ target.mathparameters = targetmathparameters
+ end
+end
+
function constructors.scale(tfmdata,specification)
local target = { } -- the new table
--
@@ -205,23 +191,22 @@ function constructors.scale(tfmdata,specification)
local shared = tfmdata.shared or { }
local parameters = tfmdata.parameters or { }
local mathparameters = tfmdata.mathparameters or { }
- local MathConstants = tfmdata.mathconstants or { }
--
local targetcharacters = { }
local targetdescriptions = table.derive(descriptions)
local targetparameters = table.derive(parameters)
- local targetmathparameters = table.derive(mathparameters)
+ -- local targetmathparameters = table.fastcopy(mathparameters) -- happens elsewhere
local targetproperties = table.derive(properties)
- local targetgoodies = table.derive(goodies)
+ local targetgoodies = goodies -- we need to loop so no metatable
target.characters = targetcharacters
target.descriptions = targetdescriptions
target.parameters = targetparameters
- target.mathparameters = targetmathparameters
+ -- target.mathparameters = targetmathparameters -- happens elsewhere
target.properties = targetproperties
target.goodies = targetgoodies
target.shared = shared
target.resources = resources
- target.unscaled = tfmdata -- the original unscaled one (temp)
+ target.unscaled = tfmdata -- the original unscaled one
--
-- specification.mathsize : 1=text 2=script 3=scriptscript
-- specification.textsize : natural (text)size
@@ -331,9 +316,9 @@ function constructors.scale(tfmdata,specification)
target.slant = 0
end
--
+ targetparameters.factor = delta
targetparameters.hfactor = hdelta
targetparameters.vfactor = vdelta
- targetparameters.factor = delta
targetparameters.size = scaledpoints
targetparameters.units = units
targetparameters.scaledpoints = askedscaledpoints
@@ -350,18 +335,6 @@ function constructors.scale(tfmdata,specification)
end
--
target.type = isvirtual and "virtual" or "real"
- -- more extensive test
- local hasmath = (properties.math or next(mathparameters) or next(MathConstants)) and true
- if hasmath then
- properties.has_math = true
- target.nomath = false
- target.MathConstants = MathConstants
- target.mathconstants = MathConstants
- else
- properties.has_math = false
- target.nomath = true
- target.mathparameters = nil -- nop
- end
-- this will move to some subtable so that it is copied at once
target.postprocessors = tfmdata.postprocessors
--
@@ -389,45 +362,37 @@ function constructors.scale(tfmdata,specification)
if descender then
targetparameters.descender = delta * descender
end
+ -- copies, might disappear
+ targetparameters.xheight = targetparameters.xheight or parameters.x_height
+ targetparameters.extraspace = targetparameters.extraspace or parameters.extra_space
+ targetparameters.spacestretch = targetparameters.spacestretch or parameters.space_stretch
+ targetparameters.spaceshrink = targetparameters.spaceshrink or parameters.space_shrink
+ --
+ local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0
+ local scaledwidth = defaultwidth * hdelta
+ local scaledheight = defaultheight * vdelta
+ local scaleddepth = defaultdepth * vdelta
--
+ local hasmath = (properties.has_math or next(mathparameters)) and true
if hasmath then
- local ma = constructors.mathactions
- local ta = type(ma)
- if ta == "function" then -- context
- ma(target,tfmdata)
- elseif ta == "table" then -- generic (we keep the deltas)
- for i=1,#ma do
- ma[i](target,tfmdata,delta,hdelta,vdelta)
- end
- end
- if not targetparameters[13] then targetparameters[13] = .86*targetx_height end -- mathsupdisplay
- if not targetparameters[14] then targetparameters[14] = .86*targetx_height end -- mathsupnormal
- if not targetparameters[15] then targetparameters[15] = .86*targetx_height end -- mathsupcramped
- if not targetparameters[16] then targetparameters[16] = .48*targetx_height end -- mathsubnormal
- if not targetparameters[17] then targetparameters[17] = .48*targetx_height end -- mathsubcombined
- if not targetparameters[22] then targetparameters[22] = 0 end -- mathaxisheight
- if target.MathConstants then target.MathConstants.AccentBaseHeight = nil end -- safeguard
if trace_defining then
report_defining("math enabled for: name '%s', fullname: '%s', filename: '%s'",
name or "noname",fullname or "nofullname",filename or "nofilename")
end
+ constructors.assignmathparameters(target,tfmdata) -- does scaling and whatever is needed
+ properties.has_math = true
+ target.nomath = false
+ target.MathConstants = target.mathparameters
else
if trace_defining then
report_defining("math disabled for: name '%s', fullname: '%s', filename: '%s'",
name or "noname",fullname or "nofullname",filename or "nofilename")
end
+ properties.has_math = false
+ target.nomath = true
+ target.mathparameters = nil -- nop
end
--
- targetparameters.xheight = targetparameters.xheight or parameters.x_height
- targetparameters.extraspace = targetparameters.extraspace or parameters.extra_space
- targetparameters.spacestretch = targetparameters.spacestretch or parameters.space_stretch
- targetparameters.spaceshrink = targetparameters.spaceshrink or parameters.space_shrink
- --
- local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0
- local scaledwidth = defaultwidth * hdelta
- local scaledheight = defaultheight * vdelta
- local scaleddepth = defaultdepth * vdelta
- --
local sharedkerns = { }
--
for unicode, character in next, characters do
@@ -526,7 +491,7 @@ function constructors.scale(tfmdata,specification)
if vn then
chr.next = vn
-- if character.vert_variants or character.horiz_variants then
- -- report_defining("glyph 0x%05X has combination of next, vert_variants and horiz_variants",index)
+ -- report_defining("glyph U+%05X has combination of next, vert_variants and horiz_variants",index)
-- end
else
local vv = character.vert_variants
@@ -588,19 +553,6 @@ function constructors.scale(tfmdata,specification)
if not nodemode then
local vk = character.kerns
if vk then
- -- if sharedkerns then
- -- local base = basekerns[vk] -- hashed by table id, not content
- -- if not base then
- -- base = {}
- -- for k,v in next, vk do base[k] = v*hdelta end
- -- basekerns[vk] = base
- -- end
- -- chr.kerns = base
- -- else
- -- local tt = {}
- -- for k,v in next, vk do tt[k] = v*hdelta end
- -- chr.kerns = tt
- -- end
local s = sharedkerns[vk]
if not s then
s = { }
@@ -757,7 +709,6 @@ function constructors.finalize(tfmdata)
--
-- tfmdata.fonts
-- tfmdata.unscaled
- -- tfmdata.mathconstants
--
if not properties.has_math then
properties.has_math = not tfmdata.nomath
diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua
index d3886eee8..e68874a4a 100644
--- a/tex/context/base/font-ctx.lua
+++ b/tex/context/base/font-ctx.lua
@@ -600,8 +600,9 @@ end
local n = 0
-- we can also move rscale to here (more consistent)
+-- the argument list will become a table
-function definers.stage_two(global,cs,str,size,classfeatures,fontfeatures,classfallbacks,fontfallbacks,
+function definers.stage_two(global,cs,str,size,inheritancemode,classfeatures,fontfeatures,classfallbacks,fontfallbacks,
mathsize,textsize,relativeid,classgoodies,goodies)
if trace_defining then
report_defining("memory usage before: %s",statistics.memused())
@@ -616,27 +617,67 @@ function definers.stage_two(global,cs,str,size,classfeatures,fontfeatures,classf
local id = tonumber(relativeid) or 0
specification.relativeid = id > 0 and id
end
- specification.name = name
- specification.size = size
- specification.sub = (sub and sub ~= "" and sub) or specification.sub
+ specification.name = name
+ specification.size = size
+ specification.sub = (sub and sub ~= "" and sub) or specification.sub
specification.mathsize = mathsize
specification.textsize = textsize
- specification.goodies = goodies
- specification.cs = cs
- specification.global = global
+ specification.goodies = goodies
+ specification.cs = cs
+ specification.global = global
if detail and detail ~= "" then
- specification.method, specification.detail = method or "*", detail
+ specification.method = method or "*"
+ specification.detail = detail
elseif specification.detail and specification.detail ~= "" then
-- already set
- elseif fontfeatures and fontfeatures ~= "" then
- specification.method, specification.detail = "*", fontfeatures
- elseif classfeatures and classfeatures ~= "" then
- specification.method, specification.detail = "*", classfeatures
- end
- if fontfallbacks and fontfallbacks ~= "" then
- specification.fallbacks = fontfallbacks
- elseif classfallbacks and classfallbacks ~= "" then
- specification.fallbacks = classfallbacks
+ elseif inheritancemode == 0 then
+ -- nothing
+ elseif inheritancemode == 1 then
+ -- fontonly
+ if fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ end
+ if fontfallbacks and fontfallbacks ~= "" then
+ specification.fallbacks = fontfallbacks
+ end
+ elseif inheritancemode == 2 then
+ -- classonly
+ if classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ end
+ if classfallbacks and classfallbacks ~= "" then
+ specification.fallbacks = classfallbacks
+ end
+ elseif inheritancemode == 3 then
+ -- fontfirst
+ if fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ elseif classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ end
+ if fontfallbacks and fontfallbacks ~= "" then
+ specification.fallbacks = fontfallbacks
+ elseif classfallbacks and classfallbacks ~= "" then
+ specification.fallbacks = classfallbacks
+ end
+ elseif inheritancemode == 4 then
+ -- classfirst
+ if classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ elseif fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ end
+ if classfallbacks and classfallbacks ~= "" then
+ specification.fallbacks = classfallbacks
+ elseif fontfallbacks and fontfallbacks ~= "" then
+ specification.fallbacks = fontfallbacks
+ end
end
local tfmdata = definers.read(specification,size) -- id not yet known
local cs = specification.cs
@@ -1025,7 +1066,7 @@ function commands.showchardata(n)
end
local chr = tfmdata.characters[n]
if chr then
- report_status("%s @ %s => U%04X => %s => %s",tfmdata.properties.fullname,tfmdata.parameters.size,n,utfchar(n),serialize(chr,false))
+ report_status("%s @ %s => U%05X => %s => %s",tfmdata.properties.fullname,tfmdata.parameters.size,n,utfchar(n),serialize(chr,false))
end
end
end
@@ -1033,19 +1074,19 @@ end
function commands.showfontparameters()
local tfmdata = fontdata[currentfont()]
if tfmdata then
- local parameters = tfmdata.parameters
- local mathconstants = tfmdata.MathConstants
- local properties = tfmdata.properties
- local hasparameters = parameters and next(parameters)
- local hasmathconstants = mathconstants and next(mathconstants)
+ local parameters = tfmdata.parameters
+ local mathparameters = tfmdata.mathparameters
+ local properties = tfmdata.properties
+ local hasparameters = parameters and next(parameters)
+ local hasmathparameters = mathparameters and next(mathparameters)
if hasparameters then
- report_status("%s @ %s => parameters => %s",properties.fullname,parameters.size,serialize(parameters,false))
+ report_status("%s @ %s => text parameters => %s",properties.fullname,parameters.size,serialize(parameters,false))
end
- if hasmathconstants then
- report_status("%s @ %s => math constants => %s",properties.fullname,parameters.size,serialize(mathconstants,false))
+ if hasmathparameters then
+ report_status("%s @ %s => math parameters => %s",properties.fullname,parameters.size,serialize(mathparameters,false))
end
- if not hasparameters and not hasmathconstants then
- report_status("%s @ %s => no parameters and/or mathconstants",properties.fullname,parameters.size)
+ if not hasparameters and not hasmathparameters then
+ report_status("%s @ %s => no text parameters and/or math parameters",properties.fullname,parameters.size)
end
end
end
diff --git a/tex/context/base/font-enh.lua b/tex/context/base/font-enh.lua
index 54e5e242a..d19424384 100644
--- a/tex/context/base/font-enh.lua
+++ b/tex/context/base/font-enh.lua
@@ -20,6 +20,9 @@ local registertfmfeature = tfmfeatures.register
local afmfeatures = fonts.constructors.newfeatures("afm")
local registerafmfeature = afmfeatures.register
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+
-- -- these will become goodies (when needed at all)
--
-- local fontencodings = fonts.encodings
@@ -41,7 +44,7 @@ local registerafmfeature = afmfeatures.register
-- for newcode, oldcode in next, data.unicodes do
-- if newcode ~= oldcode then
-- if trace_defining then
--- report_defining("reencoding U+%04X to U+%04X",newcode,oldcode)
+-- report_defining("reencoding U+%05X to U+%05X",oldcode,newcode)
-- end
-- characters[newcode] = original[oldcode]
-- end
@@ -69,7 +72,7 @@ local registerafmfeature = afmfeatures.register
-- for k,v in next, vector do
-- if k ~= v then
-- if trace_defining then
--- report_defining("remapping U+%04X to U+%04X",k,v)
+-- report_defining("remapping U+%05X to U+%05X",k,v)
-- end
-- local c = original[k]
-- characters[v] = c
@@ -100,6 +103,7 @@ local registerafmfeature = afmfeatures.register
-- we only add and don't replace
-- we could also add kerns but we asssume symbols
+-- todo: complain if not basemode
local function initializeunicoding(tfmdata)
local goodies = tfmdata.goodies
@@ -114,10 +118,26 @@ local function initializeunicoding(tfmdata)
local characters = tfmdata.characters
local descriptions = tfmdata.descriptions
local oldcoding = tfmdata.resources.unicodes
+ local originals = { }
for name, newcode in next, newcoding do
local oldcode = oldcoding[name]
- characters [newcode] = characters [oldcode]
- descriptions[newcode] = descriptions[oldcode]
+ if characters[newcode] and not originals[newcode] then
+ originals[newcode] = {
+ character = characters [newcode],
+ description = descriptions[newcode],
+ }
+ end
+ local original = originals[oldcode]
+ if original then
+ characters [newcode] = original.character
+ descriptions[newcode] = original.description
+ else
+ characters [newcode] = characters [oldcode]
+ descriptions[newcode] = descriptions[oldcode]
+ end
+ if trace_defining then
+ report_defining("aliasing glyph '%s' from U+%05X to U+%05X",name,oldcode,newcode)
+ end
end
end
end
@@ -131,3 +151,11 @@ registerafmfeature {
}
}
+registerotffeature {
+ name = "unicoding",
+ description = "adapt unicode table",
+ initializers = {
+ base = initializeunicoding,
+ node = initializeunicoding,
+ }
+}
diff --git a/tex/context/base/font-ext.lua b/tex/context/base/font-ext.lua
index 97bee4d67..4ea9cf3ca 100644
--- a/tex/context/base/font-ext.lua
+++ b/tex/context/base/font-ext.lua
@@ -347,7 +347,7 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd)
local p = - (v[1] / 1000) * factor * left
characters[k].left_protruding = p
if trace_protrusion then
- report_protrusions("lfbd -> %s -> 0x%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
+ report_protrusions("lfbd -> %s -> U+%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
end
end
done = true
@@ -370,7 +370,7 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd)
local p = (v[1] / 1000) * factor * right
characters[k].right_protruding = p
if trace_protrusion then
- report_protrusions("rtbd -> %s -> 0x%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
+ report_protrusions("rtbd -> %s -> U+%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
end
end
end
diff --git a/tex/context/base/font-fbk.lua b/tex/context/base/font-fbk.lua
index d5cec59c9..6712fbe88 100644
--- a/tex/context/base/font-fbk.lua
+++ b/tex/context/base/font-fbk.lua
@@ -107,7 +107,7 @@ local function composecharacters(tfmdata)
end
if charsacc then
if trace_combining_all then
- report_combining("%s (0x%05X) = %s (0x%05X) + %s (0x%05X)",utfchar(i),i,utfchar(chr),chr,utfchar(acc),acc)
+ report_combining("%s (U+%05X) = %s (U+%05X) + %s (U+%05X)",utfchar(i),i,utfchar(chr),chr,utfchar(acc),acc)
end
local acc_t = cache[acc]
if not acc_t then
@@ -176,7 +176,7 @@ local function composecharacters(tfmdata)
end
else
if trace_combining_all then
- report_combining("%s (0x%05X) = %s (0x%05X) (simplified)",utfchar(i),i,utfchar(chr),chr)
+ report_combining("%s (U+%05X) = %s (U+%05X) (simplified)",utfchar(i),i,utfchar(chr),chr)
end
t.commands = { chr_t } -- else index mess
end
diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv
index f4a1fc5ba..442ac4861 100644
--- a/tex/context/base/font-ini.mkiv
+++ b/tex/context/base/font-ini.mkiv
@@ -181,11 +181,10 @@
\let\thedefinedfont\relax
\def\dodefinedfont[#1]%
- {\setfalse\inheritfromfontclass
+ {\featureinheritancemode\featureinheritancefontonly
\iffirstargument\definefont[thedefinedfont][#1]\fi % we can speed this one up
\thedefinedfont
- \the\everydefinedfont
- \settrue\inheritfromfontclass}
+ \the\everydefinedfont}
\unexpanded\def\definedfont
{\dosingleempty\dodefinedfont}
@@ -701,7 +700,20 @@
\let\relativefontid\empty
-\newconditional\inheritfromfontclass % used in \definefont and \definedfont
+% 0 = none
+% 1 = fontonly
+% 2 = classonly
+% 3 = fontfirst
+% 4 = classfirst
+
+\setnewconstant\featureinheritancefontnone \zerocount
+\setnewconstant\featureinheritancefontonly \plusone
+\setnewconstant\featureinheritanceclassonly \plustwo
+\setnewconstant\featureinheritancefontfirst \plusthree
+\setnewconstant\featureinheritanceclassfirst\plusfour
+
+\setnewconstant\featureinheritancedefault \featureinheritancefontfirst
+\setnewconstant\featureinheritancemode \featureinheritancedefault
\unexpanded\def\lowleveldefinefont#1#2% #2 = cs
{% we can now set more at the lua end
@@ -742,20 +754,22 @@
"#2", % cs, trailing % is gone
"\somefontfile",
\number\scaledfontsize,
- "\ifconditional\inheritfromfontclass\@@fontclassfeatures\fi",
+ \number\featureinheritancemode,
+ "\@@fontclassfeatures",
"\@@fontfeatures",
- "\ifconditional\inheritfromfontclass\@@fontclassfallbacks\fi",
+ "\@@fontclassfallbacks",
"\@@fontfallbacks",
0\currentmathsize,
\number\dimexpr\textface\relax,
"\relativefontid", % experiment
- "\ifconditional\inheritfromfontclass\@@fontclassgoodies\fi", % experiment (not yet used)
+ "\@@fontclassgoodies", % experiment (not yet used)
"\@@fontgoodies" % experiment
)}%
% \edef\somefontspec{at \somefontsize}% we need the resolved designsize (for fallbacks)
\edef\somefontspec{at \number\scaledfontsize sp}% we need the resolved designsize (for fallbacks)
\expandafter\let\expandafter\lastrawfontcall\csname#2\endcsname
- \the\everydefinefont}
+ \the\everydefinefont
+ \setnewconstant\featureinheritancemode\featureinheritancedefault}
\def\updatefontclassparameters
{\edef\@@fontclassfeatures {\ifcsname\fontclass\fontstyle\s!features \endcsname\csname\fontclass\fontstyle\s!features \endcsname\fi}%
@@ -1183,7 +1197,7 @@
\def\newfontidentifier{*\fontclass\lastfontidentifier\fontstyle\fontsize*}
\def\dododefinefont#1#2%
- {\setfalse\inheritfromfontclass
+ {\featureinheritancemode\featureinheritancefontonly
\edef\lastfontidentifier{#1}%
\let\localrelativefontsize\defaultrelativefontsize
\let\localabsolutefontsize\fontbody
@@ -1192,8 +1206,7 @@
\autofontsizefalse
\setfontcharacteristics
\the\everyfontswitch
- \let\rawfontidentifier\oldrawfontidentifier
- \settrue\inheritfromfontclass}
+ \let\rawfontidentifier\oldrawfontidentifier}
\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine
{\edef\lastfontidentifier{#3}%
diff --git a/tex/context/base/font-log.lua b/tex/context/base/font-log.lua
index 5f18c52cb..d89482737 100644
--- a/tex/context/base/font-log.lua
+++ b/tex/context/base/font-log.lua
@@ -43,7 +43,7 @@ function loggers.onetimemessage(font,char,message,reporter)
if not reporter then
reporter = report_defining
end
- reporter("char U+%04X in font '%s' with id %s: %s",char,tfmdata.properties.fullname,font,message)
+ reporter("char U+%05X in font '%s' with id %s: %s",char,tfmdata.properties.fullname,font,message)
category[char] = true
end
end
diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua
index 0733f245c..76733adea 100644
--- a/tex/context/base/font-map.lua
+++ b/tex/context/base/font-map.lua
@@ -272,9 +272,9 @@ function mappings.addtounicode(data,filename)
local index = glyph.index
local toun = tounicode[index]
if toun then
- report_fonts("internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun)
+ report_fonts("internal: 0x%05X, name: %s, unicode: U+%05X, tounicode: %s",index,name,unic,toun)
else
- report_fonts("internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic)
+ report_fonts("internal: 0x%05X, name: %s, unicode: U+%05X",index,name,unic)
end
end
end
diff --git a/tex/context/base/font-ota.lua b/tex/context/base/font-ota.lua
index 8ca9d8e6a..a820236fd 100644
--- a/tex/context/base/font-ota.lua
+++ b/tex/context/base/font-ota.lua
@@ -239,7 +239,7 @@ local arab_warned = { }
local function warning(current,what)
local char = current.char
if not arab_warned[char] then
- log.report("analyze","arab: character %s (U+%04X) has no %s class", char, char, what)
+ log.report("analyze","arab: character %s (U+%05X) has no %s class", char, char, what)
arab_warned[char] = true
end
end
diff --git a/tex/context/base/font-otb.lua b/tex/context/base/font-otb.lua
index d4019b31d..f3285da1c 100644
--- a/tex/context/base/font-otb.lua
+++ b/tex/context/base/font-otb.lua
@@ -34,15 +34,15 @@ local function gref(descriptions,n)
if type(n) == "number" then
local name = descriptions[n].name
if name then
- return format("U+%04X (%s)",n,name)
+ return format("U+%05X (%s)",n,name)
else
- return format("U+%04X")
+ return format("U+%05X")
end
elseif n then
local num, nam = { }, { }
for i=2,#n do -- first is likely a key
local ni = n[i]
- num[i] = format("U+%04X",ni)
+ num[i] = format("U+%05X",ni)
nam[i] = descriptions[ni].name or "?"
end
return format("%s (%s)",concat(num," "), concat(nam," "))
@@ -374,7 +374,7 @@ local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,don
local character = characters[preceding]
if not character then
if trace_baseinit then
- report_prepare("weird ligature in lookup %s: 0x%04X (%s), preceding 0x%04X (%s)",lookupname,v,utfchar(v),preceding,utfchar(preceding))
+ report_prepare("weird ligature in lookup %s: U+%05X (%s), preceding U+%05X (%s)",lookupname,v,utfchar(v),preceding,utfchar(preceding))
end
character = makefake(tfmdata,name,present)
end
diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua
index 00c612999..7a0d061b3 100644
--- a/tex/context/base/font-otf.lua
+++ b/tex/context/base/font-otf.lua
@@ -625,7 +625,7 @@ actions["prepare glyphs"] = function(data,filename,raw)
unicode = private
unicodes[name] = private
if trace_private then
- report_otf("enhance: glyph %s at index U+%04X is moved to private unicode slot U+%04X",name,index,private)
+ report_otf("enhance: glyph %s at index 0x%04X is moved to private unicode slot U+%05X",name,index,private)
end
private = private + 1
nofnames = nofnames + 1
@@ -672,7 +672,7 @@ actions["prepare glyphs"] = function(data,filename,raw)
unicode = private
unicodes[name] = private
if trace_private then
- report_otf("enhance: glyph %s at index U+%04X is moved to private unicode slot U+%04X",name,index,private)
+ report_otf("enhance: glyph %s at index 0x%04X is moved to private unicode slot U+%05X",name,index,private)
end
private = private + 1
else
@@ -730,7 +730,7 @@ actions["prepare unicodes"] = function(data,filename,raw)
local description = descriptions[parent]
if description then
local c = fastcopy(description)
- c.comment = format("copy of 0x%04X", parent)
+ c.comment = format("copy of U+%05X", parent)
descriptions[unicode] = c
local name = c.name
if not unicodes[name] then
@@ -740,7 +740,7 @@ actions["prepare unicodes"] = function(data,filename,raw)
multiples[nofmultiples] = name -- we can save duplicates if needed
else
-- make it a notdef
- report_otf("weird unicode 0x%04X at index 0x%04X",unicode,index)
+ report_otf("weird unicode U+%05X at index 0x%04X",unicode,index)
end
end
end
@@ -1294,7 +1294,7 @@ actions["reorganize glyph kerns"] = function(data,filename,raw)
end
end
elseif trace_loading then
- report_otf("problems with unicode %s of kern %s of glyph 0x%04X",name,k,unicode)
+ report_otf("problems with unicode %s of kern %s of glyph U+%05X",name,k,unicode)
end
end
end
@@ -1379,7 +1379,7 @@ actions["merge kern classes"] = function(data,filename,raw)
lookupkerns[second_unicode] = kern
end
elseif trace_loading then
- report_otf("no glyph data for U+%04X", first_unicode)
+ report_otf("no glyph data for U+%05X", first_unicode)
end
end
end
diff --git a/tex/context/base/math-act.lua b/tex/context/base/math-act.lua
new file mode 100644
index 000000000..03675933e
--- /dev/null
+++ b/tex/context/base/math-act.lua
@@ -0,0 +1,142 @@
+if not modules then modules = { } end modules ['math-act'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
+local report_math = logs.reporter("mathematics","initializing")
+
+local mathematics = mathematics
+
+local sequencers = utilities.sequencers
+local appendgroup = sequencers.appendgroup
+local appendaction = sequencers.appendaction
+local mathprocessor = nil
+
+local mathactions = sequencers.reset {
+ arguments = "target,original",
+}
+
+function fonts.constructors.assignmathparameters(original,target)
+ if mathactions.dirty then -- maybe use autocompile
+ mathprocessor = sequencers.compile(mathactions)
+ end
+ mathprocessor(original,target)
+end
+
+appendgroup(mathactions,"before") -- user
+appendgroup(mathactions,"system") -- private
+appendgroup(mathactions,"after" ) -- user
+
+function mathematics.initializeparameters(target,original)
+ local mathparameters = original.mathparameters
+ if mathparameters and next(mathparameters) then
+ target.mathparameters = mathematics.dimensions(mathparameters)
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.initializeparameters")
+
+local how = {
+ -- RadicalKernBeforeDegree = "horizontal",
+ -- RadicalKernAfterDegree = "horizontal",
+ RadicalDegreeBottomRaisePercent = "unscaled"
+}
+
+function mathematics.scaleparameters(target,original)
+ if not target.properties.math_is_scaled then
+ local mathparameters = target.mathparameters
+ if mathparameters and next(mathparameters) then
+ local parameters = target.parameters
+ local factor = parameters.factor
+ local hfactor = parameters.hfactor
+ local vfactor = parameters.vfactor
+ for name, value in next, mathparameters do
+ local h = how[name]
+ if h == "unscaled" then
+ mathparameters[name] = value
+ elseif h == "horizontal" then
+ mathparameters[name] = value * hfactor
+ elseif h == "vertical"then
+ mathparameters[name] = value * vfactor
+ else
+ mathparameters[name] = value * factor
+ end
+ end
+ end
+ target.properties.math_is_scaled = true
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.scaleparameters")
+
+function mathematics.checkaccentbaseheight(target,original)
+ local mathparameters = target.mathparameters
+ if mathparameters then
+ mathparameters.AccentBaseHeight = nil -- safeguard
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.checkaccentbaseheight")
+
+function mathematics.checkprivateparameters(target,original)
+ local mathparameters = target.mathparameters
+ if mathparameters then
+ if not mathparameters.FractionDelimiterSize then
+ mathparameters.FractionDelimiterSize = 0
+ end
+ if not mathparameters.FractionDelimiterDisplayStyleSize then
+ mathparameters.FractionDelimiterDisplayStyleSize = 0
+ end
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.checkprivateparameters")
+
+function mathematics.overloadparameters(target,original)
+ local mathparameters = target.mathparameters
+ if mathparameters and next(mathparameters) then
+ local goodies = target.goodies
+ if goodies then
+ for i=1,#goodies do
+ local goodie = goodies[i]
+ local mathematics = goodie.mathematics
+ local parameters = mathematics and mathematics.parameters
+ if parameters then
+ if trace_defining then
+ report_math("overloading math parameters in '%s' @ %s",target.properties.fullname,target.parameters.size)
+ end
+ for name, value in next, parameters do
+ local tvalue = type(value)
+ if tvalue == "string" then
+ report_math("comment for math parameter '%s': %s",name,value)
+ else
+ local oldvalue = mathparameters[name]
+ local newvalue = oldvalue
+ if oldvalue then
+ if tvalue == "number" then
+ newvalue = value
+ elseif tvalue == "function" then
+ newvalue = value(oldvalue,target,original)
+ elseif not tvalue then
+ newvalue = nil
+ end
+ if trace_defining and oldvalue ~= newvalue then
+ report_math("overloading math parameter '%s': %s => %s",name,tostring(oldvalue),tostring(newvalue))
+ end
+ else
+ report_math("invalid math parameter '%s'",name)
+ end
+ mathparameters[name] = newvalue
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.overloadparameters")
diff --git a/tex/context/base/math-dim.lua b/tex/context/base/math-dim.lua
index 1d3f93ad3..7b4b49f68 100644
--- a/tex/context/base/math-dim.lua
+++ b/tex/context/base/math-dim.lua
@@ -216,10 +216,10 @@ end
-- return t.default or t.text_style or 0
-- end
-function mathematics.dimensions(dimens)
+function mathematics.dimensions(dimens) -- beware, dimens get spoiled
if dimens.SpaceAfterScript then
dimens.SubscriptShiftDownWithSuperscript = dimens.SubscriptShiftDown * 1.5
- return { }, table.fastcopy(dimens)
+ return table.fastcopy(dimens), { }
elseif dimens.AxisHeight or dimens.axis_height then
local t = { }
local math_x_height = dimens.x_height or 10*65526
@@ -259,8 +259,11 @@ function mathematics.dimensions(dimens)
t[variable] = tt
end
local d = {
- AxisHeight = t . axis . text_style,
AccentBaseHeight = t . accent_base_height . text_style,
+ AxisHeight = t . axis . text_style,
+ -- DelimitedSubFormulaMinHeight
+ -- DisplayOperatorMinHeight
+ -- FlattenedAccentBaseHeight
FractionDenominatorDisplayStyleGapMin = t . fraction_denom_vgap . display_style,
FractionDenominatorDisplayStyleShiftDown = t . fraction_denom_down . display_style,
FractionDenominatorGapMin = t . fraction_denom_vgap . text_style,
@@ -274,6 +277,8 @@ function mathematics.dimensions(dimens)
FractionDelimiterDisplayStyleSize = t . fraction_del_size . display_style,
LowerLimitBaselineDropMin = t . limit_below_bgap . text_style,
LowerLimitGapMin = t . limit_below_vgap . text_style,
+ -- MathLeading
+ MinConnectorOverlap = t . connector_overlap_min . text_style,
OverbarExtraAscender = t . overbar_kern . text_style,
OverbarRuleThickness = t . overbar_rule . text_style,
OverbarVerticalGap = t . overbar_vgap . text_style,
@@ -284,6 +289,10 @@ function mathematics.dimensions(dimens)
RadicalKernBeforeDegree = t . radical_degree_before . display_style,
RadicalKernAfterDegree = t . radical_degree_after . display_style,
RadicalDegreeBottomRaisePercent = t . radical_degree_raise . display_style,
+ -- ScriptPercentScaleDown
+ -- ScriptScriptPercentScaleDown
+ -- SkewedFractionHorizontalGap
+ -- SkewedFractionVerticalGap
SpaceAfterScript = t . space_after_script . text_style,
StackBottomDisplayStyleShiftDown = t . stack_denom_down . display_style,
StackBottomShiftDown = t . stack_denom_down . text_style,
@@ -291,11 +300,15 @@ function mathematics.dimensions(dimens)
StackGapMin = t . stack_vgap . text_style,
StackTopDisplayStyleShiftUp = t . stack_num_up . display_style,
StackTopShiftUp = t . stack_num_up . text_style,
+ StretchStackGapBelowMin = t . over_delimiter_vgap . text_style,
+ StretchStackTopShiftUp = t . over_delimiter_bgap . text_style,
+ StretchStackGapAboveMin = t . under_delimiter_vgap . text_style,
+ StretchStackBottomShiftDown = t . under_delimiter_bgap . text_style,
+ SubSuperscriptGapMin = t . subsup_vgap . text_style,
SubscriptBaselineDropMin = t . sub_shift_drop . text_style,
SubscriptShiftDown = t . sub_shift_down . text_style,
SubscriptShiftDownWithSuperscript = t . sub_sup_shift_down . text_style,
SubscriptTopMax = t . sub_top_max . text_style,
- SubSuperscriptGapMin = t . subsup_vgap . text_style,
SuperscriptBaselineDropMax = t . sup_shift_drop . text_style,
SuperscriptBottomMaxWithSubscript = t . sup_sub_bottom_max . text_style,
SuperscriptBottomMin = t . sup_bottom_min . text_style,
@@ -306,14 +319,9 @@ function mathematics.dimensions(dimens)
UnderbarVerticalGap = t . underbar_vgap . text_style,
UpperLimitBaselineRiseMin = t . limit_above_bgap . text_style,
UpperLimitGapMin = t . limit_above_vgap . text_style,
- MinConnectorOverlap = t . connector_overlap_min . text_style,
- StretchStackGapBelowMin = t . over_delimiter_vgap . text_style,
- StretchStackTopShiftUp = t . over_delimiter_bgap . text_style,
- StretchStackGapAboveMin = t . under_delimiter_vgap . text_style,
- StretchStackBottomShiftDown = t . under_delimiter_bgap . text_style,
}
- d.AccentBaseHeight = 0
- return t, d -- this might change
+ d.AccentBaseHeight = 0 -- here? still?
+ return d, t -- t only for diagnostics
else
return { }, { }
end
diff --git a/tex/context/base/math-ext.lua b/tex/context/base/math-ext.lua
index ac994ea35..da00c7a9e 100644
--- a/tex/context/base/math-ext.lua
+++ b/tex/context/base/math-ext.lua
@@ -25,7 +25,7 @@ function extras.add(unicode,t)
if unicode >= min and unicode <= max then
mathdata[unicode], chardata[unicode] = t, t
else
- report_math("extra U+%04X should be in range U+%04X - U+%04X",unicode,min,max)
+ report_math("extra U+%05X should be in range U+%05X - U+%05X",unicode,min,max)
end
end
@@ -47,7 +47,7 @@ function extras.copy(target,original)
local nextchar = characters[nextnext]
if nextchar then
if trace_virtual then
- report_math("extra U+%04X in %s at %s maps on U+%04X (class: %s, name: %s)",unicode,
+ report_math("extra U+%05X in %s at %s maps on U+%05X (class: %s, name: %s)",unicode,
file.basename(properties.fullname),parameters.size,nextslot,extradesc.mathclass or "?",extradesc.mathname or "?")
end
characters[unicode] = nextchar
diff --git a/tex/context/base/math-ini.lua b/tex/context/base/math-ini.lua
index b211f7dd2..a122f7229 100644
--- a/tex/context/base/math-ini.lua
+++ b/tex/context/base/math-ini.lua
@@ -9,8 +9,6 @@ if not modules then modules = { } end modules ['math-ext'] = {
-- if needed we can use the info here to set up xetex definition files
-- the "8000 hackery influences direct characters (utf) as indirect \char's
-local utf = unicode.utf8
-
local texsprint, format, utfchar, utfbyte = tex.sprint, string.format, utf.char, utf.byte
local setmathcode, setdelcode = tex.setmathcode, tex.setdelcode
@@ -367,135 +365,3 @@ function mathematics.big(tfmdata,unicode,n)
return unicode
end
--- plugins (will be proper handler, once we have separated generic from context)
-
-local sequencers = utilities.sequencers
-local appendgroup = sequencers.appendgroup
-local appendaction = sequencers.appendaction
-local mathprocessor = nil
-
-local mathactions = sequencers.reset {
- arguments = "target,original,directives",
-}
-
-function fonts.constructors.mathactions(original,target,directives)
- if mathactions.dirty then -- maybe use autocompile
- mathprocessor = sequencers.compile(mathactions)
- end
- mathprocessor(original,target,directives or {})
-end
-
-appendgroup(mathactions,"before") -- user
-appendgroup(mathactions,"system") -- private
-appendgroup(mathactions,"after" ) -- user
-
-function mathematics.initializeparameters(target,original,directives)
- local mathparameters = original.mathparameters
- if mathparameters and next(mathparameters) then
- local _, mp = mathematics.dimensions(mathparameters)
- target.mathparameters = mp -- for ourselves
- target.MathConstants = mp -- for luatex
- end
-end
-
-sequencers.appendaction(mathactions,"system","mathematics.initializeparameters")
-
-local how = {
- -- RadicalKernBeforeDegree = "horizontal",
- -- RadicalKernAfterDegree = "horizontal",
- RadicalDegreeBottomRaisePercent = "unscaled"
-}
-
-function mathematics.scaleparameters(target,original,directives)
- if not directives.disablescaling then
- local mathparameters = target.mathparameters
- if mathparameters and next(mathparameters) then
- local parameters = target.parameters
- local factor = parameters.factor
- local hfactor = parameters.hfactor
- local vfactor = parameters.vfactor
- for name, value in next, mathparameters do
- local h = how[name]
- if h == "unscaled" then
- mathparameters[name] = value
- elseif h == "horizontal" then
- mathparameters[name] = value * hfactor
- elseif h == "vertical"then
- mathparameters[name] = value * vfactor
- else
- mathparameters[name] = value * factor
- end
- end
- end
- end
-end
-
-sequencers.appendaction(mathactions,"system","mathematics.scaleparameters")
-
-function mathematics.checkaccentbaseheight(target,original,directives)
- local MathConstants = target.MathConstants
- if MathConstants then
- MathConstants.AccentBaseHeight = nil -- safeguard
- end
-end
-
-sequencers.appendaction(mathactions,"system","mathematics.checkaccentbaseheight")
-
-function mathematics.checkprivateparameters(target,original,directives)
- local MathConstants = target.MathConstants
- if MathConstants then
- if not MathConstants.FractionDelimiterSize then
- MathConstants.FractionDelimiterSize = 0
- end
- if not MathConstants.FractionDelimiterDisplayStyleSize then
- MathConstants.FractionDelimiterDisplayStyleSize = 0
- end
- end
-end
-
-sequencers.appendaction(mathactions,"system","mathematics.checkprivateparameters")
-
-function mathematics.overloadparameters(target,original,directives)
- local mathparameters = target.mathparameters
- if mathparameters and next(mathparameters) then
- local goodies = target.goodies
- if goodies then
- for i=1,#goodies do
- local goodie = goodies[i]
- local mathematics = goodie.mathematics
- local parameters = mathematics and mathematics.parameters
- if parameters then
- if trace_defining then
- report_math("overloading math parameters in '%s' @ %s",target.properties.fullname,target.parameters.size)
- end
- for name, value in next, parameters do
- local tvalue = type(value)
- if tvalue == "string" then
- report_math("comment for math parameter '%s': %s",name,value)
- else
- local oldvalue = mathparameters[name]
- local newvalue = oldvalue
- if oldvalue then
- if tvalue == "number" then
- newvalue = value
- elseif tvalue == "function" then
- newvalue = value(oldvalue,target,original)
- elseif not tvalue then
- newvalue = nil
- end
- if trace_defining and oldvalue ~= newvalue then
- report_math("overloading math parameter '%s': %s => %s",name,tostring(oldvalue),tostring(newvalue))
- end
- else
- report_math("invalid math parameter '%s'",name)
- end
- mathparameters[name] = newvalue
- end
- end
- end
- end
- end
- end
-end
-
-sequencers.appendaction(mathactions,"system","mathematics.overloadparameters")
diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv
index 43e091969..f778afa08 100644
--- a/tex/context/base/math-ini.mkiv
+++ b/tex/context/base/math-ini.mkiv
@@ -36,6 +36,7 @@
\registerctxluafile{math-ini}{1.001}
\registerctxluafile{math-dim}{1.001}
+\registerctxluafile{math-act}{1.001}
\registerctxluafile{math-ent}{1.001}
\registerctxluafile{math-ext}{1.001}
\registerctxluafile{math-vfu}{1.001}
diff --git a/tex/context/base/math-noa.lua b/tex/context/base/math-noa.lua
index 8c9676ca4..57361fe04 100644
--- a/tex/context/base/math-noa.lua
+++ b/tex/context/base/math-noa.lua
@@ -149,7 +149,7 @@ local mathgreek = attributes.private("mathgreek")
processors.relocate = { }
local function report_remap(tag,id,old,new,extra)
- report_remapping("remapping %s in font %s from U+%04X (%s) to U+%04X (%s)%s",tag,id,old,utfchar(old),new,utfchar(new),extra or "")
+ report_remapping("remapping %s in font %s from U+%05X (%s) to U+%05X (%s)%s",tag,id,old,utfchar(old),new,utfchar(new),extra or "")
end
local remapalphabets = mathematics.remapalphabets
diff --git a/tex/context/base/math-vfu.lua b/tex/context/base/math-vfu.lua
index b13f1804e..190a89c71 100644
--- a/tex/context/base/math-vfu.lua
+++ b/tex/context/base/math-vfu.lua
@@ -293,7 +293,7 @@ local function stack(main,characters,id,size,unicode,u1,d12,u2)
end
end
-function vfmath.alas(main,id,size)
+function vfmath.addmissing(main,id,size)
local characters = main.characters
local shared = main.shared
local variables = main.goodies.mathematics and main.goodies.mathematics.variables or { }
@@ -358,10 +358,6 @@ setmetatable ( reverse, { __index = function(t,name)
return r
end } )
-local mathdirectives = {
- disablescaling = true
-}
-
function vfmath.define(specification,set,goodies)
local name = specification.name -- symbolic name
local size = specification.size -- given size
@@ -486,9 +482,9 @@ function vfmath.define(specification,set,goodies)
--
-- we need to set some values in main as well (still?)
--
- main.fullname = properties.fullname
- main.type = "virtual"
- main.nomath = false
+ main.fullname = properties.fullname
+ main.type = "virtual"
+ main.nomath = false
--
parameters.x_height = parameters.x_height or 0
--
@@ -718,18 +714,19 @@ function vfmath.define(specification,set,goodies)
size = size,
}
--
- if mathparameters then -- weak catch ? ? ?
- vfmath.alas(main,#fontlist,size)
- end
- --
+ main.mathparameters = mathparameters -- still traditional ones
+ vfmath.addmissing(main,#fontlist,size)
mathematics.addfallbacks(main)
--
+ main.properties.math_is_scaled = true -- signal
+ fonts.constructors.assignmathparameters(main,main)
+ --
+ main.MathConstants = main.mathparameters -- we directly pass it to TeX (bypasses the scaler) so this is needed
+ --
if trace_virtual or trace_timings then
report_virtual("loading and virtualizing font %s at size %s took %0.3f seconds",name,size,os.clock()-start)
end
--
- fonts.constructors.mathactions(main,main,mathdirectives)
- --
return main
end
diff --git a/tex/context/base/node-inj.lua b/tex/context/base/node-inj.lua
index 80360b47b..6636e2f1a 100644
--- a/tex/context/base/node-inj.lua
+++ b/tex/context/base/node-inj.lua
@@ -109,7 +109,7 @@ function injections.setmark(start,base,factor,rlmode,ba,ma,index) --ba=baseancho
set_attribute(start,markdone,index)
return dx, dy, bound
else
- report_injections("possible problem, U+%04X is base mark without data (id: %s)",base.char,bound)
+ report_injections("possible problem, U+%05X is base mark without data (id: %s)",base.char,bound)
end
end
index = index or 1
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index 9b377e8a1..8e121dcfb 100644
--- a/tex/context/base/status-files.pdf
+++ b/tex/context/base/status-files.pdf
Binary files differ
diff --git a/tex/generic/context/luatex-fonts-def.lua b/tex/generic/context/luatex-fonts-def.lua
index 1d71bf5d5..0c2f0dbd5 100644
--- a/tex/generic/context/luatex-fonts-def.lua
+++ b/tex/generic/context/luatex-fonts-def.lua
@@ -81,7 +81,7 @@ end
fonts.definers.registersplit(":",colonized,"cryptic")
fonts.definers.registersplit("", colonized,"more cryptic") -- catches \font\text=[names]
-function definers.applypostprocessors(tfmdata)
+function fonts.definers.applypostprocessors(tfmdata)
local postprocessors = tfmdata.postprocessors
if postprocessors then
for i=1,#postprocessors do
diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua
index dbd25af37..0f0437f53 100644
--- a/tex/generic/context/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 03/26/11 12:41:29
+-- merge date : 03/27/11 14:17:54
do -- begin closure to overcome local limits and interference
@@ -2913,7 +2913,6 @@ local contextnumbers = specifiers.contextnumbers
-- will be directives
-constructors.sharebasekerns = false -- true (.5 sec slower on mk but brings down mem from 410M to 310M, beware: then script/lang share too)
constructors.dontembed = allocate()
constructors.mathactions = { }
constructors.autocleanup = true
@@ -2971,47 +2970,6 @@ in the process; numbers are of course copies. Here 65536 equals 1pt. (Due to
excessive memory usage in CJK fonts, we no longer pass the boundingbox.)</p>
--ldx]]--
--- the following hack costs a bit of runtime but safes memory
---
--- basekerns are scaled and will be hashed by table id
--- sharedkerns are unscaled and are be hashed by concatenated indexes
-
---~ function constructors.check_base_kerns(tfmdata)
---~ if constructors.sharebasekerns then
---~ local sharedkerns = tfmdata.sharedkerns
---~ if sharedkerns then
---~ local basekerns = { }
---~ tfmdata.basekerns = basekerns
---~ return sharedkerns, basekerns
---~ end
---~ end
---~ return nil, nil
---~ end
-
---~ function constructors.prepare_base_kerns(tfmdata)
---~ if constructors.sharebasekerns and not tfmdata.sharedkerns then
---~ local sharedkerns = { }
---~ tfmdata.sharedkerns = sharedkerns
---~ for u, chr in next, tfmdata.characters do
---~ local kerns = chr.kerns
---~ if kerns then
---~ local hash = concat(sortedkeys(kerns), " ")
---~ local base = sharedkerns[hash]
---~ if not base then
---~ sharedkerns[hash] = kerns
---~ else
---~ chr.kerns = base
---~ end
---~ end
---~ end
---~ end
---~ end
-
--- we can cache scaled characters when we are in node mode and don't have
--- protruding and expansion: hash == fullname @ size @ protruding @ expansion
--- but in practice (except from mk) the otf hash will be enough already so it
--- makes no sense to mess up the code now
-
-- The scaler is only used for otf and afm and virtual fonts. If
-- a virtual font has italic correction make sure to set the
-- italic_correction flag. Some more flags will be added in
@@ -3060,6 +3018,34 @@ function constructors.calculatescale(tfmdata,scaledpoints)
return scaledpoints, scaledpoints / (parameters.units or 1000) -- delta
end
+function constructors.assignmathparameters(target,tfmdata)
+ -- when a tfm file is loaded, it has already been scaled
+ -- and it never enters the scaled so this is otf only
+ local mathparameters = original.mathparameters
+ if mathparameters and next(mathparameters) then
+ local targetparameters = target.parameters
+ local targetmathparameters = { }
+ local factor = targetparameters.factor
+ for name, value in next, mathparameters do
+ if name == "RadicalDegreeBottomRaisePercent" then
+ targetmathparameters[name] = value
+ else
+ targetmathparameters[name] = value * factor
+ end
+ end
+ if not targetmathparameters.AccentBaseHeight then
+ targetmathparameters.AccentBaseHeight = nil -- safeguard, still needed?
+ end
+ if not targetmathparameters.FractionDelimiterSize then
+ targetmathparameters.FractionDelimiterSize = 0
+ end
+ if not mathparameters.FractionDelimiterDisplayStyleSize then
+ targetmathparameters.FractionDelimiterDisplayStyleSize = 0
+ end
+ target.mathparameters = targetmathparameters
+ end
+end
+
function constructors.scale(tfmdata,specification)
local target = { } -- the new table
--
@@ -3079,23 +3065,22 @@ function constructors.scale(tfmdata,specification)
local shared = tfmdata.shared or { }
local parameters = tfmdata.parameters or { }
local mathparameters = tfmdata.mathparameters or { }
- local MathConstants = tfmdata.mathconstants or { }
--
local targetcharacters = { }
local targetdescriptions = table.derive(descriptions)
local targetparameters = table.derive(parameters)
- local targetmathparameters = table.derive(mathparameters)
+ -- local targetmathparameters = table.fastcopy(mathparameters) -- happens elsewhere
local targetproperties = table.derive(properties)
- local targetgoodies = table.derive(goodies)
+ local targetgoodies = goodies -- we need to loop so no metatable
target.characters = targetcharacters
target.descriptions = targetdescriptions
target.parameters = targetparameters
- target.mathparameters = targetmathparameters
+ -- target.mathparameters = targetmathparameters -- happens elsewhere
target.properties = targetproperties
target.goodies = targetgoodies
target.shared = shared
target.resources = resources
- target.unscaled = tfmdata -- the original unscaled one (temp)
+ target.unscaled = tfmdata -- the original unscaled one
--
-- specification.mathsize : 1=text 2=script 3=scriptscript
-- specification.textsize : natural (text)size
@@ -3205,9 +3190,9 @@ function constructors.scale(tfmdata,specification)
target.slant = 0
end
--
+ targetparameters.factor = delta
targetparameters.hfactor = hdelta
targetparameters.vfactor = vdelta
- targetparameters.factor = delta
targetparameters.size = scaledpoints
targetparameters.units = units
targetparameters.scaledpoints = askedscaledpoints
@@ -3224,18 +3209,6 @@ function constructors.scale(tfmdata,specification)
end
--
target.type = isvirtual and "virtual" or "real"
- -- more extensive test
- local hasmath = (properties.math or next(mathparameters) or next(MathConstants)) and true
- if hasmath then
- properties.has_math = true
- target.nomath = false
- target.MathConstants = MathConstants
- target.mathconstants = MathConstants
- else
- properties.has_math = false
- target.nomath = true
- target.mathparameters = nil -- nop
- end
-- this will move to some subtable so that it is copied at once
target.postprocessors = tfmdata.postprocessors
--
@@ -3263,45 +3236,37 @@ function constructors.scale(tfmdata,specification)
if descender then
targetparameters.descender = delta * descender
end
+ -- copies, might disappear
+ targetparameters.xheight = targetparameters.xheight or parameters.x_height
+ targetparameters.extraspace = targetparameters.extraspace or parameters.extra_space
+ targetparameters.spacestretch = targetparameters.spacestretch or parameters.space_stretch
+ targetparameters.spaceshrink = targetparameters.spaceshrink or parameters.space_shrink
+ --
+ local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0
+ local scaledwidth = defaultwidth * hdelta
+ local scaledheight = defaultheight * vdelta
+ local scaleddepth = defaultdepth * vdelta
--
+ local hasmath = (properties.has_math or next(mathparameters)) and true
if hasmath then
- local ma = constructors.mathactions
- local ta = type(ma)
- if ta == "function" then -- context
- ma(target,tfmdata)
- elseif ta == "table" then -- generic (we keep the deltas)
- for i=1,#ma do
- ma[i](target,tfmdata,delta,hdelta,vdelta)
- end
- end
- if not targetparameters[13] then targetparameters[13] = .86*targetx_height end -- mathsupdisplay
- if not targetparameters[14] then targetparameters[14] = .86*targetx_height end -- mathsupnormal
- if not targetparameters[15] then targetparameters[15] = .86*targetx_height end -- mathsupcramped
- if not targetparameters[16] then targetparameters[16] = .48*targetx_height end -- mathsubnormal
- if not targetparameters[17] then targetparameters[17] = .48*targetx_height end -- mathsubcombined
- if not targetparameters[22] then targetparameters[22] = 0 end -- mathaxisheight
- if target.MathConstants then target.MathConstants.AccentBaseHeight = nil end -- safeguard
if trace_defining then
report_defining("math enabled for: name '%s', fullname: '%s', filename: '%s'",
name or "noname",fullname or "nofullname",filename or "nofilename")
end
+ constructors.assignmathparameters(target,tfmdata) -- does scaling and whatever is needed
+ properties.has_math = true
+ target.nomath = false
+ target.MathConstants = target.mathparameters
else
if trace_defining then
report_defining("math disabled for: name '%s', fullname: '%s', filename: '%s'",
name or "noname",fullname or "nofullname",filename or "nofilename")
end
+ properties.has_math = false
+ target.nomath = true
+ target.mathparameters = nil -- nop
end
--
- targetparameters.xheight = targetparameters.xheight or parameters.x_height
- targetparameters.extraspace = targetparameters.extraspace or parameters.extra_space
- targetparameters.spacestretch = targetparameters.spacestretch or parameters.space_stretch
- targetparameters.spaceshrink = targetparameters.spaceshrink or parameters.space_shrink
- --
- local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0
- local scaledwidth = defaultwidth * hdelta
- local scaledheight = defaultheight * vdelta
- local scaleddepth = defaultdepth * vdelta
- --
local sharedkerns = { }
--
for unicode, character in next, characters do
@@ -3400,7 +3365,7 @@ function constructors.scale(tfmdata,specification)
if vn then
chr.next = vn
-- if character.vert_variants or character.horiz_variants then
- -- report_defining("glyph 0x%05X has combination of next, vert_variants and horiz_variants",index)
+ -- report_defining("glyph U+%05X has combination of next, vert_variants and horiz_variants",index)
-- end
else
local vv = character.vert_variants
@@ -3462,19 +3427,6 @@ function constructors.scale(tfmdata,specification)
if not nodemode then
local vk = character.kerns
if vk then
- -- if sharedkerns then
- -- local base = basekerns[vk] -- hashed by table id, not content
- -- if not base then
- -- base = {}
- -- for k,v in next, vk do base[k] = v*hdelta end
- -- basekerns[vk] = base
- -- end
- -- chr.kerns = base
- -- else
- -- local tt = {}
- -- for k,v in next, vk do tt[k] = v*hdelta end
- -- chr.kerns = tt
- -- end
local s = sharedkerns[vk]
if not s then
s = { }
@@ -3631,7 +3583,6 @@ function constructors.finalize(tfmdata)
--
-- tfmdata.fonts
-- tfmdata.unscaled
- -- tfmdata.mathconstants
--
if not properties.has_math then
properties.has_math = not tfmdata.nomath
@@ -4534,9 +4485,9 @@ function mappings.addtounicode(data,filename)
local index = glyph.index
local toun = tounicode[index]
if toun then
- report_fonts("internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun)
+ report_fonts("internal: 0x%05X, name: %s, unicode: U+%05X, tounicode: %s",index,name,unic,toun)
else
- report_fonts("internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic)
+ report_fonts("internal: 0x%05X, name: %s, unicode: U+%05X",index,name,unic)
end
end
end
@@ -5404,7 +5355,7 @@ actions["prepare glyphs"] = function(data,filename,raw)
unicode = private
unicodes[name] = private
if trace_private then
- report_otf("enhance: glyph %s at index U+%04X is moved to private unicode slot U+%04X",name,index,private)
+ report_otf("enhance: glyph %s at index 0x%04X is moved to private unicode slot U+%05X",name,index,private)
end
private = private + 1
nofnames = nofnames + 1
@@ -5451,7 +5402,7 @@ actions["prepare glyphs"] = function(data,filename,raw)
unicode = private
unicodes[name] = private
if trace_private then
- report_otf("enhance: glyph %s at index U+%04X is moved to private unicode slot U+%04X",name,index,private)
+ report_otf("enhance: glyph %s at index 0x%04X is moved to private unicode slot U+%05X",name,index,private)
end
private = private + 1
else
@@ -5509,7 +5460,7 @@ actions["prepare unicodes"] = function(data,filename,raw)
local description = descriptions[parent]
if description then
local c = fastcopy(description)
- c.comment = format("copy of 0x%04X", parent)
+ c.comment = format("copy of U+%05X", parent)
descriptions[unicode] = c
local name = c.name
if not unicodes[name] then
@@ -5519,7 +5470,7 @@ actions["prepare unicodes"] = function(data,filename,raw)
multiples[nofmultiples] = name -- we can save duplicates if needed
else
-- make it a notdef
- report_otf("weird unicode 0x%04X at index 0x%04X",unicode,index)
+ report_otf("weird unicode U+%05X at index 0x%04X",unicode,index)
end
end
end
@@ -6073,7 +6024,7 @@ actions["reorganize glyph kerns"] = function(data,filename,raw)
end
end
elseif trace_loading then
- report_otf("problems with unicode %s of kern %s of glyph 0x%04X",name,k,unicode)
+ report_otf("problems with unicode %s of kern %s of glyph U+%05X",name,k,unicode)
end
end
end
@@ -6158,7 +6109,7 @@ actions["merge kern classes"] = function(data,filename,raw)
lookupkerns[second_unicode] = kern
end
elseif trace_loading then
- report_otf("no glyph data for U+%04X", first_unicode)
+ report_otf("no glyph data for U+%05X", first_unicode)
end
end
end
@@ -6719,15 +6670,15 @@ local function gref(descriptions,n)
if type(n) == "number" then
local name = descriptions[n].name
if name then
- return format("U+%04X (%s)",n,name)
+ return format("U+%05X (%s)",n,name)
else
- return format("U+%04X")
+ return format("U+%05X")
end
elseif n then
local num, nam = { }, { }
for i=2,#n do -- first is likely a key
local ni = n[i]
- num[i] = format("U+%04X",ni)
+ num[i] = format("U+%05X",ni)
nam[i] = descriptions[ni].name or "?"
end
return format("%s (%s)",concat(num," "), concat(nam," "))
@@ -7059,7 +7010,7 @@ local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,don
local character = characters[preceding]
if not character then
if trace_baseinit then
- report_prepare("weird ligature in lookup %s: 0x%04X (%s), preceding 0x%04X (%s)",lookupname,v,utfchar(v),preceding,utfchar(preceding))
+ report_prepare("weird ligature in lookup %s: U+%05X (%s), preceding U+%05X (%s)",lookupname,v,utfchar(v),preceding,utfchar(preceding))
end
character = makefake(tfmdata,name,present)
end
@@ -7380,7 +7331,7 @@ function injections.setmark(start,base,factor,rlmode,ba,ma,index) --ba=baseancho
set_attribute(start,markdone,index)
return dx, dy, bound
else
- report_injections("possible problem, U+%04X is base mark without data (id: %s)",base.char,bound)
+ report_injections("possible problem, U+%05X is base mark without data (id: %s)",base.char,bound)
end
end
index = index or 1
@@ -10468,7 +10419,7 @@ local arab_warned = { }
local function warning(current,what)
local char = current.char
if not arab_warned[char] then
- log.report("analyze","arab: character %s (U+%04X) has no %s class", char, char, what)
+ log.report("analyze","arab: character %s (U+%05X) has no %s class", char, char, what)
arab_warned[char] = true
end
end
@@ -11141,7 +11092,7 @@ end
fonts.definers.registersplit(":",colonized,"cryptic")
fonts.definers.registersplit("", colonized,"more cryptic") -- catches \font\text=[names]
-function definers.applypostprocessors(tfmdata)
+function fonts.definers.applypostprocessors(tfmdata)
local postprocessors = tfmdata.postprocessors
if postprocessors then
for i=1,#postprocessors do