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
|
if not modules then modules = { } end modules ['mtx-chars'] = {
version = 1.001,
comment = "companion to mtxrun.lua",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
texmf.instance = instance -- we need to get rid of this / maybe current instance in global table
scripts = scripts or { }
scripts.chars = scripts.chars or { }
function scripts.chars.stixtomkiv(inname,outname)
if inname == "" then
logs.report("aquiring math data","invalid datafilename")
end
local f = io.open(inname)
if not f then
logs.report("aquiring math data","invalid datafile")
else
logs.report("aquiring math data","processing " .. inname)
if not outname or outname == "" then
outname = "char-mth.lua"
end
local classes = {
N = "normal",
A = "alphabetic",
D = "diacritic",
P = "punctuation",
B = "binary",
R = "relation",
L = "large",
O = "opening",
C = "closing",
F = "fence"
}
local format, concat = string.format, table.concat
local valid, done = false, { }
local g = io.open(outname,'w')
g:write([[
-- filename : char-mth.lua
-- comment : companion to char-mth.tex (in ConTeXt)
-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
-- license : see context related readme files
-- comment : generated from data file downloaded from STIX website
if not versions then versions = { } end versions['char-mth'] = 1.001
if not characters then characters = { } end
]])
g:write(format("\ncharacters.math = {\n"))
for l in f:lines() do
if not valid then
valid = l:find("AMS/TeX name")
end
if valid then
local unicode = l:sub(2,6)
if unicode:sub(1,1) ~= " " and unicode ~= "" and not done[unicode] then
local mathclass, adobename, texname = l:sub(57,57) or "", l:sub(13,36) or "", l:sub(84,109) or ""
texname, adobename = texname:gsub("[\\ ]",""), adobename:gsub("[\\ ]","")
local t = { }
if mathclass ~= "" then t[#t+1] = format("mathclass='%s'", classes[mathclass] or "unknown") end
if adobename ~= "" then t[#t+1] = format("adobename='%s'", adobename ) end
if texname ~= "" then t[#t+1] = format("texname='%s'" , texname ) end
if #t > 0 then
g:write(format("\t[0x%s] = { %s },\n",unicode, concat(t,", ")))
end
done[unicode] = true
end
end
end
if not valid then
g:write("\t-- The data file is corrupt, invalid or maybe the format has changed.\n")
logs.report("aquiring math data","problems with data table")
else
logs.report("aquiring math data","table saved in " .. outname)
end
g:write("}\n")
g:close()
f:close()
end
end
scripts.chars.banner_utf_1 = [[
% filename : enco-utf.tex
% comment : generated by mtxrun --script chars --utf
% author : Hans Hagen, PRAGMA-ADE, Hasselt NL
% copyright: PRAGMA ADE / ConTeXt Development Team
% license : see context related readme files
\ifx\setcclcucx\undefined
\def\setcclcucx #1 #2 #3 %
{\global\catcode"#1=11
\global\lccode "#1="#2
\global\uccode "#1="#3 }
\fi
]]
scripts.chars.banner_utf_2 = [[
% lc/uc/catcode mappings
]]
scripts.chars.banner_utf_3 = [[
% named characters mapped onto utf (\\char is needed for accents)
]]
scripts.chars.banner_utf_4 = [[
\endinput
]]
function scripts.chars.makeencoutf()
local chartable = input.find_file(instance,"char-def.lua") or ""
if chartable ~= "" then
dofile(chartable)
if characters and characters.data then
local f = io.open("enco-utf.tex", 'w')
if f then
local char, format = unicode.utf8.char, string.format
f:write(scripts.chars.banner_utf_1)
f:write(scripts.chars.banner_utf_2)
local list = table.sortedkeys(characters.data)
local length = 0
for i=1,#list do
local code = list[i]
if code <= 0xFFFF then
local chr = characters.data[code]
local cc = chr.category
if cc == 'll' or cc == 'lu' or cc == 'lt' then
if not chr.lccode then chr.lccode = code end
if not chr.uccode then chr.uccode = code end
f:write(format("\\setcclcucx %04X %04X %04X %% %s\n",code,chr.lccode,chr.uccode,chr.description))
end
if #(chr.contextname or "") > length then
length = #chr.contextname
end
end
end
f:write(scripts.chars.banner_utf_3)
for i=1,#list do
local code = list[i]
if code > 0x5B and code <= 0xFFFF then
local chr = characters.data[code]
if chr.contextname then
local ch = char(code)
--~ if ch:find("[~#$%%^&{}\\]") then
f:write(format("\\def\\%s{\\char\"%04X } %% %s: %s\n", chr.contextname:rpadd(length," "), code, chr.description, ch))
--~ else
--~ f:write(format("\\def\\%s{%s} %% %s\n", chr.contextname:rpadd(length," "), ch,chr.description))
--~ end
end
end
end
f:write(scripts.chars.banner_utf_4)
f:close()
end
end
end
end
banner = banner .. " | character tools "
messages.help = [[
--stix convert stix table to math table
--utf generate enco-utf.tex (used by xetex)
]]
if environment.argument("stix") then
local inname = environment.files[1] or ""
local outname = environment.files[2] or ""
scripts.chars.stixtomkiv(inname,outname)
elseif environment.argument("utf") then
scripts.chars.makeencoutf()
else
input.help(banner,messages.help)
end
|