summaryrefslogtreecommitdiff
path: root/tex/generic/context/luatex/luatex-math.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/generic/context/luatex/luatex-math.lua')
-rw-r--r--tex/generic/context/luatex/luatex-math.lua154
1 files changed, 153 insertions, 1 deletions
diff --git a/tex/generic/context/luatex/luatex-math.lua b/tex/generic/context/luatex/luatex-math.lua
index c316182ba..2696bd961 100644
--- a/tex/generic/context/luatex/luatex-math.lua
+++ b/tex/generic/context/luatex/luatex-math.lua
@@ -33,7 +33,6 @@ local gaps = {
[0x1D551] = 0x02124,
}
-
local function fixmath(tfmdata,key,value)
if value then
local characters = tfmdata.characters
@@ -51,3 +50,156 @@ fonts.handlers.otf.features.register {
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 },
+}