Robitex's Blog

Ideas in the web

Archivi delle etichette: LuaTeX

Un simpatico effetto funzionale in LuaTeX


La domanda

A volte capita di chiedersi all’improvviso se l’idea che ci è appena balenata in mente può effettivamente esser realizzata.

Stavo esaminando alcune caratteristiche di LuaTeX quando una domanda è sorta spontanea: è possibile creare una macro che accetti una funzione matematica scritta dall’utente e la esegua su un argomento anch’esso variabile?

Si tratta quindi di far eseguire una funzione matematica definita sul momento, in pieno stile functional.

La macro dovrebbe accettare due argomenti: il primo è la funzione da usare e il secondo l’argomento numerico su cui eseguire il calcolo:

\applyfun{<funzione>}{<numero>}

Nel documento troveremo poi il risultato cercato. La cosa interessante è che il primo parametro della macro, la funzione, è concettualmente simile al secondo argomento essendo entrambi dei valori.

Per esempio, vorremmo poter scrivere:

Il quadrato di 10 è \applyfun{function (x) return x*x end}{10}!

LuaTeX della famiglia TeX

LuaTeX è un motore di composizione tipografico della gloriosa famiglia TeX. Questi programmi compilano un file di testo scritto dall’utente per fornire il corrispondente documento pdf.

Nel file di testo — detto sorgente — si adopera una sorta di linguaggio istruendo il programma alla gestione di sommari, riferimenti incrociati, titoli, eccetera.

In molti paesi opera un TUG, un TeX User Group. In Italia è attivo da 15 anni il GuIT Gruppo di utilizzatori Italiani di TeX, il cui sito può darvi tutte le informazioni necessarie.

Dimenticavo di dirvi che il sistema TeX è stato uno dei primi esempi di software libero, perciò siete ancor più liberi di usarlo per scrivere i vostri documenti.

La risposta

Ebbene la risposta è positiva! Si, è possibile e se non ci credete compilate con LuaTeX il codice seguente:

% luatex

% definizione della macro
\def\applyfun#1#2{%
\directlua{
local fun = #1
tex.sprint(fun(#2))
}}

Experimental!

\applyfun{function (x) return math.log(x)+10 end}{12}

Ok.

Il quadrato di $\pi$ vale
\applyfun{function (x) return x*x end}{3.14159}.

End job.
\bye

E mi raccomando, non provate a farlo con Word o LibreOffice…
Alla prossima.
R.

Annunci

LuaTeX and METAPOST


La libreria MPlib in LuaTeX

METAPOST, il noto linguaggio di disegno vettoriale, è stato incluso in LuaTeX sotto forma della libreria MPlib. Possiamo quindi inserire codice METAPOST direttamente in un sorgente LuaTeX.

Questa modalità, non richiede conversioni del formato d’uscita di METAPOST (.mps) ne la necessità di particolari opzioni di compilazione, mentre per procedere ancora più velocemente con l’unico passo di compilazione, basta utilizzare un editor come TeXWorks, in cui LuaTeX si avvia con un semplice click.
Da riga di comando darete invece la classica istruzione:

... alla riga di comando
... (occorre una installazione di
... TeX Live abbastanza recente)

$ luatex nomefile

Sorgente modello

In concreto, trovate di seguito il template del codice in linguaggio TeX dove si dovrà inserire il codice METAPOST tra le macro \mplibcode e \endmplibcode, con le uniche attenzioni di non lasciare in esso, ne righe vuote ne commenti con il carattere percentuale:

% source template
% LuaTeX with Metapost

\input luamplib.sty
\nopagenumbers

\mplibcode
   <codice METAPOST>
\endmplibcode
\bye

Il codice fornirà il pdf della figura che scontorneremo poi con l’utility pdfcrop (ecco perché si sopprime la numerazione di pagina), per inserire il risultato in altri documenti. Naturalmente, mutatis mutandis, potremo lavorare allo stesso modo ma con LuaLaTeX per avere a disposizione la potenza espressiva di LaTeX.

Un esempio è riportato nel seguente codice, che produce la figura successiva scaricabile come pdf.

% a drawing example

\input luamplib.sty
\nopagenumbers

\mplibcode
beginfig(1);
u := 100mm;
for a = 0 step 15 until 90:
draw origin -- u*dir(a)
  withpen pencircle scaled 2pt
  withcolor red;
endfor;
endfig;
\endmplibcode
\bye

An example of a METAPOST figure building directly in LuaTeX engine.


Non male!
Un saluto.
R.

%d blogger hanno fatto clic su Mi Piace per questo: