summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/font-ext.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/font-ext.lua')
-rw-r--r--Master/texmf-dist/tex/context/base/font-ext.lua225
1 files changed, 225 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/font-ext.lua b/Master/texmf-dist/tex/context/base/font-ext.lua
new file mode 100644
index 00000000000..2b360c57c5e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/font-ext.lua
@@ -0,0 +1,225 @@
+if not modules then modules = { } end modules ['font-ext'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex and hand-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local byte = string.byte
+
+-- -- -- -- -- --
+-- expansion (hz)
+-- -- -- -- -- --
+
+fonts.expansions = fonts.expansions or { }
+fonts.expansions.classes = fonts.expansions.classes or { }
+fonts.expansions.vectors = fonts.expansions.vectors or { }
+
+-- beware, pdftex itself uses percentages * 10
+
+fonts.expansions.classes.preset = { stretch = 2, shrink = 2, step = .5, factor = 1 }
+
+function commands.setupfontexpansion(class,settings)
+ aux.getparameters(fonts.expansions.classes,class,'preset',settings)
+end
+
+fonts.expansions.classes['quality'] = {
+ stretch = 2, shrink = 2, step = .5, vector = 'default', factor = 1
+}
+
+fonts.expansions.vectors['default'] = {
+ [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
+ [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
+ [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
+ [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
+ [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
+ [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
+ [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
+ [byte('w')] = 0.7, [byte('z')] = 0.7,
+ [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
+}
+
+function fonts.initializers.common.expansion(tfmdata,value)
+ if value then
+ local class = fonts.expansions.classes[value]
+ if class then
+ local vector = fonts.expansions.vectors[class.vector]
+ if vector then
+ tfmdata.stretch = (class.stretch or 0) * 10
+ tfmdata.shrink = (class.shrink or 0) * 10
+ tfmdata.step = (class.step or 0) * 10
+ tfmdata.auto_expand = true
+ local factor = class.factor or 1
+ local data = characters.data
+ for i, chr in pairs(tfmdata.characters) do
+ local v = vector[i]
+ if not v then
+ local d = data[i]
+ if d then
+ local s = d.shcode
+ if not s then
+ -- sorry
+ elseif type(s) == "table" then
+ v = ((vector[s[1]] or 0) + (vector[s[#s]] or 0)) / 2
+ else
+ v = vector[s] or 0
+ end
+ end
+ end
+ if v and v ~= 0 then
+ chr.expansion_factor = v*factor
+ else -- can be option
+ chr.expansion_factor = factor
+ end
+ end
+ end
+ end
+ end
+end
+
+table.insert(fonts.manipulators,"expansion")
+
+fonts.initializers.base.otf.expansion = fonts.initializers.common.expansion
+fonts.initializers.node.otf.expansion = fonts.initializers.common.expansion
+
+fonts.initializers.base.afm.expansion = fonts.initializers.common.expansion
+fonts.initializers.node.afm.expansion = fonts.initializers.common.expansion
+
+-- -- -- -- -- --
+-- protrusion
+-- -- -- -- -- --
+
+fonts.protrusions = fonts.protrusions or { }
+fonts.protrusions.classes = fonts.protrusions.classes or { }
+fonts.protrusions.vectors = fonts.protrusions.vectors or { }
+
+-- the values need to be revisioned
+
+fonts.protrusions.classes.preset = { factor = 1 }
+
+function commands.setupfontprotrusion(class,settings)
+ aux.getparameters(fonts.protrusions.classes,class,'preset',settings)
+end
+
+fonts.protrusions.classes['pure'] = {
+ vector = 'pure', factor = 1
+}
+fonts.protrusions.classes['punctuation'] = {
+ vector = 'punctuation', factor = 1
+}
+fonts.protrusions.classes['alpha'] = {
+ vector = 'alpha', factor = 1
+}
+fonts.protrusions.classes['quality'] = {
+ vector = 'quality', factor = 1
+}
+
+fonts.protrusions.vectors['pure'] = {
+
+ [0x002C] = { 0, 1 }, -- comma
+ [0x002E] = { 0, 1 }, -- period
+ [0x003A] = { 0, 1 }, -- colon
+ [0x003B] = { 0, 1 }, -- semicolon
+ [0x002D] = { 0, 1 }, -- hyphen
+ [0x2013] = { 0, 0.50 }, -- endash
+ [0x2014] = { 0, 0.33 }, -- emdash
+
+}
+
+fonts.protrusions.vectors['punctuation'] = {
+
+ [0x003F] = { 0, 0.20 }, -- ?
+ [0x00BF] = { 0, 0.20 }, -- ¿
+ [0x0021] = { 0, 0.20 }, -- !
+ [0x00A1] = { 0, 0.20 }, -- ¡
+ [0x0028] = { 0.05, 0 }, -- (
+ [0x0029] = { 0, 0.05 }, -- )
+ [0x005B] = { 0.05, 0 }, -- [
+ [0x005D] = { 0, 0.05 }, -- ]
+ [0x002C] = { 0, 0.70 }, -- comma
+ [0x002E] = { 0, 0.70 }, -- period
+ [0x003A] = { 0, 0.50 }, -- colon
+ [0x003B] = { 0, 0.50 }, -- semicolon
+ [0x002D] = { 0, 0.70 }, -- hyphen
+ [0x2013] = { 0, 0.30 }, -- endash
+ [0x2014] = { 0, 0.20 }, -- emdash
+
+ -- todo: left and right quotes: .5 double, .7 single
+
+}
+
+fonts.protrusions.vectors['alpha'] = {
+
+ [byte("A")] = { .05, .05 },
+ [byte("F")] = { 0, .05 },
+ [byte("J")] = { .05, 0 },
+ [byte("K")] = { 0, .05 },
+ [byte("L")] = { 0, .05 },
+ [byte("T")] = { .05, .05 },
+ [byte("V")] = { .05, .05 },
+ [byte("W")] = { .05, .05 },
+ [byte("X")] = { .05, .05 },
+ [byte("Y")] = { .05, .05 },
+
+ [byte("k")] = { 0, .05 },
+ [byte("r")] = { 0, .05 },
+ [byte("t")] = { 0, .05 },
+ [byte("v")] = { .05, .05 },
+ [byte("w")] = { .05, .05 },
+ [byte("x")] = { .05, .05 },
+ [byte("y")] = { .05, .05 },
+
+}
+
+fonts.protrusions.vectors['quality'] = table.merge( {},
+ fonts.protrusions.vectors['punctuation'],
+ fonts.protrusions.vectors['alpha']
+)
+
+function fonts.initializers.common.protrusion(tfmdata,value)
+ if value then
+ local class = fonts.protrusions.classes[value]
+ if class then
+ local vector = fonts.protrusions.vectors[class.vector]
+ if vector then
+ local factor = class.factor or 1
+ local data = characters.data
+ local emwidth = tfmdata.parameters.quad
+ for i, chr in pairs(tfmdata.characters) do
+ local v, pl, pr = vector[i], nil, nil
+ if v then
+ pl, pr = v[1], v[2]
+ else
+ local d = data[i]
+ if d then
+ local s = d.shcode
+ if not s then
+ -- sorry
+ elseif type(s) == "table" then
+ local vl, vr = vector[s[1]], vector[s[#s]]
+ if vl then pl = vl[1] end
+ if vr then pr = vr[2] end
+ else
+ v = vector[s]
+ if v then
+ pl, pr = v[1], v[2]
+ end
+ end
+ end
+ end
+ if pl and pl ~= 0 then chr.left_protruding = pl*factor end
+ if pr and pr ~= 0 then chr.right_protruding = pr*factor end
+ end
+ end
+ end
+ end
+end
+
+table.insert(fonts.manipulators,"protrusion")
+
+fonts.initializers.base.otf.protrusion = fonts.initializers.common.protrusion
+fonts.initializers.node.otf.protrusion = fonts.initializers.common.protrusion
+
+fonts.initializers.base.afm.protrusion = fonts.initializers.common.protrusion
+fonts.initializers.node.afm.protrusion = fonts.initializers.common.protrusion