JLaTeXMath

Una libreria Java per scrivere formule e testi in LaTeXdi

Con JLaTeXMath, possiamo interagire con il linguaggio LaTeX attraverso Java e creare delle immagini contenenti frammenti di testo, grafici o formule matematiche. Per usare la libreria però è necessario conoscere qualche nozione di LaTeX.

Cos'è LaTeX

LaTeX (pronunciato "latek") è un linguaggio di markup che si usa per scrivere testi secondo la logica di composizione tipografica TEX. Viene usato principalmente in ambiti matematici, ingegnerisitici, sociologici e soprattutto universitari (di solito molte tesi di laurea e pubblicazioni scientifici sono scritte con LaTex). LaTeX nasce nel 1985, come principale metodo di utilizzo del programma di composizione tipografica TeX. Tramite l'utilizzo della classe Beamer, LaTeX oltre ai documenti stampabili può produrre delle presentazioni con la stessa grafica [1].

Uno dei punti di forza di LaTeX, tra quelli che ne ha giustificato l'ampia diffusione nel mondo accademico, è l'ottima gestione dell'impaginazione delle formule matematiche nonche' la capacità di trattare al meglio i riferimenti bibliografici, tramite il progetto gemello BibTeX. LaTeX è software libero e ne esistono versioni per tutti i sistemi operativi.

LaTeX è un sistema per scrivere documenti di alta qualità ma non è un Word Processor! Esso richiede infatti una certa competenza e sul linguaggio sono stati pubblicati svariati libri, anche piuttosto corposi. Ma lo scopo di questo articolo non è affrontare LaTeX in quanto linguaggio, quanto quello di presentare solo alcuni script che ci saranno utili al fine di programmare con JLatexMath, una libreria Java per scrivere formule matematiche (e non solo) in LaTeX.

 

 

 

Figura 1 - Il sito del progetto JLaTeXMath.

 

L'ambiente di programmazione

Andiamo sul sito internet di JLatexMath [2] e dall'area del download scarichiamo il file jlatexmath-fop-0.9.6.jar.

 

 

Figura 2 - L'area download di JLaTeXMath.

 

Inoltre dobbiamo copiare la classe Converter, che ci sarà utile per trasformare il codice TeX in PDF. Per prelevare questa classe ed inserirla nel nostro progetto java scaricare anche il file con i sorgenti, jlatexmath-src-0.9.6.zip, aprirlo e copiare Convert.java, build.xml e conf.xml nel nostro Classpath.

Dopodiche', dal sito Apache FOP [3] scarichiamo il file fop-1.0-bin.zip e, dopo averlo aperto, copiamo nella cartella del nostro progetto java i file .jar che si trovano nella cartella lib e il file fop.jar che si trova nella cartella build. Configuriamo bene il nostro classpath aggiungendo tutti i file jar e così saremo operativi.

 

 


Figura 3 - I file Apache FOP da scaricare.

Il nostro primo programma Latex: una serie di esempi

Ora che abbiamo preparato il nostro ambiente di lavoro, siamo pronti per scrivere il nostro primo programma JavaLatex. Presenteremo una serie di semplici esempi con il codice necessario e il risultato grafico ottenuto

Ciao Mondo!

Scriveremo il classico "Ciao Mondo" in formato TeX attraverso l'istruzione ext. Il risultato sarà salvato sottoforma di immagine png.

 

 

Figura 4 - Anche in questo caso, non potevamo farci mancare il classico "Ciao Mondo".

 

Ed ecco il codice:

public class Latex {
       private static String latex;
       public static void main(String[] args) {
             /* Istruzione text di latex */
             latex ="\text{Ciao Mondo}\\";
             TeXFormula formula = new TeXFormula(latex);
             TeXIcon icon = formula.createTeXIcon(TeXConstants.STYLE_DISPLAY, 20);
             icon.setInsets(new Insets(5, 5, 5, 5));
             BufferedImage image = new BufferedImage(icon.getIconWidth(),
                                         icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
             Graphics2D g2 = image.createGraphics();
             g2.setColor(Color.white);
             g2.fillRect(0,0,icon.getIconWidth(),icon.getIconHeight());
             JLabel jl = new JLabel();
             jl.setForeground(new Color(0, 0, 0));
              icon.paintIcon(jl, g2, 0, 0);
              File file = new File("codice_tex.png");
             /* salvo il risultato in una immagine png */
             try {
                    ImageIO.write(image, "png", file.getAbsoluteFile());
             } catch (IOException ex) { }
       }
}

Da notare che il comando TeX di \text{Ciao Mondo}\\; è ext{Ciao Mondo}\, dove in Java il carattere backslash ( ) per essere valido in quanto tale in una stringa deve essere raddoppiato e il doppio backslash ( \ ) in TeX significa andare a capo.

Matrice

Per scrivere una matrice in TeX, innanzi tutto bisogna usare il comando egin{pmatrix}. Ogni elemento all'interno della matrice deve essere intervallato da una & e ogni riga deve finire con \. Infine la matrice viene chiusa dal tag end{pmatrix}.

 

 

Figura 5 - Una matrice.

 

Quindi ricapitolando la struttura per scrivere una matrice è la seguente:

egin{pmatrix}e1n &e2n &..emn\ em1 ... \ ....\enm......end{pmatrix}

E questo è il codice:

/***** MATRICE *****/
latex = "\begin{pmatrix}a&b\\c&d\end{pmatrix}";

Determinante

Simile è il codice per comporre il determinante di una matrice. Questa volta anteponiamo al comando begin, il comando det e stavolta l'attributo del begin sarà bmatrix.

 

 

Figura 6 - Il determinante di una matrice

 

Notare che per mettere dei numeri a pedice si usa il comando _{} dove nelle parentesi sono racchiusi i valori a pedice.

/***** DETERMINANTE *****/
latex = "\det\begin{bmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{bmatrix}";

Lettere greche

Molto utili sono le lettere greche quando si devono scrivere testi matematici o scientifici: vediamo come fare a scrivere queste lettere in TeX.

 

 

Figura 7 - Lettere greche (e non solo).

 

Per scrivere una lettera greca è sufficiente anteporre il carattere backslash al nome della lettera, come segue: alpha, eta, gamma, delta. Stesso discorso per le lettere ebraiche aleph, eth etc.

/***** MATRICE LETTERE GRECHE *****/
latex = "\begin{pmatrix}\alpha&\beta&\gamma&\delta\\
          \aleph&\beth&\gimel&\daleth\\
          \mathfrak{A}&\mathfrak{B}&\mathfrak{C}&\mathfrak{D}\\
          \boldsymbol{\mathfrak{a}}&\boldsymbol{\mathfrak{b}}&
          \boldsymbol{\mathfrak{c}}&\boldsymbol{\mathfrak{d}}\end{pmatrix}\\";

Derivata parziale

Se vogliamo scrivere una derivata parziale dobbiamo usare il comando Delta per scrivere il Delta maiuscolo, il comando partial per scrivere il delta minuscolo e, infine, per scrivere il denominatore di una frazione usiamo fra.

 

 

Figura 8 - Ecco una derivata parziale.

 

/***** DERIVATA PARZIALE *****/
latex = "\Delta f(x,y)=\frac{\partial^2f}{\partial x^2}
                                     +\frac{\partial^2f}{\partial y^2}";

Sommatoria

La sommatoria viene descritta col comando sum. Il limite inferiore si scrive dopo il carattere underscore _, mentre quello superiore dopo il carattere accento circonflesso ^. La funzione della sommatoria è racchiusa tra parentesi graffe.

 

 

Figura 9 - La rappresentazione di una sommatoria.

 

/***** SOMMATORIA *****/
latex = "\sum\limits_{n = 1}^\infty { f(x)^n}\\";

Integrale

Anche per l'intergrale usiamo le stesse nozioni appena aprrese per la sommatoria. il comando per descrivere un integrale è int_ + limite inf + ^ + limite sup + {funzione}

 

 

Figura 10 - Integrale.

 

/***** INTEGRALE *****/
latex = "\int_a^b{f(x)\,dx} = (b - a) \\";

Integrale doppio

Il comando dell'integrale doppio è molto semplicemente il comando iint. In questo esempio abbiamo voluto aggiungere anche la freccia "sottolineata" con il comando underleftrightarrow.

 

 

Figura 11 - Integrale doppio sottolineato.

 

/***** INTEGRALE DOPPIO - SOTTOLINEATO *****/
latex = "\underleftrightarrow{\iint_{\mathds{R}^2}e^{-\left(x^2+y^2\right)}\,
         \mathrm{d}x\mathrm{d}y}";

Approssimazione, radice quadrata e riquadro

L'approssimazione che ha il simbolo della "tilde" (la "S coricata", ruotata di 90� a destra) viene descritta col comadno sim; invece la radice quadrata si ottiene con il comando sqrt. In questo esempio abbiamo voluto "esagerare" e quindi sono presenti anche il comando underset, che ci consente di creare un riquadro, e il comando fcolorbox, che ci consente di colorarlo.

 

 

Figura 12 - Il risultato del codice sottostante.

 

// /***** APPROSSIMAZIONE RIQUADRO *****/
// latex = "\fcolorbox{noir}{blue}{n!\underset{n\rightarrow+\infty}{\sim}
                        {\left(\frac{n}{e}\right)}^n\sqrt{2\pi n}}\\";

Più o meno

Si usa il  comando pm quando vogliamo scrivere il classico simbolo del "più o meno" con il segno + sovrapposto al segno -

 

 

Figura 13 - Il simbolo di "più o meno".

 

/***** PIU' O MENO *****/
latex = "{n\pm i-j}";

Prodotto vettoriale

Il prodotto vettoriale è una simbologia molto utilizzata in ambito scientifico. Per definire un vettore è necesario utilizzare il comando overrigharrow{vettore}. Inoltre per scrivere il simbolo di prodotto vettoriale (un "cuneo" con la punta verso l'alto, simile a una "V" rovesciata) viene usato il carattere wedge.

 

 

Figura 14 - Prodotto vettoriale.

 

/*****  PRODOTTO VETTORIALE *****/
latex = "\overrightarrow{u}\wedge\overrightarrow{v}";

mbox

Il comando mbox serve molto semplicemente a visualizzare una casella di testo con la stringa passata come parametro (esempio:  mbox{stringa}). Sono però possibili ulteriori effetti: se digitiamo rotatebo{angolo} prima di una mbox, questo ci permetteàa di ruotare la nostra casella di testo a seconda dell'angolo che abbiamo inserito.

 

 

Figura 15 - Una casella di testo, ruotata in incrementi di 45 gradi.

 

/***** ROTAZIONE E CASELLA DI TESTO *****/
latex = "\rotatebox{45}{\mbox{MokaByte}}\rotatebox{90}{\mbox{MokaByte}}\rotatebox{135}{
          \mbox{MokaByte}}";

reflectbox

L'istruzione
eflectbox
è molto particolare. Infatti, quando è collocata davanti a una mbox, ci permette di visualizzarere la stringa come se la vedessimo in uno specchio.

 

 

Figura 16 - L'effetto "specchio" ottenuto con
eflectbox
.

 

/***** REFLECT BOX *****/
latex = "\reflectbox{\mbox{MokaByte etyBakoM}}";

Altri tipi di box

Qui di seguito riportiamo altri esempi di "box": fbox, shadowbox, doublebox e ovalbox.

 

 

Figura 17 - Diverse tipologie di box.

 

/*****DIVERSI TIPI DI BOX *****/
String latex = "\begin{array}{cc}";
latex += "\fbox{\text{fbox con \textdbend}}&\shadowbox{\text{ shadowbox}}\cr";
latex += "\doublebox{\text{doublebox}}&\ovalbox{\text{ovalbox}}\cr";
latex += "\end{array}";

Array

Se vogliamo scrivere una colonna di elementi, o meglio un array, dobbiamo usare il comando egin{array}{c}; di seguito, ogni volta che vogliamo inserire un nuovo elemento, dobbiamo iniziare la riga col carattere & e terminarla con la sequenza di caratteri \, ossia, comer oramai avrete imparato, il comando "andare a capo". L'array viene chiuso con il comando end{array}.

 

 

Figura 18 - Ecco come appare l'array.

 

/***** ARRAY *****/
latex ="\begin{array}{c}" +
"&\mbox{\textcolor{ForestGreen}{Mokabyte}}\\";
latex += "& \mbox{elemento 1} \\";
latex += "& \mbox{elemento 2} \\";
latex += "& \mbox{elemento 3} \\";
latex += "& \mbox{elemento 4} \\";
latex += "& \mbox{elemento 5} \\";
latex += "& \mbox{elemento 6} \\";
latex += "& \mbox{elemento 7} \\";
latex += "& \mbox{elemento 8} \\";
latex += "& \mbox{elemento 9} \\";
latex += "& \mbox{elemento 10} \\";
latex += "\end{array}";

Tabella

Per creare una tabella in JLaTeXMath si usa il comando egin{array} passando come argomento tante c separate dal carattere | per indicare quante sono le colonne che vogliamo utilizzare. Inoltre viene usato come combinazione anche il comando multicolumn.

 

 

Figura 19 - Una tabella contenente un elemento grafico.

 

In questo esempio abbiamo inserito anche altri comandi:

  • Huge (serve per ingrandire una stringa di testo)
  • includegraphics (viene utilizzato quando vogliamo inserire una immagine nella nostra tabella)
  • hline (inserisce una riga orizzontale)
/***** MULTICOLONNA *****/
latex = "\begin{array}{|c|c|c|c|}
";
latex += "\multicolumn{4}{c}{\shadowbox{\text{\Huge TITOLO}}}\cr
";
latex += "\hline
";
latex += "\includegraphics{lion.png} & 
                       \includegraphics[width=3cm,interpolation=bicubic]{lion.png} & 
                       \includegraphics[angle=45,width=3cm]{lion.png} & 
                       \includegraphics[angle=160]{lion.png} \cr
";
latex += "\hline
";
latex += "\hline
";
latex += "\end{array}
";

Convertire il nostro codice TeX in altri formati

Possiamo convertire il nostro codice TeX in altri formati come oggetti di grafica vettoriale SVG, o documenti PDF, file PS o EPS. Per fare tutto ciò bastano poche righe di codice che possiamo trovare qui di seguito. Basta usare il metodo Convert.SVGTo() che prende in ingresso il file SVG, il nome del file da salvare, e il formato con quale salvarlo.

try {
       Convert.toSVG(latex, "esempio.svg", false);
       Convert.toSVG(latex, "esempio.svg", true);
       Convert.SVGTo("esempio.svg", "esempio.pdf", Convert.PDF);
       Convert.SVGTo("esempio.svg", "esempio.pdf", Convert.PDF);
       Convert.SVGTo("esempio.svg", "esempio.ps", Convert.PS);
       Convert.SVGTo("esempio.svg", "esempio.eps", Convert.EPS);
} catch (IOException ex) {}

Conclusioni

JLatexMath potrebbe diventare uno strumento straordinario se qualche programmatore di buona volontà riuscisse a riordinare le ottime idee che hanno avuto i creatori di questa libreria e ad ampliare i servizi che questa libreria può offrire. Potenzialmente è infatti un valido tool per la creazione di documentazione.

Riferimenti

[1] La voce LaTeX su Wikipedia

http://it.wikipedia.org/wiki/LaTeX

 

[2] Sito di JLatexMath

http://forge.scilab.org/index.php/p/jlatexmath/

 

[3] Sito di Apache FOP

http://xmlgraphics.apache.org/fop/

 

 

 

Condividi

Pubblicato nel numero
163 giugno 2011
Yuri Cervoni si è laureato alla facoltà di Ingegneria Informatica dell’Università “La Sapienza” di Roma nel maggio 2009 con la tesi: “Implementazione e realizzazione di un metodo per l’animazione dell’algoritmo di Dijkstra”. Dall’Aprile 2009, prima come stagista e poi come sviluppatore software, lavora nella Società degli Studi di Settore. Nel…
Ti potrebbe interessare anche