summaryrefslogtreecommitdiff
path: root/tex/generic/context/luatex/luatex-math.lua
blob: 2696bd961f12a0787d7b9184a6bd4dcb25d401c2 (plain)
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 },
}