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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
|
%D \module
%D [ file=s-mat-10.mkiv, % was: s-fnt-25
%D version=2009.01.25,
%D title=\CONTEXT\ Style File,
%D subtitle=Math Glyph Checking,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
%D This base module will be cleaned up and extended.
\unexpanded\def\enableshowmathfontvirtual
{\ctxlua{fonts.constructors.autocleanup=false}}
\unexpanded\def\showmathfontcharacters
{\dodoubleempty\doshowmathfontcharacters}
\def\doshowmathfontcharacters[#1][#2]%
{\begingroup
\dontcomplain
\doifelsenothing{#1}
{\definedfont[MathRoman*math-text]}
{\definedfont[#1]}%
\doifelsenothing{#2}
{\ctxlua{document.showmathfont(font.current())}}
{\def\dodoshowmathfontcharacters##1{\ctxlua{document.showmathfont(font.current(),##1)}}%
\processcommalist[#2]\dodoshowmathfontcharacters}%
\endgroup}
% the interface might (and will) change
\let\startmathfontlist \relax
\let\stopmathfontlist \relax
\let\mathfontlistreference \gobbleoneargument
\let\startmathfontlistentry \relax
\let\stopmathfontlistentry \relax
\let\mathfontlistentryhexdectit \gobblethreearguments
\let\mathfontlistentrywdhtdpic \gobblefourarguments
\let\mathfontlistentryresource \gobbleoneargument
\let\startmathfontlistnext \relax
\let\mathfontlistnextentry \gobblethreearguments
\let\mathfontlistnextcycle \gobbleonearguments
\let\stopmathfontlistnext \relax
\let\startmathfontlisthvariants \relax
\let\mathfontlisthvariantsentry \gobblethreearguments
\let\stopmathfontlisthvariants \relax
\let\startmathfontlistvvariants \startmathfontlisthvariants
\let\mathfontlistvvariantsentry \mathfontlisthvariantsentry
\let\stopmathfontlistvvariants \stopmathfontlisthvariants
\let\mathfontlistbetweennextandvariants\relax
\let\startmathfontlistentryclassspec \relax
\let\stopmathfontlistentryclassspec \relax
\let\mathfontlistentryclassname \gobbletwoarguments
\let\mathfontlistentrysymbol \gobbletwoarguments
\let\startmathfontlookupvariants \relax
\let\stopmathfontlookupvariants \relax
\let\mathfontlookupvariant \gobblefourarguments
\startluacode
local concat = table.concat
local lower = string.lower
local utfchar = utf.char
local round = math.round
local fontdata = fonts.hashes.identifiers
local chardata = characters.data
local no_description = "no description, private to font"
local limited = true
local fillinthegaps = true
local upperlimit = 0x0007F
local upperlimit = 0xF0000
local f_unicode = string.formatters["%U"]
local f_slot = string.formatters["%s/%0X"]
function document.showmathfont(id,slot)
local tfmdata = fontdata[id]
local characters = tfmdata.characters
local descriptions = tfmdata.descriptions
local resources = tfmdata.resources
local lookuptypes = resources.lookuptypes
local virtual = tfmdata.properties.virtualized
local names = { }
local gaps = mathematics.gaps
local sorted = { }
if slot then
sorted = { slot }
elseif fillinthegaps then
sorted = table.keys(characters)
for k, v in next, gaps do
if characters[v] then
sorted[#sorted+1] = k
end
end
table.sort(sorted)
else
sorted = table.sortedkeys(characters)
end
if virtual then
for k, v in ipairs(tfmdata.fonts) do
local id = v.id
local name = fontdata[id].properties.name
names[k] = (name and file.basename(name)) or id
end
end
context.startmathfontlist()
for _, unicode in next, sorted do
if not limited or unicode < upperlimit then
local code = gaps[unicode] or unicode
local char = characters[code]
local desc = descriptions[code]
local info = chardata[code]
if char then
local next_sizes = char.next
local v_variants = char.vert_variants
local h_variants = char.horiz_variants
local commands = char.commands
local slookups = desc and desc.slookups
local mlookups = desc and desc.mlookups
local mathclass = info.mathclass
local mathspec = info.mathspec
local mathsymbol = info.mathsymbol
local description = info.description or no_description
context.startmathfontlistentry()
context.mathfontlistreference(f_unicode(unicode))
context.mathfontlistentryhexdectit(f_unicode(code),code,lower(description))
context.mathfontlistentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0))
if virtual and commands then
local t = { }
for i=1,#commands do
local ci = commands[i]
if ci[1] == "slot" then
local fnt, idx = ci[2], ci[3]
t[#t+1] = f_slot(names[fnt] or fnt,idx)
end
end
if #t > 0 then
context.mathfontlistentryresource(concat(t,", "))
end
end
if mathclass or mathspec then
context.startmathfontlistentryclassspec()
if mathclass then
context.mathfontlistentryclassname(mathclass,info.mathname or "no name")
end
if mathspec then
for i=1,#mathspec do
local mi = mathspec[i]
context.mathfontlistentryclassname(mi.class,mi.name or "no name")
end
end
context.stopmathfontlistentryclassspec()
end
if mathsymbol then
context.mathfontlistentrysymbol(f_unicode(mathsymbol),mathsymbol)
end
if next_sizes then
local n, done = 0, { }
context.startmathfontlistnext()
while next_sizes do
n = n + 1
if done[next_sizes] then
context.mathfontlistnextcycle(n)
break
else
done[next_sizes] = true
context.mathfontlistnextentry(n,f_unicode(next_sizes),next_sizes)
next_sizes = characters[next_sizes]
v_variants = next_sizes.vert_variants or v_variants
h_variants = next_sizes.horiz_variants or h_variants
if next_sizes then
next_sizes = next_sizes.next
end
end
end
context.stopmathfontlistnext()
if h_variants or v_variants then
context.mathfontlistbetweennextandvariants()
end
end
if h_variants then
context.startmathfontlisthvariants()
for i=1,#h_variants do -- we might go top-down in the original
local vi = h_variants[i]
context.mathfontlisthvariantsentry(i,f_unicode(vi.glyph),vi.glyph)
end
context.stopmathfontlisthvariants()
elseif v_variants then
context.startmathfontlistvvariants()
for i=1,#v_variants do
local vi = v_variants[#v_variants-i+1]
context.mathfontlistvvariantsentry(i,f_unicode(vi.glyph),vi.glyph)
end
context.stopmathfontlistvvariants()
end
if slookups or mlookups then
local variants = { }
if slookups then
for lookupname, lookupdata in next, slookups do
local lookuptype = lookuptypes[lookupname]
if lookuptype == "substitution" then
variants[lookupdata] = "sub"
elseif lookuptype == "alternate" then
for i=1,#lookupdata do
variants[lookupdata[i]] = "alt"
end
end
end
end
if mlookups then
for lookupname, lookuplist in next, mlookups do
local lookuptype = lookuptypes[lookupname]
for i=1,#lookuplist do
local lookupdata = lookuplist[i]
local lookuptype = lookuptypes[lookupname]
if lookuptype == "substitution" then
variants[lookupdata] = "sub"
elseif lookuptype == "alternate" then
for i=1,#lookupdata do
variants[lookupdata[i]] = "alt"
end
end
end
end
end
context.startmathfontlookupvariants()
local i = 0
for variant, lookuptype in table.sortedpairs(variants) do
i = i + 1
context.mathfontlookupvariant(i,f_unicode(variant),variant,lookuptype)
end
context.stopmathfontlookupvariants()
end
context.stopmathfontlistentry()
end
end
end
context.stopmathfontlist()
end
\stopluacode
\endinput
|