[Dev-luatex] Module searching
Heiko Oberdiek
oberdiek at uni-freiburg.de
Tue Dec 11 03:10:05 CET 2007
On Mon, Dec 10, 2007 at 11:51:28PM +0100, Hans Hagen wrote:
> Heiko Oberdiek wrote:
> > Example: There is a package "foobar" with module "foobar.hello".
> > I haven't found a solution using kpse functions.
> > kpsewhich --format=texmfscripts foobar/hello.lua
> > doesn't find the file.
>
> well, maybe you could ask for the path variable, and loop over it
* "kpsewhich --show-path-name" doesn't help much:
* It's not available in library "kpse".
* It contains unwanted stuff (!!, //, ...)
* kpse.expand_path (kpsewhich --expand-path)
does not expand extra colons:
texmf.cnf: TEXMFSCRIPTS=$TEXMF/scripts//
then
TEXMFSCRIPTS=.: kpsewhich --expand-path '$TEXMFSCRIPTS'
only returns
.
* No ls-R lookup.
> there's also luainputs
I don't see, how it could help here.
> > Perhaps a search path could be hacked by using the output of
> > kpsewhich --show-path=texmfscripts
> > and appending the module directories to each path component.
> > But:
> > * LuaTeX's kpse library doesn't have a "show_path" function.
> > * os.execute is not available in safer mode.
> > * Last but not least, a kpse function is missing for
> > searching along the modified path specification.
>
> can't you use lua for that?
Reimplementing kpse library in Lua with analyzing texmf.cnf
files, path expansion, ls-R lookup, ...?
> > * Portability among different operating systems.
> > (directory specificator, ..., LUA_DIRSEP isn't available, ...)
> >
> > Ideas?
>
> we explicitly didn't hard code these things because each user and/or
> macro package may want to do it different (the same for suffixes of lua
> files)
The other file types are covered: TeX files, tfm files, type 1 files, ...
Missing is a proper support for lua scripts.
A user/macro writer says for example:
\documentclass{article}
\usepackage{longtable}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
But he doesn't implement a search algorithm for
finding article.cls or longtable.sty or the latin modern fonts.
Also Lua has a module system, thus a user/macro writer wants to write:
\directlua0{
require("foobar.hello")
-- ...
}
without implementing, how the module is found.
Lua provides four search strategies by default.
These can be changed and exended, see the table "package.loader"
(latest Lua docu for 5.1)
> > Something like "foobar_hello.lua" isn't the best solution:
Currently I am using
TDS:scripts/foobar/foobar.hello.lua
This doesn't follow Lua's conventions (TDS:scripts/foobar/hello.lua).
But the search is easier:
function kpse.module_loader(module)
local script = module .. ".lua"
local file = kpse.find_file(script, "texmfscripts")
if file then
local loader, error = loadfile(file)
if loader then
return loader
end
return "\n\tKPSE loading error:\n" .. error
end
return "\n\tKPSE search failed"
end
table.insert(package.loaders, kpse.module_loader)
and avoids at least:
> > * It doesn't scale well, e.g. it pollutes "package.loaded".
Yours sincerely
Heiko <oberdiek at uni-freiburg.de>
More information about the dev-luatex
mailing list