generic font loader + luaotfload: 'nodepool' (a nil value)"
I have been trying to use the newest generic font loader (luatex-fonts-merged.lua) in the context minimals with luaotfload in latex. This mostly worked with one exception: luaotfload-letterspace.lua reference a value that no longer exists: "...mf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua:73: attempt to index local 'nodepool' (a nil value)". luaotfload does local nodedirect = nodes.nuts local nodepool = nodedirect.pool local new_kern = nodepool.kern and uses new_kern here local kern_injector = function (fillup, kern) if fillup then local g = new_glue(kern) local s = getfield(g, "spec") setfield(s, "stretch", kern) setfield(s, "stretch_order", 1) return g end return new_kern(kern) end The error goes away when I add this to the fontloader (from an older version): nuts.new=direct.new -- new UF nuts.pool={} function nuts.pool.kern(k) local n=nuts.new("kern",1) setfield(n,"kern",k) return n end -- end UF nuts.getprop=nuts.getattr But I would prefer to change luaotfload-letterspace.lua to use whatever should be used to get the correct effect. Can someone tell me how to do it?? -- Ulrike Fischer http://www.troubleshooting-tex.de/
On 7/14/2017 4:39 PM, Ulrike Fischer wrote:
I have been trying to use the newest generic font loader (luatex-fonts-merged.lua) in the context minimals with luaotfload in latex.
This mostly worked with one exception: luaotfload-letterspace.lua reference a value that no longer exists:
"...mf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua:73: attempt to index local 'nodepool' (a nil value)".
luaotfload does
local nodedirect = nodes.nuts local nodepool = nodedirect.pool local new_kern = nodepool.kern
and uses new_kern here
local kern_injector = function (fillup, kern) if fillup then local g = new_glue(kern) local s = getfield(g, "spec") setfield(s, "stretch", kern) setfield(s, "stretch_order", 1) return g end return new_kern(kern) end
yes, i decided to limit the dependencies ... (also because the kern allocator was a plug outside context) you can use: local new = node.direct.new local g = new("glue") setfield(g, "stretch", kern) setfield(g, "stretch_order", 1) and forget about the spec subnode which is gone for a while now (but still faked)
The error goes away when I add this to the fontloader (from an older version):
nuts.new=direct.new -- new UF nuts.pool={} function nuts.pool.kern(k) local n=nuts.new("kern",1) setfield(n,"kern",k) return n end -- end UF nuts.getprop=nuts.getattr
But I would prefer to change luaotfload-letterspace.lua to use whatever should be used to get the correct effect. Can someone tell me how to do it??
-- ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
Am Fri, 14 Jul 2017 19:20:38 +0200 schrieb Hans Hagen:
local kern_injector = function (fillup, kern) if fillup then local g = new_glue(kern) local s = getfield(g, "spec") setfield(s, "stretch", kern) setfield(s, "stretch_order", 1) return g end return new_kern(kern) end
yes, i decided to limit the dependencies ... (also because the kern allocator was a plug outside context)
you can use:
local new = node.direct.new
local g = new("glue") setfield(g, "stretch", kern) setfield(g, "stretch_order", 1)
And what I should do about the "return new_kern(kern)"? I tried various variants and got results from no letterspacing to "invalid node type id" to " This can't happen (invalid node found in discretionary)." to a luatex crash: -- UF changed 2017-07-14 local new = node.direct.new local kern_injector = function (fillup, kern) if fillup then local g = new("glue") setfield(g, "stretch", kern) setfield(g, "stretch_order", 1) return g end --return new_kern(kern) --?? -- end -- -- Ulrike Fischer http://www.troubleshooting-tex.de/
On 7/14/2017 8:26 PM, Ulrike Fischer wrote:
Am Fri, 14 Jul 2017 19:20:38 +0200 schrieb Hans Hagen:
local kern_injector = function (fillup, kern) if fillup then local g = new_glue(kern) local s = getfield(g, "spec") setfield(s, "stretch", kern) setfield(s, "stretch_order", 1) return g end return new_kern(kern) end
yes, i decided to limit the dependencies ... (also because the kern allocator was a plug outside context)
you can use:
local new = node.direct.new
local g = new("glue") setfield(g, "stretch", kern) setfield(g, "stretch_order", 1)
And what I should do about the "return new_kern(kern)"?
local g = new("kern") setfield(g,"kern",kern)
I tried various variants and got results from no letterspacing to "invalid node type id" to " This can't happen (invalid node found in discretionary)." to a luatex crash:
you can't put glue in discs so your letterspacing code should use kerns, not glue
-- UF changed 2017-07-14 local new = node.direct.new
local kern_injector = function (fillup, kern) if fillup then local g = new("glue") setfield(g, "stretch", kern) setfield(g, "stretch_order", 1) return g end --return new_kern(kern) --?? -- end --
-- ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
Am Fri, 14 Jul 2017 20:56:15 +0200 schrieb Hans Hagen:
And what I should do about the "return new_kern(kern)"?
local g = new("kern") setfield(g,"kern",kern)
Ah. This here now worked -- UF changed 2017-07-14 local newUF = node.direct.new local kern_injector = function (fillup, kern) if fillup then local g = newUF("glue") setfield(g, "stretch", kern) setfield(g, "stretch_order", 1) return g end local g = newUF("kern") setfield(g,"kern",kern) -- return g end -- /UF Is is correct? (I'm wondering if there should be return value at the end, it worked with and without and I have no idea if it makes a difference). -- Ulrike Fischer http://www.troubleshooting-tex.de/
Am Fri, 14 Jul 2017 20:56:15 +0200 schrieb Hans Hagen:
And what I should do about the "return new_kern(kern)"?
local g = new("kern") setfield(g,"kern",kern)
Ah. This here now worked
-- UF changed 2017-07-14 local newUF = node.direct.new
local kern_injector = function (fillup, kern) if fillup then local g = newUF("glue") setfield(g, "stretch", kern) setfield(g, "stretch_order", 1) return g end local g = newUF("kern") setfield(g,"kern",kern) -- return g end -- /UF
Is is correct? (I'm wondering if there should be return value at the end, it worked with and without and I have no idea if it makes a difference).
On 7/15/2017 12:56 AM, Ulrike Fischer wrote: the return probably has to be there because (i assume) that kern or glue is injected ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
participants (2)
-
Hans Hagen
-
Ulrike Fischer