diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/font-ext.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/font-ext.lua | 225 |
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 |