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
|
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 mathprocessor = nil
local mathactions = sequencers.reset {
arguments = "target,original",
}
function fonts.constructors.assignmathparameters(original,target)
if mathactions.dirty then -- maybe use autocompile
mathprocessor = sequencers.compile(mathactions)
end
mathprocessor(original,target)
end
appendgroup(mathactions,"before") -- user
appendgroup(mathactions,"system") -- private
appendgroup(mathactions,"after" ) -- user
function mathematics.initializeparameters(target,original)
local mathparameters = original.mathparameters
if mathparameters and next(mathparameters) then
target.mathparameters = mathematics.dimensions(mathparameters)
end
end
sequencers.appendaction(mathactions,"system","mathematics.initializeparameters")
local how = {
-- RadicalKernBeforeDegree = "horizontal",
-- RadicalKernAfterDegree = "horizontal",
RadicalDegreeBottomRaisePercent = "unscaled"
}
function mathematics.scaleparameters(target,original)
if not target.properties.math_is_scaled then
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
mathparameters[name] = value
elseif h == "horizontal" then
mathparameters[name] = value * hfactor
elseif h == "vertical"then
mathparameters[name] = value * vfactor
else
mathparameters[name] = value * factor
end
end
end
target.properties.math_is_scaled = true
end
end
sequencers.appendaction(mathactions,"system","mathematics.scaleparameters")
function mathematics.checkaccentbaseheight(target,original)
local mathparameters = target.mathparameters
if mathparameters then
mathparameters.AccentBaseHeight = nil -- safeguard
end
end
sequencers.appendaction(mathactions,"system","mathematics.checkaccentbaseheight")
function mathematics.checkprivateparameters(target,original)
local mathparameters = target.mathparameters
if mathparameters then
if not mathparameters.FractionDelimiterSize then
mathparameters.FractionDelimiterSize = 0
end
if not mathparameters.FractionDelimiterDisplayStyleSize then
mathparameters.FractionDelimiterDisplayStyleSize = 0
end
end
end
sequencers.appendaction(mathactions,"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(mathactions,"system","mathematics.overloadparameters")
|