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
|
if not modules then modules = { } end modules ['math-act'] = {
version = 1.001,
comment = "companion to math-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
local report_math = logs.reporter("mathematics","initializing")
local mathematics = mathematics
local sequencers = utilities.sequencers
local appendgroup = sequencers.appendgroup
local appendaction = sequencers.appendaction
local mathfontparameteractions = sequencers.new {
name = "mathparameters",
arguments = "target,original",
}
appendgroup("mathparameters","before") -- user
appendgroup("mathparameters","system") -- private
appendgroup("mathparameters","after" ) -- user
function fonts.constructors.assignmathparameters(original,target)
local runner = mathfontparameteractions.runner
if runner then
runner(original,target)
end
end
function mathematics.initializeparameters(target,original)
local mathparameters = original.mathparameters
if mathparameters and next(mathparameters) then
target.mathparameters = mathematics.dimensions(mathparameters)
end
end
sequencers.appendaction("mathparameters","system","mathematics.initializeparameters")
local how = {
-- RadicalKernBeforeDegree = "horizontal",
-- RadicalKernAfterDegree = "horizontal",
ScriptPercentScaleDown = "unscaled",
ScriptScriptPercentScaleDown = "unscaled",
RadicalDegreeBottomRaisePercent = "unscaled"
}
function mathematics.scaleparameters(target,original)
if not target.properties.math_is_scaled then
-- print("\n",target.properties.fontname)
-- print(original.mathparameters.DisplayOperatorMinHeight)
-- print(target.mathparameters.DisplayOperatorMinHeight)
local mathparameters = target.mathparameters
if mathparameters and next(mathparameters) then
local parameters = target.parameters
local factor = parameters.factor
local hfactor = parameters.hfactor
local vfactor = parameters.vfactor
for name, value in next, mathparameters do
local h = how[name]
if h == "unscaled" then
-- kept
elseif h == "horizontal" then
value = value * hfactor
elseif h == "vertical"then
value = value * vfactor
else
value = value * factor
end
-- if name == "DisplayOperatorMinHeight" then
-- report_math("f: %s, p: %s, h: %s, b: %s, a: %s",target.properties.fontname,name,h or "scaled",mathparameters[name],value)
-- end
mathparameters[name] = value
end
end
-- print(mathparameters.DisplayOperatorMinHeight)
target.properties.math_is_scaled = true
end
end
sequencers.appendaction("mathparameters","system","mathematics.scaleparameters")
function mathematics.checkaccentbaseheight(target,original)
local mathparameters = target.mathparameters
if mathparameters and mathparameters.AccentBaseHeight == 0 then
mathparameters.AccentBaseHeight = target.parameters.x_height -- needs checking
end
end
sequencers.appendaction("mathparameters","system","mathematics.checkaccentbaseheight")
function mathematics.checkprivateparameters(target,original)
local mathparameters = target.mathparameters
if mathparameters then
if not mathparameters.FractionDelimiterSize then
mathparameters.FractionDelimiterSize = 1.01 * target.parameters.size
end
if not mathparameters.FractionDelimiterDisplayStyleSize then
mathparameters.FractionDelimiterDisplayStyleSize = 2.40 * target.parameters.size
end
end
end
sequencers.appendaction("mathparameters","system","mathematics.checkprivateparameters")
function mathematics.overloadparameters(target,original)
local mathparameters = target.mathparameters
if mathparameters and next(mathparameters) then
local goodies = target.goodies
if goodies then
for i=1,#goodies do
local goodie = goodies[i]
local mathematics = goodie.mathematics
local parameters = mathematics and mathematics.parameters
if parameters then
if trace_defining then
report_math("overloading math parameters in '%s' @ %s",target.properties.fullname,target.parameters.size)
end
for name, value in next, parameters do
local tvalue = type(value)
if tvalue == "string" then
report_math("comment for math parameter '%s': %s",name,value)
else
local oldvalue = mathparameters[name]
local newvalue = oldvalue
if oldvalue then
if tvalue == "number" then
newvalue = value
elseif tvalue == "function" then
newvalue = value(oldvalue,target,original)
elseif not tvalue then
newvalue = nil
end
if trace_defining and oldvalue ~= newvalue then
report_math("overloading math parameter '%s': %s => %s",name,tostring(oldvalue),tostring(newvalue))
end
else
report_math("invalid math parameter '%s'",name)
end
mathparameters[name] = newvalue
end
end
end
end
end
end
end
sequencers.appendaction("mathparameters","system","mathematics.overloadparameters")
local function applytweaks(when,target,original)
local goodies = original.goodies
if goodies then
for i=1,#goodies do
local goodie = goodies[i]
local mathematics = goodie.mathematics
local tweaks = mathematics and mathematics.tweaks
if tweaks then
tweaks = tweaks[when]
if tweaks then
if trace_defining then
report_math("tweaking math of '%s' @ %s (%s)",target.properties.fullname,target.parameters.size,when)
end
for i=1,#tweaks do
local tweak= tweaks[i]
local tvalue = type(tweak)
if tvalue == "function" then
tweak(target,original)
end
end
end
end
end
end
end
function mathematics.tweakbeforecopyingfont(target,original)
local mathparameters = target.mathparameters -- why not hasmath
if mathparameters then
applytweaks("beforecopying",target,original)
end
end
function mathematics.tweakaftercopyingfont(target,original)
local mathparameters = target.mathparameters -- why not hasmath
if mathparameters then
applytweaks("aftercopying",target,original)
end
end
sequencers.appendaction("beforecopyingcharacters","system","mathematics.tweakbeforecopyingfont")
sequencers.appendaction("aftercopyingcharacters", "system","mathematics.tweakaftercopyingfont")
-- a couple of predefined tewaks:
local tweaks = { }
mathematics.tweaks = tweaks
function tweaks.fixbadprime(target,original)
target.characters[0xFE325] = target.characters[0x2032]
end
|