Robitex's Blog

Ideas in the web

Trailing spaces


Deblanking

Non è affatto semplice in TeX eliminare i caratteri spazio iniziali e finali rispetto ad un testo ed immessi come argomento ad un comando. Spesso vorremmo che il comportamento sintattico di classi e pacchetti fosse appunto quello di non considerare questi caratteri spazio, così da poter scrivere il codice più liberamente.
Per esempio scrivere \cool{ il mio nome è nessuno } in modo equivalente a \cool{il mio nome è nessuno}.

Soluzione in Lua

Provate questo codice:

function deblank(s)
local bs = string.match(s, "^%s*")
local es = string.match(s, "%s*$")
return string.sub(s,#bs+1,#s-#es)
end

io.write("string:")
local ans = io.read("*line")

print("<"..ans..">","<"..deblank(ans)..">")

Si tratta di codice Lua con cui si risolve il problema utilizzando i pattern della libreria standard string. Il pattern “^%s*”, significa trova gli eventuali primi caratteri spazio della stringa, mentre quello “%s*$”, sta per trova gli eventuali ultimi blank nella stringa.
L’uso dello script è semplice: salvate il codice in un file di testo chiamato per esempio “deblank.lua” ed eseguitelo con il comando lua deblank.lua in una finestra di console. Digitando una stringa il programma la stamperà prima intatta e poi priva dei fastidiosi caratteri spazio.
Leggete se vi interessa la documentazione della libreria string di Lua a questo link.

Aggiunta del 19/12/2010:
Il codice si può ulteriormente semplificare. In effetti la domanda generale è: qual’è il pattern che restituisce la stringa depurata degli spazi iniziali e finali?
Il pattern “^%s*(.*)%s*$” non funziona perché il punto rappresenta qualsiasi carattere ed unito all’asterisco significa una qualsiasi sequenza da zero a più caratteri così il pattern non esclude i trailing spaces appartenendo al pattern di ricerca “.*”.
La soluzione è utilizzare il pattern “.-“ che significa sempre da zero a più caratteri ma la ricerca si ferma alla prima corrispondenza del pattern successivo. In altre parole, la corrispondenza è ricercata per il minimo numero di caratteri.
La funzione precedente si semplifica quindi nella seguente:

function deblank(s)
return string.match(s,"^%s*(.-)*%s*$")
end

Il pattern giusto è stato trovato e così anche è stato raggiunto l’obbiettivo iniziale.

Epilogo

La conclusione è questa: il nuovo motore tipografico luatex, è uno strumento dalle enormi potenzialità che potrà portare la qualità tipografica di TeX in innumerevoli nuovi contesti, grazie al piccolo grande linguaggio Lua.

Alla prossima…

4 risposte a “Trailing spaces

  1. Agostino 04/03/2011 alle 16:18

    Sono d’accordo con le tue conclusioni.

    • robitex 04/03/2011 alle 19:47

      Grazie Agostino,
      Disponendo di Lua, un linguaggio di alto livello generico che incorpora parecchie librerie come quella matematica e quelle per l’elaborazione del testo, gli utenti TeX saranno in grado di fare parecchie cose in un modo semplice.
      Per esempio effettuare il parsing sintattico di strutture comunque complesse per fornire all’utente un linguaggio più evoluto, flessibile ed efficiente.
      Alla fine, per un linguaggio come LaTeX quello che importa veramente per far si che l’utente sia più produttivo, è appunto, un linguaggio migliore. Ecco perché LuaTeX promette un vantaggio vero, ed in ultima analisi, una diffusione ancora maggiore di TeX.
      R.

  2. Agostino 05/03/2011 alle 17:21

    Io sarei interessato anche alla programmazione di basso livello TeX attraverso le funzioni di luaTeX. Ad esempio, mi piacerebbe poter gestire le vbox e le hbox attraverso codice lua.
    A.

    • robitex 05/03/2011 alle 17:49

      Vero. Anche questi aspetti non vanno per niente trascurati, come per esempio i nodi, ma è ancora difficile studiare LuaTeX fino a quando non ci saranno buone guide.
      A presto e Grazie.
      R.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: