Re: Inserimento dinamico del percorso del file *.tex nel header

#41854
robitex
Amministratore del forum
    Up
    0
    Down
    ::


    Ciao,
    ho installato la libreria lua file system con la quale si può ottenere in lualatex il percorso della directory corrente.

    Il tutto è molto semplice: basta chiamare all’interno della nuova macro \directlua di LuaTeX, il codice Lua con il quale si ottiene il percorso, ma vediamo le cose una alla volta:

    Il codice Lua per stampare il path corrente è (da inserire in uno script):
    `– codice Lua:
    — caricamento libreria LuaFileSystem
    require “lfs”

    — memorizzo la stringa contenente il path
    — della directory corrente
    local cd = lfs.currentdir()
    print(“Current dir: ” .. cd”)`

    Ok. Se vogliamo utilizzarlo in un documento (Lua)LaTeX dovremo scrivere semplicemente:
    `\documentclass{minimal}

    \newcommand{\curdir}{
    \directlua{% ecco quì il codice Lua
    require “lfs”
    local cd = lfs.currentdir()
    tex.print(cd)
    }
    }

    \begin{document}
    \curdir
    \end{document}`

    Tuttavia questa semplicità è in realtà un poco più complicata per i sistemi Windows perché l’espansione della macro \curdir contenendo il carattere backslash produce un errore:
    Per esempio il percorso “C:\documenti\tesi” darebbe luogo all’espansione delle macro \Documenti e \tesi. Ciò si può evitare per esempio sostituendo i caratteri di escape con la macro \textbackslash.
    Il codice del comando diventerebbe questo:

    `\newcommand{\curdir}{
    \directlua{
    require “lfs”
    local cd = string.gsub(lfs.currentdir(),
    “\\”,
    “\\textbackslash “)
    tex.print(cd)
    }
    }`

    Abbiamo messo i doppi \\ perché in Lua in una stringa letterale definita dagli apici (doppi o semplici) il carattere \ funziona come carattere di escape ed un doppio \\ significa quindi il carattere \ stesso.
    Allora avremo potuto anche scrivere:
    `\newcommand{\curdir}{
    \directlua{
    require “lfs”
    local cd = string.gsub(lfs.currentdir(),
    [[\]],
    [[\textbackslash ]])
    tex.print(cd)
    }
    }`
    dove si è usata la notazione tra doppie parentesi quadre per specificare le stringhe, notazione che non interpreta i caratteri di escape in Lua.
    Entrambe i codici non funzionano perché in LuaTeX il codice all’interno di \directlua VIENE espanso TeXnicamente e quindi viene espanso per esempio \textbackslash dove non dovrebbe affatto essere.

    Questo serpente che si morde la coda può essere risolto inserendo la primitiva \string nel codice Lua per evitare che i token vengano espansi.
    Un codice per stampare il percorso della directory corrente in lualatex può essere questo:

    `% installare la libreria lfs e compilare con lualatex
    \documentclass{minimal}

    \newcommand{\curdir}{
    \directlua{
    require “lfs”
    local cd = string.gsub(lfs.currentdir(),
    “\string\\”,
    “\string\\textbackslash “)
    tex.print(cd)
    }
    }

    \begin{document}
    \curdir
    \end{document}
    `
    Ciao

    Go to top