Re: LuaTeX non trova il modulo luasql.sqlite3

#93927
robitex
Amministratore del forum
    Up
    0
    Down
    ::


    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.

    Go to top