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
|
if not modules then modules = { } end modules ['mtx-plain'] = {
version = 1.002,
comment = "companion to mtxrun.lua",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-- Future version will use the texmf-cache/generic/formats/<engine> path
-- instead because then we can use some more of the generic context
-- initializers ... in that case we will also use the regular database
-- instead of kpse here, just like with the font database code (as that
-- one also works with kpse runtime).
-- Maybe I have to update this one to use more recent ways to run programs.
local format = string.format
local helpinfo = [[
<?xml version="1.0"?>
<application>
<metadata>
<entry name="name">mtx-plain</entry>
<entry name="detail">Plain TeX Runner</entry>
<entry name="version">1.00</entry>
</metadata>
<flags>
<category name="basic">
<subcategory>
<flag name="make"><short>create format file</short></flag>
<flag name="fonts"><short>create plain font database</short></flag>
<flag name="run"><short>process file</short></flag>
<flag name="format" value="string"><short>format name (default: luatex-plain)</short></flag>
<flag name="engine" value="string"><short>engine to use (default: luatex)</short></flag>
<flag name="jit"><short>use luajittex</short></flag>
</subcategory>
</category>
</flags>
</application>
]]
local application = logs.application {
name = "mtx-plain",
banner = "Plain TeX Runner 1.00",
helpinfo = helpinfo,
}
local report = application.report
scripts = scripts or { }
scripts.plain = scripts.plain or { }
local passed_options = table.tohash {
"utc",
"synctex",
}
local function execute(...)
local command = format(...)
report("running command %a\n",command)
statistics.starttiming()
local status = os.execute(command)
statistics.stoptiming()
report("runtime %s seconds",statistics.elapsedtime())
return status
end
local function resultof(...)
local command = format(...)
report("running command %a",command)
local result = os.resultof(command) or ""
result = string.gsub(result,"[\n\r]+","")
return result
end
function scripts.plain.make(texengine,texformat)
report("generating kpse file database")
execute("mktexlsr") -- better play safe and use this one
local fmtpathspec = resultof("kpsewhich --var-value=TEXFORMATS --engine=%s",texengine)
if fmtpathspec ~= "" then
report("using path specification %a",fmtpathspec)
fmtpathspec = resultof('kpsewhich --expand-braces="%s"',fmtpathspec)
end
if fmtpathspec ~= "" then
report("using path expansion %a",fmtpathspec)
else
report("no valid path reported, trying alternative")
-- fmtpathspec = resultof("kpsewhich --show-path=fmt --engine=%s",texengine)
if fmtpathspec ~= "" then
report("using path expansion %a",fmtpathspec)
else
report("no valid path reported, falling back to current path")
fmtpathspec = "."
end
end
fmtpathspec = string.splitlines(fmtpathspec)[1] or fmtpathspec
fmtpathspec = file.splitpath(fmtpathspec)
local fmtpath = nil
for i=1,#fmtpathspec do
local path = fmtpathspec[i]
if path ~= "." then
dir.makedirs(path)
if lfs.isdir(path) and file.is_writable(path) then
fmtpath = path
break
end
end
end
-- local fmtpath = resultof("kpsewhich --expand-path $safe-out-name=$TEXFORMATS")
if not fmtpath or fmtpath == "" then
fmtpath = "."
else
lfs.chdir(fmtpath)
end
execute('%s --ini %s \\dump',texengine,file.addsuffix(texformat,"tex"))
report("generating kpse file database")
execute("mktexlsr")
report("format %a saved on path %a",texformat,fmtpath)
end
function scripts.plain.run(texengine,texformat,filename)
local t = { }
for k, v in next, environment.arguments do
local m = passed_options[k] and "" or "mtx:"
if type(v) == "string" and v ~= "" then
v = format("--%s%s=%s",m,k,v)
elseif v then
v = format("--%s%s",m,k)
end
t[#t+1] = v
end
execute('%s --fmt=%s %s "%s"',texengine,file.removesuffix(texformat),table.concat(t," "),filename)
end
function scripts.plain.fonts()
execute('mtxrun --script fonts --reload --simple --typeone')
end
local texformat = environment.arguments.texformat or environment.arguments.format
local texengine = environment.arguments.texengine or environment.arguments.engine
if type(texengine) ~= "string" or texengine == "" then
texengine = (jit or environment.arguments.jit) and "luajittex" or "luatex"
end
if type(texformat) ~= "string" or texformat == "" then
texformat = "luatex-plain"
end
local filename = environment.files[1]
if environment.arguments.exporthelp then
application.export(environment.arguments.exporthelp,filename)
elseif environment.arguments.make then
scripts.plain.make(texengine,texformat)
elseif environment.arguments.fonts then
scripts.plain.fonts()
elseif filename then
scripts.plain.run(texengine,texformat,filename)
else
application.help()
end
|