From 5d31142615a7efaf833be860e412995b42bf9c3c Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Fri, 21 Oct 2022 21:37:10 +0200 Subject: 2022-10-21 21:13:00 --- tex/generic/context/luatex/luatex-fonts-merged.lua | 23 +-- tex/generic/context/luatex/luatex-math.lua | 154 ++++++++++++++++++++- 2 files changed, 154 insertions(+), 23 deletions(-) (limited to 'tex/generic') diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 10d1591d5..e8138b736 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 2022-10-15 10:32 +-- merge date : 2022-10-21 21:11 do -- begin closure to overcome local limits and interference @@ -37982,27 +37982,6 @@ local fonts=fonts local handlers=fonts.handlers local registerotffeature=handlers.otf.features.register local registerafmfeature=handlers.afm.features.register -local function initialize(tfmdata,key,value) - local factor=tonumber(value) or 1 - for unicode,character in next,tfmdata.characters do - local olditalic=character.italic - if olditalic and olditalic~=0 then - character.width=character.width+olditalic - character.italic=0 - character.bottomright=-factor*olditalic - end - end -end -local specification={ - name="italicwidths", - description="add italic to width", - manipulators={ - base=initialize, - node=initialize, - } -} -registerotffeature(specification) -registerafmfeature(specification) local function initialize(tfmdata,value) if value then local parameters=tfmdata.parameters 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 }, +} -- cgit v1.2.3