Programmazione

Disegnare UML in LATEX

Quanti di voi utilizzano LATEX per i propri documenti ? Da quando ho iniziato a creare documentazioni tecniche in LATEX ho cercato di approfondire la possibilità di disegnare schemi UML direttamente con il codice LATEX. In questo articolo approfondiremo questa possibilità e le limitazioni che al momento si hanno. In questo articolo l’obiettivo non è sicuramente quello di parlare di UML, dato che il discorso è intricato più del dovuto, ma di capire se è possibile integrare i diagrammi UML con l’impaginatore per eccellenza LATEX (ecco una veloce introduzione a LATEX).

Iniziamo subito con l’affermare che è possibile integrare diagrammi UML in LATEX ovviamente con diversi livelli di difficoltà e di astrazione.

Creazione di diagrammi in programmi esterni

Il primo modo per effettuare l’integrazione richiesta è quello, più semplice, di creare i diagrammi UML in programmi esterni, come Visual Paradigm e nel documento LATEX inserirlo tramite la direttiva includegraphics:

documentclass{article}
usepackage{graphicx}
graphicspath{ {images/} }
begin{document}
The universe is immense and it seems to be homogeneous,
in a large scale, everywhere we look at.
includegraphics{universe}
end{document}

Ovviamente questo tipo di soluzione è indicata per chi utilizza costantemente un tool di sviluppo software ed ha necessità solo di far visualizzare i diagrammi UML nella documentazione.

Creazione diagrammi da codice esterno

Una seconda soluzione, che aumenta la complessità rispetto alla prima, è scrive codice UML ed importare il risultato in LATEX. Questa soluzione si chiama MetaUML  ed è un sistema che permette di generare diagrammi sempre perfetti stilisticamente. Ecco un esempio di codice che andrà compilato:

# Filename: example.mp
input metauml;
beginfig(1);
Class.A("Point")("+x: int", "+y:int")();
drawObject(A);
endfig;
end

Il comando per la compilazione è il seguente:

mptopdf example.mp

E’ possibile anche testare online la generazione del documento all’indirizzo http://metauml.denksoft.com/ dove è possibile trovare anche degli esempi. Ecco un esempio di un Composite:

Class.client("Client")()();
Class.component("Component")()
("+Operation()",
"+Add(c: Component)",
"+Remove(c: Component)",
"+GetChild(i: int)");
Class.leaf("Leaf")()("+Operation()");
Class.composite("Composite")()("+Operation()");
Note.note("for c:child", " c->Operation()");
leftToRight(50)(client, component);
leftToRight(20)(leaf, composite);
leftToRight.bottom(20)(composite, note);
.5[leaf.ne, composite.nw] = below(component.s, 50);
drawObjects(client, component, leaf, composite, note);
clink(associationUni)(client, component);
clink(inheritance)(leaf, component);
clink(inheritance)(composite, component);
link(aggregationUni)(pathStepX(component.e, composite.e + (0, 12), 50));
clink(dashedLink)(composite.methodStack.pict[0], note);
item(iAssoc)("child")(obj.w = component.e + (15, -5));

Rimane comunque la necessità di includere il file che viene generato all’interno del file LATEX.

Creazione diagrammi direttamente in LATEX

In questa sezione affrontiamo la casistica più complessa ma che, personalmemte, da maggiori soddisfazioni. Esistono vari pacchetti per effettuare questo tipo di diagrammi direttamente in LATEX:

I primi due pacchetti menzionati nell’elenco sono molto completi e complessi. Nel dettaglio pst-uml ha l’unico neo di avere la documentazione ufficiale sono in francese. Il secondo pacchetto uml invece è davvero completo e permette di gestire qualsiasi caso di diagramma da creare. E’ solo un po’ complesso e prolisso nel codice da scrivere.

Diagramma delle classi generato con il package TizK-UML in LATEX

L’ultimo pacchetto tizk-uml è quello che consiglio dato che è molto semplice da scrivere, genera dei diagrammi semplici e non completi ma con un ottima approssimazione. Il risultato grafico è davvero gradevole e pulito.

Questo è un esempio di come si può creare un oggetto classe:

begin{tikzpicture}
umlclass[x=0,y=0]{class_name}{}{}
end{tikzpicture}

Come potete vedere è davvero semplice da scrivere e il risultato è molto chiaro. La possibilità di inserire il codice direttamente in LATEX è una qualità che si può apprezzare nel corso della scrittura dei documenti in modo da avere sempre sotto controllo l’impaginazione del documento.

Ecco un esempio che ho sviluppato da poco per una guida all’architettura software che sto scrivendo:

subsection{Esempio connettore componente}
begin{figure}[h!]
begin{tikzpicture}
umlclass[width=15ex]{Client}{}{}
umlclass[x=10,width=15ex]{Server}{}{}
umluniassoc[geometry=-|,arg1=connettore,mult1=,pos1=0.4,arg2=1,mult2=1,pos2=1]{Client}{Server}
end{tikzpicture}
caption{Esempio di componenti e connettore}
end{figure}

Tikz-UML esempio

Per chi volesse approfondire l’utilizzo del TikZ-UML all’interno di LATEX è possibile visionare la documentazione ufficiale Manuale .

Conclusione

Devo comunque segnalare che nella documentazione di TikZ-UML non compare assolutamente un sistema per la generazione di activity diagram molto utili per analizzare come gli elementi rispondono agli eventi esterni. Purtroppo al momento non ho trovato un valido pacchetto LATEX per la generazione di questo tipo di diagrammi. Questo articolo introduttivo fa capire le possibilità infinite offerte da LATEX. Nei prossimi articoli approfondiremo il discorso sui documenti scritti con LATEX.

Published by
Domenico Biancardi