1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
if not modules then modules = { } end modules ['luatex-math'] = {
version = 1.001,
comment = "companion to luatex-math.tex",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
local gaps = {
[0x1D455] = 0x0210E,
[0x1D49D] = 0x0212C,
[0x1D4A0] = 0x02130,
[0x1D4A1] = 0x02131,
[0x1D4A3] = 0x0210B,
[0x1D4A4] = 0x02110,
[0x1D4A7] = 0x02112,
[0x1D4A8] = 0x02133,
[0x1D4AD] = 0x0211B,
[0x1D4BA] = 0x0212F,
[0x1D4BC] = 0x0210A,
[0x1D4C4] = 0x02134,
[0x1D506] = 0x0212D,
[0x1D50B] = 0x0210C,
[0x1D50C] = 0x02111,
[0x1D515] = 0x0211C,
[0x1D51D] = 0x02128,
[0x1D53A] = 0x02102,
[0x1D53F] = 0x0210D,
[0x1D545] = 0x02115,
[0x1D547] = 0x02119,
[0x1D548] = 0x0211A,
[0x1D549] = 0x0211D,
[0x1D551] = 0x02124,
}
local function fixmath(tfmdata,key,value)
if value then
local characters = tfmdata.characters
for gap, mess in pairs(gaps) do
characters[gap] = characters[mess]
end
end
end
fonts.handlers.otf.features.register {
name = "fixmath",
description = "math font fixing",
manipulators = {
base = fixmath,
node = fixmath,
}
}
-- This emulation is experimental and work in progress. This plain support is
-- for testing only anyway. If needed disable the feature which is there mostly
-- for MS and HH (a side effect of their math project).
local emulate = true
local integrals = table.tohash { 8747, 8748, 8749, 8750, 8751, 8752, 8753, 8754,
8755, 8992, 8993, 10763, 10764, 10765, 10766, 10767, 10768, 10769, 10770, 10771,
10772, 10773, 10774, 10775, 10776, 10777, 10778, 10779, 10780 }
local italics = table.tohash { 8458, 8459, 8462, 8464, 8466, 8475, 8492, 8495,
8496, 8497, 8499, 8500, 119860, 119861, 119862, 119863, 119864, 119865, 119866,
119867, 119868, 119869, 119870, 119871, 119872, 119873, 119874, 119875, 119876,
119877, 119878, 119879, 119880, 119881, 119882, 119883, 119884, 119885, 119886,
119887, 119888, 119889, 119890, 119891, 119892, 119893, 119894, 119895, 119896,
119897, 119898, 119899, 119900, 119901, 119902, 119903, 119904, 119905, 119906,
119907, 119908, 119909, 119910, 119911, 119912, 119913, 119914, 119915, 119916,
119917, 119918, 119919, 119920, 119921, 119922, 119923, 119924, 119925, 119926,
119927, 119928, 119929, 119930, 119931, 119932, 119933, 119934, 119935, 119936,
119937, 119938, 119939, 119940, 119941, 119942, 119943, 119944, 119945, 119946,
119947, 119948, 119949, 119950, 119951, 119952, 119953, 119954, 119955, 119956,
119957, 119958, 119959, 119960, 119961, 119962, 119963, 119964, 119965, 119966,
119967, 119968, 119969, 119970, 119971, 119972, 119973, 119974, 119975, 119976,
119977, 119978, 119979, 119980, 119981, 119982, 119983, 119984, 119985, 119986,
119987, 119988, 119989, 119990, 119991, 119992, 119993, 119994, 119995, 119996,
119997, 119998, 119999, 120000, 120001, 120002, 120003, 120004, 120005, 120006,
120007, 120008, 120009, 120010, 120011, 120012, 120013, 120014, 120015, 120016,
120017, 120018, 120019, 120020, 120021, 120022, 120023, 120024, 120025, 120026,
120027, 120028, 120029, 120030, 120031, 120032, 120033, 120034, 120035, 120036,
120037, 120038, 120039, 120040, 120041, 120042, 120043, 120044, 120045, 120046,
120047, 120048, 120049, 120050, 120051, 120052, 120053, 120054, 120055, 120056,
120057, 120058, 120059, 120060, 120061, 120062, 120063, 120064, 120065, 120066,
120067, 120328, 120329, 120330, 120331, 120332, 120333, 120334, 120335, 120336,
120337, 120338, 120339, 120340, 120341, 120342, 120343, 120344, 120345, 120346,
120347, 120348, 120349, 120350, 120351, 120352, 120353, 120354, 120355, 120356,
120357, 120358, 120359, 120360, 120361, 120362, 120363, 120364, 120365, 120366,
120367, 120368, 120369, 120370, 120371, 120372, 120373, 120374, 120375, 120376,
120377, 120378, 120379, 120380, 120381, 120382, 120383, 120384, 120385, 120386,
120387, 120388, 120389, 120390, 120391, 120392, 120393, 120394, 120395, 120396,
120397, 120398, 120399, 120400, 120401, 120402, 120403, 120404, 120405, 120406,
120407, 120408, 120409, 120410, 120411, 120412, 120413, 120414, 120415, 120416,
120417, 120418, 120419, 120420, 120421, 120422, 120423, 120424, 120425, 120426,
120427, 120428, 120429, 120430, 120431, 120546, 120547, 120548, 120549, 120550,
120551, 120552, 120553, 120554, 120555, 120556, 120557, 120558, 120559, 120560,
120561, 120562, 120563, 120564, 120565, 120566, 120567, 120568, 120569, 120570,
120571, 120572, 120573, 120574, 120575, 120576, 120577, 120578, 120579, 120580,
120581, 120582, 120583, 120584, 120585, 120586, 120587, 120588, 120589, 120590,
120591, 120592, 120593, 120594, 120595, 120596, 120597, 120604, 120605, 120606,
120607, 120608, 120609, 120610, 120611, 120612, 120613, 120614, 120615, 120616,
120617, 120618, 120619, 120620, 120621, 120622, 120623, 120624, 120625, 120626,
120627, 120628, 120629, 120630, 120631, 120632, 120633, 120634, 120635, 120636,
120637, 120638, 120639, 120640, 120641, 120642, 120643, 120644, 120645, 120646,
120647, 120648, 120649, 120650, 120651, 120652, 120653, 120654, 120655, 120720,
120721, 120722, 120723, 120724, 120725, 120726, 120727, 120728, 120729, 120730,
120731, 120732, 120733, 120734, 120735, 120736, 120737, 120738, 120739, 120740,
120741, 120742, 120743, 120744, 120745, 120746, 120747, 120748, 120749, 120750,
120751, 120752, 120753, 120754, 120755, 120756, 120757, 120758, 120759, 120760,
120761, 120762, 120763, 120764, 120765, 120766, 120767, 120768, 120769, 120770,
120771 }
local function emulatelmtx(tfmdata,key,value)
if tfmdata.mathparameters and not tfmdata.emulatedlmtx then
tfmdata.fonts = { { id = 0 } }
tfmdata.type = "virtual"
tfmdata.properties.virtualized = true
end
end
fonts.handlers.otf.features.register {
name = "emulate lmtx",
description = "emulate lmtx mode",
default = emulate,
manipulators = { base = emulatelmtx },
}
local function emulatelmtx(tfmdata,key,value)
if tfmdata.mathparameters and not tfmdata.emulatedlmtx then
local targetcharacters = tfmdata.characters
local targetdescriptions = tfmdata.descriptions
local factor = tfmdata.parameters.factor
local function getllx(u)
local d = targetdescriptions[u]
if d then
local b = d.boundingbox
if b then
local llx = b[1]
if llx < 0 then
return - llx
end
end
end
return false
end
for u, c in next, targetcharacters do
local uc = c.unicode or u
if integrals[uc] then
-- skip this one
else
local accent = c.top_accent
local italic = c.italic
local width = c.width or 0
local llx = getllx(u)
local bl, br, tl, tr
if llx then
llx = llx * factor
width = width + llx
bl = - llx
tl = bl
c.commands = { { "right", llx }, { "slot", 0, u } }
if accent then
accent = accent + llx
end
end
if accent then
if italics[uc] then
c.top_accent = accent
else
c.top_accent = nil
end
end
if italic and italic ~= 0 then
width = width + italic
br = - italic
end
c.width = width
if italic then
c.italic = nil
end
if bl or br or tl or tr then
-- watch out: singular and _ because we are post copying / scaling
c.mathkern = {
bottom_left = bl and { { height = 0, kern = bl } } or nil,
bottom_right = br and { { height = 0, kern = br } } or nil,
top_left = tl and { { height = c.height or 0, kern = tl } } or nil,
top_right = tr and { { height = c.height or 0, kern = tr } } or nil,
}
end
end
end
tfmdata.fonts = { { id = 0 } }
tfmdata.type = "virtual"
tfmdata.properties.virtualized = true
tfmdata.emulatedlmtx = true
end
end
fonts.handlers.otf.features.register {
name = "emulate lmtx",
description = "emulate lmtx mode",
default = emulate,
manipulators = { base = emulatelmtx },
}
|