Ho esplorato i package searchers disponibili in LuaLaTeX con questo codice:
`
% !TEX program = lualatex
% stampa informazioni sui searchers predefiniti di LuaTeX
\documentclass{article}
\usepackage{luacode,booktabs}
\usepackage[landscape,margin=10pt]{geometry}
% fornisce ben 5 funzioni di searching
% la prima verifica se la libreria è già stata caricata
% la seconda cerca librerie `lua' con kpse (file luatexbase.loader.lua)
% la terza cerca nella cartella locale
% la quarta è il searcher di Lua classico o altro simile
% la quinta è quella di oberdiek che cerca tra gli script in texmf
\begin{document}
\begin{luacode*}
tex.sprint(#package.searchers)
tex.print('\\\\')
for k, v in pairs(package.searchers) do
tex.print(k)
tex.print(type(v))
tex.print('\\\\')
tex.print('\\verb='..v('luasql.sqlite3')..'=')
tex.print('\\\\')
texio.write(v('luasql.sqlite3'))
end
\end{luacode*}
\end{document}
`
Vi sono 5 searcher. Alcuni sfruttano kpathsea per cercare i file ma tutti non sono adatti per caricare librerie dinamiche tranne forse quello che nei commenti del listato ho definito predefinito.
Ho anche scritto un searcher personalizzato che dovrebbe funzionare in Linux OsX e Windows, a meno di ulteriori problemi.
Ecco il codice:
`% !TEX program = lualatex
% aggiunge un nuovo searcher
\documentclass{article}
\usepackage{luacode,booktabs}
\begin{document}
\begin{luacode*}
function my_searcher(lib)
local libname = lib:match('%.(%w+)$') or lib
local libext
if os.type == 'unix' then
libext = '.so'
else
libext = '.dll'
end
local libfile = kpse.find_file(libname..libext, 'clua')
if not libfile then
return '\n\t[my_searcher] Search failed'
end
local fn = lib:gsub('%.', '_')
local loader = package.loadlib(libfile, 'luaopen_'..fn)
if not loader then
return '\n\t[my_searcher] Loading failed'
end
return loader
end
package.searchers[#package.searchers+1] = my_searcher
local luasql = require 'luasql.sqlite3'
local env = luasql.sqlite3()
— connect to data source
con = assert (env:connect(“luasql-test”))
— retrieve a cursor
cur = assert (con:execute”SELECT name, email from people”)
— print all rows, the rows will be indexed by field names
row = cur:fetch ({}, “a”)
tex.sprint([[\begin{tabular}{@{}ll@{}}\toprule]])
tex.sprint([[Name & email \\\midrule]])
while row do
tex.sprint(-2,row.name)
tex.sprint(“&”)
tex.sprint(-2, row.email)
tex.sprint(“\\\\”)
— reusing the table of results
row = cur:fetch (row, “a”)
end
tex.sprint([[\bottomrule\end{tabular}]])
— close everything
cur:close()
con:close()
env:close()
\end{luacode*}
\end{document}
`
Caricando il nuovo searcher da un file a parte, torna a funzionare un codice tradizionale basato sulla funzione principale require().
Il searcher è sostanzialmente la soluzione che avevo trovato in precedenza integrata nel sistema dei moduli di Lua.
Con questo, se non ci sono domande o contributi, chiuderei il filone. Nei prossimi mesi la situazione potrebbe migliorare di molto, se avranno successo i progetti del team di LuaTeX di cui fa parte il nostro Luigi Scarso.
Un saluto a tutti.
R.