“Stampare” tabella in LuaTeX, errore “! Misplaced \noalign”

  • Creatore
    Topic
  • #109306
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Ciao.
      Ho un report composto con LuaLaTeX nel quale è necessario produrre una tabella attraverso Lua.
      L’idea semplice è quella di usare la funzione tex.print() per inserire i token corrispondenti a un normale ambiente tabular.
      Ho realizzato un esempio minimo compilabile composto da un sorgente LuaLaTeX e da un file Lua.

      Il sorgente LuaLaTeX è:
      `% !TeX program = LuaLaTeX

      \directlua{
      mylib = require “mylib”
      }

      \def\print#1{\directlua{
      local expr = #1;
      if not expr then
      error(“Espressione non valida”)
      else
      tex.print(expr)
      end
      }}

      \documentclass{article}
      \usepackage{booktabs}

      \begin{document}
      \print{mylib.tabular(3)}

      \begin{tabular}{c}
      \toprule
      Numero\\
      \midrule
      00001\\
      00002\\
      00003\\
      \bottomrule
      \end{tabular}

      \end{document}`

      Il file Lua mylib.lua è:
      `return {
      tabular = function(row)
      local t = {[[\begin{tabular}{c}]]}
      t[#t+1] = [[\toprule]]
      t[#t+1] = [[Numero\\]]
      t[#t+1] = [[\midrule]]
      for r = 1, row do
      t[#t+1] = string.format([[%05d\\]], r)
      end
      t[#t+1] = [[\bottomrule]]
      t[#t+1] = [[\end{tabular}]]
      print(table.concat(t, “\n”))
      return table.concat(t, “\n”)
      end,
      }`

      Dovreste poter scaricare quì sotto i due file con estensione txt, cabiatela in .tex e in .lua.
      OK.
      Nel sorgente LuaLaTeX compare prima il comando \print che dovrebbe produrre la tabella che compare nella seconda parte del file.

      Perché ricevo l’errore di Misplaced \noalign, e come è possibile evitarlo?
      Grazie.
      R.

      Attachments:
      You must be logged in to view attached files.
    Visualizzazione 1 filone di risposte
    • Autore
      Risposte
      • #109307
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Quell’errore si manifesta quando metti un \…rule senza che sia preceduto da \begin{tabular}{…} o da \\

          Quindi guarda che cosa la funzione che hai definito con \directlua trascriverebbe nel file .tex e cerca dove uno di quei rule non è preceduto dall’uno o dall’altro testo.

          Non escluderei che l’errore sia nella sottosrtinga [tt]%05d\\[/tt], ma non conosco abbastanza Lua per poterlo dire con certezza.

        • #109308
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::


            Ciao Claudio.
            Esatto. L’errore è dovuto al fatto che la sequenza dei comandi non è corretta. E questo capita perché la “stampa” di token considera il carattere di ritorno a capo con un codice di categoria uguale a un qualsiasi carattere.
            Così questo carattere s’intromette tra \begin{tabular}{c} e \toprule, generando l’errore.

            Un semplice rimedio è inserire il codice senza caratteri di ritorno a capo. Nella funzione table.concate(), il primo argomento è l’array da concatenerare in una stringa in modo efficiente, e il secondo argomento opzionale è il carattere da aggiungere tra gli elementi.
            Così basta correggere: `return table.concat(t, “\n”)`
            in `return table.concat(t)`
            Occorre però fare attenzione che il carattere di ritorno a capo svolge nel codice funzione di separazione della control sequence, così è necessario inserire uno spazio bianco dopo le cs seguite da un testo, come in `t[#t+1] = [[\toprule]]`
            Il codice seguente (migliorato) è quello corretto come si è detto, per il file mylib.lua:
            `return {
            tabular = function(row)
            local t = {
            [[\begin{tabular}{c}]],
            [[\toprule ]], — <= spazio finale! [[Numero\\]], [[\midrule ]], -- <= spazio finale! } for r = 1, row do t[#t+1] = string.format([[%05d\\]], r) end t[#t+1] = [[\bottomrule]] t[#t+1] = [[\end{tabular}]] return table.concat(t) -- <= no carriage return end, }` Grazie. Un saluto. R.

        Visualizzazione 1 filone di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top