Cahiers
enberg
GUT GUT GUT
m POLYDOC : UN EXEMPLE D’APPLICATION XML POUR LA CRÉATION PERSONNALISÉE DE POLYCOPIÉS
P Michel Cubero-Castan
Cahiers GUTenberg, n 35-36 (2000), p. 133-155.
<http://cahiers.gutenberg.eu.org/fitem?id=CG_2000___35-36_133_0>
© Association GUTenberg, 2000, tous droits réservés.
L’accès aux articles des Cahiers GUTenberg (http://cahiers.gutenberg.eu.org/),
implique l’accord avec les conditions générales
d’utilisation (http://cahiers.gutenberg.eu.org/legal.html).
Toute utilisation commerciale ou impression systématique
est constitutive d’une infraction pénale. Toute copie ou impression
de ce fichier doit contenir la présente mention de copyright.
PolyDoc : un exemple d'application
XML pour la création personnalisée de
polycopiés
MichelCubero-Castan
InstitutNationaldesSciences Appliquées deToulouse
Départementde Génie Electrique etInformatique
Michel.Cubero-Castan@insa-tlse.fr
Résumé
LeDocumentObjectModel(DOM)deW3Cestunenormequispé-
cieuneAPIpermettantd'eectuerdesopérationsdecréation,demodi-
cationoudeconsultationdesélémentsd'undocumentXMLreprésenté
sous forme arborescente. Des implémentations du DOM existent pour
diverslangages deprogrammation,enparticulierJava.
CetarticleprésentePolyDoc,uneapplicationJavabaséesurleDOM,
et permettant la traduction d'un document XML vers HTML, L A
T
E X,
Opene-Book,...ouencoreXML(maisavecuneDTDdiérente).Atra-
versPolyDoc,nousdécrivonsunprocessus deproduction dedocuments
suivanttroisétapes:
écritureducontenudansleformatXML,
miseenformeglobalepersonnaliséeenJava,
productiondurésultatviaHTML,L A
T
E X,...
A titred'exemple, un documenttype,lachedeprogrammation,est traitéede
manièredétaillée.
1. Introduction
Souvent,lorsqu'un enseignantala charged'un cours,il est amenéàpréparer
uncertainnombrededocumentsliésàcetenseignement.Lepremierpeutêtre
unechedescriptiveducourscontenantparexemplelesobjectifsdel'enseigne-
ment,le plan détaillé, lenombrede séancesouencoredes référencesversdes
ouvragesoudesressourcesliésàcetenseignement.Ledeuxièmedocumentpeut
être un polycopié du cours dont le plan est justement celui présenté dans la
chedescriptive.Ace polycopié,nouspourrionsajouterunrecueil d'exercices
tiques. Enn, l'enseignantpeutcréer destransparentspour illustreruncours
magistral.
Quelsoutils utiliserpourlaréalisationdeces documents?Avant derépondre
à cette question, essayons d'examiner quelles seraient les fonctionnalités de
l'outil idéal. Lanotiond'idéal est icipersonnelle, elleest directementliéeaux
habitudes del'utilisateur.Pourl'auteurdecetarticle,voiciquelqueséléments
qu'iljugesinonnécessaires,dumoinspratiques:
séparationentre contenuet forme
partagedefragment
plusieursformatsdesortie
plusieursformatsd'entrée
personnalisation
Examinonsmaintenantces diérentspoints.
1.1. Séparation entre contenu et forme
Les utilisateursdeL A
T
E
X nenouscontredirontpas,lorsqu'onrédige undocu-
ment, ilest préférabledes'intéresser toutd'abordaucontenuavantlaforme.
D'autant plusque laforme, c'est à direla présentation durésultat, peut dé-
pendredusupportutilisé.Beaucoupdesystèmesutilisentcette approche,par
exempleparlebiaisdefeuilles destyle.
1.2. Partage de fragment
Lorsqu'onrédigeplusieursdocumentspourunmêmeenseignement,onestsou-
ventamenéàutiliserdesfragmentsd'undocumentdansunautre.Parexemple,
untransparentpourraconteniruneformulemathématique déjàprésente dans
le polycopié. Lasolution ducopier-coller, quoiquetrès simple, est loin d'être
satisfaisante : silaformule initialedoitêtre modiée, ondoitreporter lamo-
dicationdanstouslesdocumentscontenantcetteformule.Uneautresolution
estl'insertiondechier:lefragmentpartagésetrouveradansunchierséparé
qui sera inséré dans les diérents documents par une commande d'insertion.
En généralune tellecommande,sielleexiste,est globaleauniveauduchier,
c'est àdirequ'ilnepeutyavoirquel'insertionducontenu completduchier
etnonunfragment.Pourproterdecettefonctionnalité,onpeutêtreconduit
àavoirunemultitude depetitschiers,cequi n'estguèrefacileàgérer.
Danscertainscas,l'approche"unchierparfragment"n'estpaspossible.Ainsi,
dansuncoursdeprogrammation,onpeutêtreamenéàincluredanslepolyco-
pié,unepetitepartiedeprogrammepourillustrerteloutelpoint.Engénéral,
procédure répartie sur plusieurschiers. Cettediculté conduit àinsérerdu
textedanslaprogrammation,commeonlefaitdanslaprogrammationlittérale,
plutôtquel'inverse.
1.3. Plusieurs formats de sortie
Jusqu'àces dernièresannées,touslesdocuments utilisaient lepapierou assi-
milé(transparent)commesupport.L'outilL A
T
E
Xest alorsunexcellentmoyen
pourobtenirdesdocuments orantune qualité typographique dignedes pro-
fessionnelsdel'édition.
L'arrivée de nouvelles technologies (NT) amène l'enseignant à diversier les
supportsdesdocuments.Lepolycopiéseprésenterasouslaformed'uneliasse
defeuilles de papiermais aussisousforme d'unchierau formatPDF ouau
formatOpene-Bookdestinéàêtreconsultéviaunlivreélectronique.Ilenest
de même pour le recueil d'exercices. Le recueil de travaux pratiques pourra
seretrouverauformatHTML demanièreàorir, lorsdesaconsultation,les
avantages de l'hypertexte pour l'accès aux divers documents annexes qui ne
seraientaccessiblesquevialeréseau.La chedescriptiveducourspeutaussi
utiliserceformatpourautorisersaconsultationàpartird'internet.Al'ancien
transparent,nouspourronsluipréférerlarétroprojectiond'écrand'ordinateur
pourapporterplusdedynamiquedanslecours.
1.4. Plusieurs formats d'entrée
Lesnouveaux supports d'informationdeviennent deplus enplusmultimédia.
Il faut donc pouvoir intégreraisément ces médias dans le document source.
On doit pouvoirinsérerpar exemple une animationgraphique, une séquence
sonoreouvidéo,ouencoreinclureuneappliquette java.
Sansallerjusqu'aumultimédia,unesimpleillustrationdansuntextedoitpou-
voirprovenirdeplusieurssourcesdiérentessansavoiràeectuermanuellement
lesconversions nécessaires pour telou telsupport de sortie. Par exemple,on
peut produire telle illustration avec le logiciel de dessin xg et telle autre à
partirdecode PSTricksparexemple.Commepourlepartagede fragmentde
document,l'utilisateurnedoitmanipulerqu'unseulchier,lasourcedel'illus-
tration.Ilnedoitpasêtreobligédesauvegarderexplicitementsonillustration
auformatepspourêtretraitéparL A
T
E
X ,ouauformatpngpourêtrevisualisé
1.5. Personnalisation
Enn,ledernierpointetnonlemoindreatraitàlapersonnalisationdelapré-
sentationdurésultat.C'estuneaairedegoût.Chacundoitpouvoirprésenter
unrésultatsuivantsa personnalité.Un outildeproductiondedocumentsdoit
doncêtrefacilementmalléabledecepointdevue.
2. L'approche L A
T
E X
Est-ce que L A
T
E
X correspond à l'outil idéal? Examinons chacun des points
énumérésci-dessus.
2.1. Séparation entre contenu et forme
Leprincipedemacropermetàl'utilisateurdeL A
T
E
Xdes'intéresseraucontenu
avantlaforme.Letraitementdelaprésentationestreléguéàlaprogrammation
desmacrosutilisables.C'estdoncunbonpointpourL A
T
E X.
2.2. Partage de fragment
L A
T
E
X permet l'inclusion de chier dans un document grâce à la commande
\input{filename}.Cependant,l'inclusionconcerneunchiercompletet non
pas un fragment. C'est une manière de découpage de chier volumineux en
petitschiersplutôtqu'unpartagedefragment.
Pourcertainscasparticuliers,parexemplel'insertiondelisting,ilestpossible
desélectionneretd'insérerunfragmentdechierenindiquantlenumérodela
premièreligneàinsérer,ainsiquelenumérodeladernière.C'estuneméthode
quipossèdeledéfautdel'adressageabsolue:silechiercontenantlefragmentà
incluresetrouvemodié,parexempleenrajoutantunenouvelleligneaudébut
duchier,il fautmodier lesadressesde lignedanslacommanded'insertion.
Biensûr,ilestpossibledecréeruneextensiondeL A
T
E
Xréalisantcetraitement
d'insertion,maisce typedeprogrammationrelèveduT
E Xpert.
2.3. Plusieurs formats de sortie
L'utilisateurdeT
E X/L
A
T
E
Xdisposedéjàd'unepanopliedelogicielspermettant
deproduireledocumentsurdessupportsdiérentsdusupportpapier.Onpeut
ainsiutiliser, soitlatex2htmlpourlaproductiondechiersauformatHTML,
dicile(sinon trèsdicile)d'obtenir, avecces outils,unrésultatpersonnalisé
auniveaudelavisualisation dudocumentnal.
2.4. Plusieurs formats d'entrée
L A
T
E
X est principalementdédié à lapublication surpapier. Iln'est pasques-
tionicid'incluredesélémentsissusd'autresmédia.Seulsdesélémentsdetype
imagepeuventêtreutilisés.Leproblèmeicivientduformat,principalementdu
PostScriptEncapsulé (EPS),qui oblige àcréerexplicitementdes sauvegardes
de dessin sous ce format. Ici aussi, il est possible de créer une extension de
L A
T
E
X réalisantautomatiquement une telle conversion,mais, encore une fois,
celarelèveduT
E X pert.
2.5. Personnalisation
L A
T
E
X permet une personnalisation de l'apparence du résultat relativement
simple,grâceàunemultituded'extensionsdisponibles.Lemanquesefaitsentir
dèsquel'onutilisedesoutilscomplexestelsquelatex2html.
3. L'approche XML
SGML apporte une première solution à tous ces problèmes. Par la création
de nouvelles balises, il est possible de faire cohabiter, dans le même chier
source, diérents médias. De plus, il existe beaucoup d'outils permettant le
traitementdechierSGMLpourobtenirdiérentsformatssupports.Onpeut
ainsicitersgml2latex,sgml2html,sgml2text,etc.Cependant,souventcesoutils
travaillent sur des documents respectantune DTD unique sevoulant laplus
générale possible,et qui, par voie de conséquence, devient complexe. Il sut
d'examinerlaDTD deDocBook pours'enrendrecompte.
En général,pourla rédactiondesdocuments liésàun cours,l'enseignantn'a
pasbesoind'utiliserunlargeéventaildebalises,niuneDTDtropgénérale.Ce
qu'illui faut, c'est plutôt une DTD adaptée àsontexte, avec, peut-être, des
balisesspéciques.
LanormeXMLoreunesolutiontrèssatisfaisantepourcetypedetraitement.
Par son langage de balises extensible, il est possible de prendre en compte
tout type d'élément dans un document. Grâce aux feuilles de style XSL, la
traductionsimpleversd'autresformats(L A
T
E
X,HTML)est facile.L'interface
DOMpermet une manipulation pluscomplexe du documentau moyend'une
HTMLàlavolée,sil'onsouhaiteproduiredespagesenfonctiondunavigateur
utilisépourlavisualisation.
3.1. Séparation entre contenu et forme
Comme SGML, XML est unlangage de balisage.Un documentXML corres-
pondàuncontenustructurépardesbalisesassimilablesdecefaitauxmacros
de L A
T
E
X. Ilyaune parfaite séparationentrecontenuet formepuisque cette
dernièrene seradénie que parl'applicationqui traitera ledocument XML :
soituneapplicationC++ouJavaquitransformeralecontenupourluidonner
une forme grâceàl'interfaceDOM,soit une feuillede styleXSL qui fournira
lesrèglesdetransformationàappliquersurledocumentXML.
3.2. Partage de fragment
Outrel'inclusionclassiquedechiergrâceauxentitésexternes,lelangageXML
peut être enrichi d'objets de type lien (XLink) permettant, entre autres, un
partagedefragmententrechiersXML.Encoreenstadededéveloppement,il
n'existepasencoredemoteursXLinksusammentstables.Onpeuttoutefois,
via laprogrammationJavaet l'interfaceDOM, réaliserunsous ensemble des
fonctionnalitésdulienXML.
3.3. Plusieurs formats de sortie
Dufaitdelaséparationentrecontenuetforme,iln'yapasderestrictionsurles
formatsdesortiepossiblespourunmêmedocumentXML.Larecommandation
décrivantlelangagedesfeuilles de styleXSLpropose unformatintermédaire
dedescriptiondesortie:fo.Déjàdesconvertisseursdeceformatversd'autres
formatscommencentàapparaitre(parexempledefoversPDF).
3.4. Plusieurs formats d'entrée
LadénitiondulangageXMLaétéorientée,dèsledépart,pourorirunformat
d'échange de données de tout types. Par le biais des balises, on peut donc
inclure, dans un chier XML, tout type de donnée. C'est l'applicationXML
qui serachargéededirigertelle outelledonnéeversleprogrammepouvantla
3.5. Personnalisation
Unepersonnalisationdel'apparencequel'onveutdonneraurésultatpourrase
faireparl'écritured'applicationsspéciquesoudefeuillesdestylespéciques.
4. L'outil PolyDoc
L'outilPolyDocestunprogrammeJavachargédetraduireundocumentXML
soitversL A
T
E
XsoitversHTML.LechoixdeJavavientdesamodularitéetsur-
toutdesaportabilité.AjouterdenouvellesbalisesdanslaDTD dudocument
est une opération très simple. Dufait de lamodularitéde la programmation
Java,ilestpresqueaussifacilederajouterlesméthodesdetraductionassociées
àune nouvellebalise.
4.1. Un exemplede document : la che de programmation
Pourdécrirelescapacitésdel'approchePolyDoc,regardonscommentcréeret
traiteruntypededocumentsimple:lachedeprogrammation.
Lachedeprogrammationestundocumentdécrivantlaprogrammationd'un
problèmedonné. C'est un document nenécessitantpas une présentation très
élaborée;laDTDutiliséeseratrèssimple.
4.1.1. La DTD dela che deProgrammation
Unechedeprogrammationseracontituéede5élémentsdepremierniveau:
titre sanscommentaire!
auteur l'auteur de la che. Cet élément sera lui-même constitué de 4sous
élémentsindiquantrespectivementsonnom,sonprénom,sonadresseélec-
tronique,et l'adressedesapagepersonnellesur internet.
date ladatedemiseàjourdelache,constituéede3souséléments:lejour,
lemoiset l'année.
problème ladescriptiondu problèmeposé, organiséeen une suitede para-
graphes.
solution la solution du problème organisée en suite de paragraphes et de
sections, une section correspondant ici à une étape clé dans le proces-
sus de programmation. La section comprendra un titre et une suite de
paragraphes.Iln'y aurapasd'autressubdivisions.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT ficheProg (titre, auteur, date, problème, solution)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (nom, prénom, mél, siteweb)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prénom (#PCDATA)>
<!ELEMENT mél (#PCDATA)>
<!ELEMENT siteweb (#PCDATA)>
<!ELEMENT date (jour, mois, an)>
<!ELEMENT jour (#PCDATA)>
<!ELEMENT mois (#PCDATA)>
<!ELEMENT an (#PCDATA)>
<!ELEMENT problème (p*)>
<!ELEMENT solution (p*, sect*)>
<!ELEMENT sect (titreSect, p*)>
<!ELEMENT titreSect (#PCDATA)>
...
Parmi les éléments disponibles, deux ont été rassemblés par l'entité interne
xlink:
...
<!ENTITY % xlink " insertionXML | insertionFichier ">
<!ELEMENT insertionXML EMPTY>
<!ATTLIST insertionXML show CDATA #FIXED "embed">
<!ATTLIST insertionXML actuate CDATA #FIXED "auto">
<!ATTLIST insertionXML xml:link CDATA #FIXED "simple">
<!ATTLIST insertionXML href CDATA #IMPLIED>
<!ATTLIST insertionXML inline CDATA #FIXED "true">
<!ATTLIST insertionXML idref CDATA #REQUIRED>
<!ATTLIST insertionXML id ID #IMPLIED>
<!ELEMENT insertionFichier EMPTY>
<!ATTLIST insertionFichier src CDATA #REQUIRED>
<!ATTLIST insertionFichier début CDATA #IMPLIED>
<!ATTLIST insertionFichier fin CDATA #IMPLIED>
<!ATTLIST insertionFichier id ID #IMPLIED>
Lenomdel'entité,xlink,aétéchoisipourrappelerlespointeursXMLproposés
par le consortium w3. Ce ne sont pas de véritables pointeurs XML, ceux-ci
n'étantpasactuellementsupportésparlesoutilsutilisables.
Lepremier,insertionXML,correspondàunpointeurXMLtrès limité;parmi
toussesattributs,seulslesattributshrefetidrefsontutilisésparPolyDoc.
Lesautres sontlàpourpouvoirêtre utiliséspardesmoteursXLINK, lorsque
cesderniersserontdisponibles. Lefonctionnementdecet élémentest simple:
après la lecture d'un document, PolyDocremplace tous les éléments de nom
insertionXMLparl'élémentcontenu danslechierréférencéparlavaleurde
l'attributhref,et possédantunidenticateurdontlenomestceluicorrespon-
dant à la valeur de l'attribut idref. Si l'attribut href n'est pas présent, le
documentréférencéest luimême.
L'élémentinsertionFichierpermetd'insérernonpasdesélémentsXMLmais
de simples données (PCDATA : Parsed Character Data) issues d'un chier
texte(ici,unprogrammesourcejava). L'attributsrcindiquelechiersource
duquelcesdonnéesvontêtreextraites.Lesattributsdébutetfinindiquentles
marquesdélimitantlazoneàextraire(sil'attributdébutestinexistant,ledébut
delazoneestledébutduchier;l'attributfinaunfonctionnementanalogue).
Lamarquecorrespondàlachaînedecaractèresdélimitéepar"/*marque="et
"*/".
Lesélémentsrestantàdécriresontceuxcorrespondantauxparagraphesetaux
élémentscontenusdanslesparagraphes.Touscesélémentssontrassemblésdans
l'entitéinterne texteFormaté.Ils possèdenttousunattribut IDdemanièreà
pouvoirêtreréférencésparunlienXML.
...
<!ENTITY % texteFormaté "p | em | latex | java | %xlink; ">
...
L'élémentsuivantpermetdedélimiterunparagraphe:
...
<!ELEMENT p (#PCDATA | %texteFormaté; )* >
<!ATTLIST p position (centrée|aligné) "aligné">
<!ATTLIST p id ID #IMPLIED>
...
Leparagraphepeut contenirtout élémentindiqué parl'entitéinterne texte-
Formaté.L'attributpositionpermetdechoisirentreunparagraphecentréou
unparagraphealigné.
L'élémentempermet unformatagedetexte:
...
<!ELEMENT em (#PCDATA | %texteFormaté; )*>
<!ATTLIST em format (italique|gras|tty) 'italique'>
<!ATTLIST em id ID #IMPLIED>
...
L'attribut formatpermet dechoisirentre dutexte italique, grasouavec des
caractèrestélétype.
Les deux derniersélémentspermettent d'insérer dans le code XML, du code
L A
T
E
X ouducodeJava:
...
<!ELEMENT latex (#PCDATA)>
<!ATTLIST latex xml:space (default|preserve) 'preserve'>
<!ATTLIST latex id ID #IMPLIED>
<!ELEMENT java (#PCDATA|insertionFichier)*>
<!ATTLIST java xml:space (default|preserve) 'preserve'>
<!ATTLIST java id ID #IMPLIED>
4.1.2. Uneche de programmation XML
RegardonsàprésentcommentonpeutcréerledocumentXMLàpartirdecette
DTD.Nousavonschoisi,commeexempledeche,leproblèmedelarésolution
d'uneéquation duseconddegrédans l'espaceR. Laversionpapierdelache
est donnée en annexe, une versionen ligneest accessibleàl'adresse http :-
//wwwdgei.insa-tlse.fr/~castan/GUT2000.Examinons les aspects intéres-
santsdesarédaction.
Lesujet commenceparlalignesuivante :
Soitl'équationax 2
+bx+c=0.
Onconstatequ'ellecontientuneprésentationdignedecenompourl'équation
duseconddegré.LaDTD n'orantpaslespossibilitésd'écritured'expressions
mathématiques de MathML, nous devons passer par le biais de L A
T
E X pour
obteniruneprésentationcorrecte.Ledocumentseradoncrédigédelamanière
suivante :
Soit l'équation
<latex id="ax2-bx-c">$a\times x^2 + b \times x + c = 0$</latex>.
</p><p>
Ecrire un programme <em format="gras">Java</em> permettant sa
résolution dans R.
...
L'élémentlatexci-dessus contient unattribut id devaleur "ax2-bx-c".Cet
identicateur nous permettra d'utiliser,dans lasuite de lache, un élément
insertionXMLquiseraremplacéparl'élémentlatex.C'estcequiapparaitau
débutdelapartiesolutiondudocumentXML:
...
<solution>
<p position="centrée"><insertionXML idref="ax2-bx-c"/></p>
<sect>
<titreSect>Utilisation du programme</titreSect>
<p>Le programme que l'on va obtenir aura pour nom
...
Ennledocumentcontientdesextraitsd'un programmejava.Ce programme
estentièrementcontenudanslechierracine.java.Onvapouvoirrécupérer
des extraits de ce chier grâce à l'élément insertionFichier.Parexemple,
pour inclure un fragment du chier java, la deuxième section du document
contientlecodeXML suivant:
...
suivante (il convient de vérifier à ce niveau la validité des
coefficients, soit a#0).
<java> ...
<insertionFichier src="racine.java" début="etape1"
fin="etape2"/>
...
</java>
...
Lechiersourceracine.javadoitalorscontenir:
...
System.exit(0);
}
/*marque=etape1*/
double a = Float.valueOf(args[0]).doubleValue();
double b = Float.valueOf(args[1]).doubleValue();
double c = Float.valueOf(args[2]).doubleValue();
if (a==0.0) {
System.out.println("a doit etre non nul");
} else {
/* resolution dans R */
/*marque=etape2*/ double delta = b*b - 4.*a*c;
...
On peut remarquer que les commentaires relatifs aux marques sont éliminés
danslechier résultat,que cesmarques soientcellesrecherchées ounon!
4.2. Prise en compte d'une nouvelle DTD
Lasection4.1précédenteamontrécommentcommentcréeruneDTDetundo-
cumentrespectantlastructuredecetteDTD.Ilresteàexaminer,maintenant,
commentprogrammer enJava,lesméthodes et classesqui vontpermettre de
traiter de tels documents pour produire diérentsformats de sortie (HTML,
L A
T
E
X ouautre).
4.2.1. Organisation générale
Le traitement, par PolyDoc, d'un document décrit par la DTD de nom DTD
pourune production dedocumentdansun formatdenom FORMATest réalisé
parlaclassePolyDoc.DTD.FORMAT.Ainsi,pournotreexemple,nousavons
dûécrireuneclassePolyDoc.cheProg.HTMLpourproduirelaversionenligne,
et uneclassePolyDoc.cheProg.Latexpourproduirelaversionpapier:
package PolyDoc.ficheProg;
public class HTML {
org.w3c.dom.Document docXML;
...
public HTML (String nomFichierXML,
String répertoireDestination,
boolean traitementDessin) {
}
public void traitement() {
...
}
...
}
package PolyDoc.ficheProg;
public class Latex {
org.w3c.dom.Document docXML;
...
public Latex (String nomFichierXML,
String répertoireDestination,
boolean traitementDessin) {
...
}
public void traitement() {
...
}
...
}
Leconstructeurdechaqueclasseestdéniavectrois paramètres:
nomFichierXML: donne lenom duchier XML contenantle document
sourcepourceformat.Eneet,bienquelapartieXMLestcommunepour
touslesformats,lapartiedéclarationdelaDTDpeutêtrediérente(par
exemple,lecaractèreseradénipourleformatHTMLparl'entité
<!ENTITY micro "&#181;">
et pourleformatLatexparl'entité
<!ENTITY micro "<latex>$\mu$</latex>">
répertoireDestination:donnelerépertoiredanslequelleouleschiers
produitsserontcréés,
traitementDessin: indique si les diérentes images contenues dans le
chiersource doivent être produites ounon (ainsi, dans notre exemple,
cela permet d'éviter de créer les images qui correspondent à des équa-
tionsécritesenL A
T
E
X,àchaquetraitementduchierXML,demanièreà
obteniruntraitement,certeincomplet,maisplusrapide,lorsdelaphase
Un des traitements réalisés par le constructeur est la création de l'objet
docXMLconstruitàpartird'uneplateformeXML(plusieurssontdisponibles,
voir http : //www.w3.org/XML). Cet objet possède une hiérarchie arbores-
centeoùlesnoeudssontlesbalisesXML,et lesfeuilles,lesdonnéestextuelles
dudocument.
4.2.2. Méthode traitement()
La méthode public void traitement()permet la génération du ou des -
chiersrésultatsàpartirdel'objetdocXML.Parexemple,danslecasdelaclasse
PolyDoc.ficheProg.Latex,nouspourrionsavoir:
public void traitement() {
try {
String nomFichLatex =
(new File(nomFichierXML)).getName();
nomFichLatex =
nomFichLatex.substring
(0, nomFichLatex.indexOf("."));
File fichierLatex = new File(répertoireDestination,
nomFichLatex+".tex");
FileOutputStream strFich =
new FileOutputStream(fichierLatex);
WriterLatex out =
new WriterLatex(new DataOutputStream(strFich));
// Génération de l'en-tête du fichier
// Génération de la partie Problème
// Génération de la partie Solution
// Génération de la fin du fichier latex
out.close();
strFich.close();
System.out.println("Terminé");
} catch (Exception e) {
System.err.println("Problème durant la création "+
}
}
Laclasse WriterLatexest une sous-classede java.io.PrintWriterrassem-
blantdesméthodesd'usage général,commelagénérationde l'en-têted'un -
chierL A
T
E
X,pourrendrelaprogrammationpluslisible.Entreautre,cetteclasse
redénirala méthodepublic void print(String str) dejava.io.Print-
Writerdemanièreàeectuerdestransformationsdescaractèrespouvantêtre
interprétéscommedescommandesL A
T
E
X, parexemple:
'~'doitêtreremplacépar"\\verb+~+"
'$'doitêtreremplacépar"\\$"
...
UneautreméthodeWriterLatex.printLatex(String str)permettrajuste-
mentd'évitercettetransformationlorsdelaproductiondetextecontenantdes
commandesL A
T
E X .
ExaminonsmaintenantcommentprogrammerunepartiedelaméthodePoly-
Doc.ficheProg.Latex.traitement, par exemple celle qui produit la partie
solution,partiecontenantdessections:
// Génération de la partie Solution
Element racine = docXML.getDocumentElement();
Node nodeSolution = racine.getFirstChild()
.getNextSibling()
.getNextSibling()
.getNextSibling()
.getNextSibling();
printTexteFormaté(nodeSolution.getFirstChild(),
out);
NodeList lstSect =
((Element) nodeSolution)
.getElementsByTagName("sect");
for (int noSect=0; noSect<
lstSect.getLength();
noSect++) {
Node noeudSection = lstSect.item(noSect);
out.println();
out.printLatex("\\section{");
out.print(noeudSection.getFirstChild()
.getFirstChild()
out.printlnLatex("}");
printTexteFormaté(
noeudSection.getFirstChild()
.getNextSibling(),
out);
out.println();
}
La méthode getDocumentElement(),méthode standard de l'interface DOM,
permet d'obtenir la racine de l'arbre du document (c'est à dire, ici, l'élé-
mentficheProg).LesméthodesgetFirstChild()etgetNextSibling()per-
mettentd'obtenirrespectivement,lepremierélémentd'unnoeuddel'arbreet
l'élémentsuivantdemêmeniveau.Ainsi,ilestfaciled'atteindrelenoeuddela
partie solutionàpartirdelaracine,grâceàcesdeuxméthodes.
L'accès aux diérentes sections se fait àpartir de laméthode getElements-
ByTagName(String tag)qui renvoie unelistede noeudscorrespondantàdes
éléments dont le nom est donné en paramètre à la méthode. getLength()
permet alors de connaître le nombre de noeuds dans cette liste, tandis que
item(int i)permet d'obtenirlei e
noeuddelaliste.
LatransformationdugrapheencodeL A
T
E
Xestalorssimple.Elleutiliselamé-
thode printTexteFormaté(Node nd, WriterLatex out) qui traite une suc-
cessiondeparagraphes,validéeparlaDTD.RegardonslecodageJavadecette
méthode:
public void printTexteFormaté(Node nd, WriterLatex out) {
switch (nd.getNodeType()) {
case Node.CDATA_SECTION_NODE :
out.println(nd.getNodeValue());
break;
case Node.TEXT_NODE :
out.print(nd.getNodeValue());
break;
case Node.ELEMENT_NODE :
String tag = ((Element) nd).getTagName();
try {
Class[] paramètresFormels = {
Class.forName("org.w3c.dom.Element"),
Class.forName("PolyDoc.ficheProg.WriterLatex")
};
Object méthode = getClass().getMethod(
paramètresFormels);
Object[] arguments = new Object[2];
arguments[0] = nd;
arguments[1] = out;
((java.lang.reflect.Method) méthode)
.invoke(this, arguments);
} catch(Exception e) {
if (tag.equals("sect")) break;
System.out.println("Tag inconnu : "+tag);
}
}
}
Lefonctionnementdecetteméthodeestplussimplequ'iln'yparait.Unnoeud
del'arborescenceestpasséenparamètre.Sicenoeudcorrespondàunedonnée
textuelle (noeud texte ou noeud CDATA), on envoie, grâce à l'instance de
WriterLatex passée en second paramètre, le texte associée sur le chier en
coursde création.Sinon,si ce noeudest unnoeud élément,on faitappelàla
méthodedontlenomestlenomdel'élémentpréxéparlachaîne"TAG_"et
dontlesparamètressontlesmêmesqueceuxdeprintTexteFormaté.Si cette
méthoden'existepas,c'estquenousavonsatteintland'unesection(enfait
lenoeudsectionsuivant).Letraitements'arrêtealorsnormalement.
Examinons maintenant quelques unes des méthodes préxées par la chaîne
"TAG_".
4.2.3. Traitement des éléments
Lapremièreméthodequel'onvatraiterestcelle associéeàlabalisejava:
public void TAG_java(Element nd, WriterLatex out) {
out.printlnLatex("\\nopagebreak\n");
out.printlnLatex("\\begin{lstlisting}{}");
printTexteFormatéLatex(nd.getFirstChild(), out);
out.println();
out.printlnLatex("\\end{lstlisting} ");
}
Son travail est de générer le début et la n du code contenu dans la balise
(onutilise ici l'extension L A
T
E
Xlstlisting. Lasuite dutravailsera faitpar
les éléments contenus dans l'élément java grâce à la méthode printTexte-
FormatéLatex(cetteméthodeestdiérentedelaméthodeprintTexteFormaté
Examinons maintenant l'élément em qui, par rapport à l'élément précédent,
possèdeunattribut:
public void TAG_em(Element nd, WriterLatex out) {
String format = nd.getAttribute("format");
if (format.equals("italique"))
out.printLatex("{\\itshape ");
else if (format.equals("tty"))
out.printLatex("{\\ttfamily ");
else out.printLatex("{\\bfseries ");
printTexteFormaté(nd.getFirstChild(), out);
out.printLatex("}");
}
L'acquisition de la valeur de l'attribut est possible via la méthode get-
Attribute (String nom)delaclasseorg.w3c.dom.Element.Lerestesepasse
decommentaires.
4.3. Un groupement de documents PolyDoc
Nous venonsde présenter unexemplede documenttraité parPolyDoc.Nous
avonsvu audébut de cet articlequ'en général,pourunenseignementdonné,
ondoitgénérerplusieursdocuments.Parexemple,aveccetarticle,nousavons
le résuméutilisé lorsde laphasede soumission, puisl'article lui-même,enn
l'exemplecomplet développé.
Comment regrouper tous ces documents? La solution que nous avonschoisi
dans PolyDocest d'yfaireréférencedansunautredocumentXMLgrâceàla
balisedocPolyDocsuivante :
<!ELEMENT docPolyDoc (description, format*)>
<!ATTLIST docPolyDoc id ID #REQUIRED>
<!ATTLIST docPolyDoc type CDATA #REQUIRED>
<!ELEMENT description (#PCDATA)>
<!ELEMENT format EMPTY>
<!ATTLIST format type CDATA #REQUIRED>
<!ATTLIST format src CDATA #REQUIRED>
<!ATTLIST format repDst CDATA #REQUIRED>
Un élémentdocPolyDocpermet d'identierundocument traitéparPolyDoc.
L'attribut id donne l'identicateur du document tandis que l'attribut type
indiqueletypededocument(article,polycopié,présentation,...).Cetélément
peutlui-mêmecontenirunouplusieursélémentsassociésàunformatdesortie
durésultat.Chaqueélémentformatdisposedetroisattributs:
type: letypedesortie(HTML,L A
T
E
X,fo,XML, ...)
src:lechemind'accèsauchierXMLdudocument,pourleformatdésiré
resDst:lerépertoirededestinationdeschiersproduits
Parexemple,ledocumentcorrespondantàl'exempleseradésignéparl'élément
suivant:
<docPolyDoc id="idExemple"
type="ficheProg">
<description>L'exemple de l'article</description>
<format type="HTML"
src="ProgEquationHTML.xml"
repDst="/home/castan/public_html/GUT2000doc/"/>
<format type="Latex"
src="ProgEquationLatex.xml"
repDst="Latex/"/>
</docPolyDoc>
UndocumentXMLcontenantcettebalisepourraitêtreceluiquipermettrade
générerla paged'accueil dugroupede documents sur le Web. Le traitement
d'unélémentdocPolyDocseraidentiqueautraitementdelabaliseurl,balise
permettantdecréerunlienhypertextesurledocument.
L'outil PolyDocutilisera ce document "paged'accueil" pour lancer letraite-
mentde teloutelélémentdocPolyDoc,soit via uneinterfacegraphique,soit
parlalignedecommandedelancementdel'application.Ainsi,lalignedecom-
mande suivante démarrera le traitement de l'exemple pour une sortie L A
T
E X
(GUT2000doc.xmlétantlechiercontenantdesbalisesdocPolyDoc,etenpar-
ticulier,uneayantidExemplepourvaleurdel'attributid):
java PolyDoc.Main GUT2000doc.xml idExemple latex
5. Conclusion
Nousavonsvoulu montrer, grâceà unexemplesimple, commentonpeut ex-
pourtraiterfacilementundocument,ensuivantunprocessusdeproductionen
3étapes:
écritureducontenudansleformatXML,
miseenformeglobalepersonnaliséeenJava,
productiondurésultatviaHTML, L A
T
E X,...
Une approchecommecelledePolyDocne rejettedoncpasl'énormecontribu-
tion de la communauté T
E X/L
A
T
E
X , mais peut correspondre àune évolution
naturelle commece futlecaspourL A
T
E
X visàvisdeT
E X.
Laversionen ligne decetarticleestaccessible àl'adresse
http ://wwwdgei.insa-tlse.fr/~castan/GUT2000doc/index.html
L'outil PolyDocestaccessible àl'adresse
http ://wwwdgei.insa-tlse.fr/~castan/PolyDoc/index.html
Des exemples de documentsgénérés avec PolyDoc sontaccessibles àl'adresse
http ://wwwdgei.insa-tlse.fr/~castan/Enseignements/index.html
Appendix
Résolution d'une équation du second degré
MichelCubero-Castan
c
Cubero-Castan
Soitl'équationax 2
+bx+c=0.EcrireunprogrammeJava permettant
sarésolutiondansR.
Rappel:lessolutionssontdonnéesparlaformule b
p
b 2
4ac
2a
Solution
ax 2
+bx+c=0
1. Utilisation du programme
Leprogrammequel'onvaobteniraurapournomracine.Lesvaleursdescoef-
cientsserontdonnéessurlalignedelancementduprogramme. Parexemple,
sionveutrésoudrel'équation x 2
7x+12:25=0
onutiliseralalignedecommande:
java racine 1 -7 +12.25
Onsecontenterad'écrireuneseuleméthode,laméthodemain.L'aspectgénéral
duprogrammeseradonc:
/
Programme permettant de resoudre dans R une equation du
second degre ax2+bx+c= 0 . <br>
Les coefficients a b et c sont donnes sur la ligne de
lancement du programme: ' java racine 3 1 5' pour la
resolution de 3x2+bx+5=0.
/
public class racine {
public static void main(String [] args) {
if (args.length!=3) {
System.out.println
("usage: java racine 1 7 +12.25");
System.exit (0);
}
...
}
2. Traitement des coecients
Lesvaleursdescoecientssontfourniessousformedechaînesdecaractères.Il
fautdonclesconvertirenvaleursdetypedouble,cequisefaitendeuxétapes:
l'obtentiond'uneinstancedelaclasseFloat,puisl'obtentiond'unevaleurde
codesuivante(ilconvientdevérieràceniveaulavaliditédescoecients,soit
a#0).
...
/ on recupere les valeurs des coefficients /
double a = Float.valueOf(args [0]). doubleValue();
double b = Float.valueOf(args [1]). doubleValue();
double c = Float.valueOf(args [2]). doubleValue();
if (a==0.0) {
System.out.println("a doit etre non nul");
} else {
/ resolution dans R /
...
3. Résolution du problème
Nous pouvons maintenant résoudre le problème. Suivant la valeurde delta=
p
b 2
4ac , on obtiendra 0,1 ou 2solutionsdans R. La partie du pro-
grammeréalisantcetterésolutionest:
...
double delta = bb 4.ac;
if ( delta<0.0)
System.out.println("Pas de solution reelle !");
else if (delta==0.0)
System.out.println("U n e solution double : "
+( b/(2.a)));
else
System.out.println("D e u x solutions : "+
(( b+Math.sqrt(delta))/(2.a))+" et "+
(( b Math.sqrt(delta))/(2.a)));
}
}
}