Plan
Présentation rapide
Quelques flashes ...
Intégration d'équations dans une
page HTML
Tutorial: saisie pas à pas d'une
équation avec l'éditeur
A propos des potentialités
...
Distribution
L'information scientifique qui circule sur Internet est en général assez mixte, c'est-à-dire composée de textes, images, schémas, tableaux, ... JavaMath participe à ce mélange en proposant la manipulation d'équations mathématiques, ceci de différentes façons:
La version actuelle possède de nombreuses potentialités, et de nombreuses fonctionnalités.
La totalité du programme a été écrit en Java, et utilise certaines idées issues du domaine de la recherche et dans lequel je participe à la réalisation d'un système d'édition d'équations général pour UNIX.
Toutes les suggestions d'additions ou de corrections sont les
bienvenues de façon à faire accroître aussi bien
la qualité que la quantité des
fonctionnalités.
Mail à : magnani@essi.fr
Les exemples qui suivent sont des applets paramétrées en mode display:
Une équation toute simple: barre de fraction, indices, symbole PI
Exposant et racine carrée ...
Constater la réduction des fontes qui s'applique aux exposants
Un sigma avec aussi réduction des fontes
Encore un sigma avec des expressions plus compliquées
Une matrice carrée ... et
Une matrice quelconque avec coloration lexicale paramétrée
Ces affichages ont été réalisés grâce au paramètre expression de l'applet. Bien qu'il soit encore en version alpha, on entrevoit un intérêt immédiat pour l'intégration d'équations dans des pages HTML.
L'applet JavaMath accepte différents paramètres liés au style d'affichage, ainsi qu'à l'entrée d'expressions.
La syntaxe standard est <PARAM NAME=... VALUE=...>.
NAME |
VALUE |
VALEUR PAR DEFAUT |
expression |
expression algébrique infixe (mode display) |
aucune, mode édition |
background |
couleur d'arrière plan de l'applet |
Java |
foreground |
couleur d'avant plan de l'applet |
Java |
selection |
couleur de la sélection (mode édition) |
couleur de l'avant plan |
identifier |
couleur des identificateurs |
couleur de l'avant plan |
number |
couleur des nombres (entiers, flottants) |
couleur de l'avant plan |
namer |
couleur des nommeurs (mode édition) |
couleur de l'avant plan |
fontName |
nom de la fonte à utiliser (Courier, ...) |
Courier |
defaultFontSize |
taille par défaut pour la fonte |
14 |
minimalFontSize |
taille minimum à utiliser pour la fonte |
8 |
fontReduce |
facteur de réduction conservatif en % |
80 |
Explications sur un exemple:
On souhaite tout simplement:
L'instruction HTML correspondante est tout simplement:
<PARAM NAME=expression
VALUE=(!matrix{cos:u&0&sin:u|0&1&0|-sin:u&0&cos:u})>
<PARAM NAME=fontName VALUE=TimesRoman>
<PARAM NAME=background VALUE=white>
<PARAM NAME=identifier VALUE=blue>
L'entrée de l'expression se fait donc de manière
infixe.
La fonte et les couleurs sont interpretées de manière
aussi simple.
Et le résultat:
Cette partie explique comment saisir une équation en mode
interractif, ce qui est la fonctionnalité
première de JavaMath.
Cette fonctionnalité complexe est d'ailleurs en version beta
par rapport a l'affichage vu précédemment
Préparatifs
On insère une applet comme cela a été décrit précédemment, sauf qu'on ne met pas le paramètre "expression". On définit cependant les couleurs souhaitées (à moins d'utiliser celles par défaut, un peu ternes), par exemple:
<PARAM NAME=background VALUE=white>
<PARAM NAME=foreground VALUE=black>
<PARAM NAME=identifier VALUE=magenta>
<PARAM NAME=number VALUE=black>
<PARAM NAME=namer VALUE=red>
<PARAM NAME=selection VALUE=blue>
Point numéro 1: modèle de saisie
Initialement l'écran présente un symbole
particulier, appelé template, qui est le symbole de
base, sans signification mathématique, et qui est
destiné à être remplacé par d'autres
symboles ayant une sémantique algébrique
précise. Chaque fois que l'on insérera un
opérateur à plusieurs opérandes, des templates
apparaîtront comme des "trous à remplir".
Toujours à l'état initial, on voit la présence
d'une barre symbolisant le curseur. Le curseur se
présente sous la forme d'une telle barre pour tous les
symboles terminaux (constantes et templates), et par un angle droit
pour les autres. En outre, le curseur peut toujours être soit
à gauche, soit à droite d'un objet quelconque, ceci
pour indiquer précisément le point où
l'insertion doit se faire.
Le rôle de l'utilisateur consiste à:
Point numéro 2 : premier aperçu par la pratique ...
On souhaite saisir une équation décrivant la norme d'un vecteur: N(x,y)=sqrt(x ^2+y ^2).
La saisie se fait très simplement. Le seul élément non trivial consiste à saisir le symbole pour la racine carrée. On utilise pour cela le principe du nommage: un point d'exclamation (!) suivi du nom de l'opérateur (sqrt), ou même seulement le début du mot car JavaMath propose un mécanisme de complétion par la touche tab (comme le shell d'unix).
Cliquer dans l'applet pour donner le focus, et entrer la séquence de touches suivantes:
N ( x , y <espace> = ! sq <tab> <entrée> x ^ 2 <espace> + y ^ 2
Voici une applet pour s'exercer:
|
Comme on le constate, la barre d'espace permet de sortir d'une zone
de parenthésage implicite.
Lors du nommage de la racine carrée, on peut constater la
correction syntaxique en cas d'erreur: le préfixe reste
rouge tant qu'il correspond à un prefixe de nom
d'opérateur. Essayer de frapper sqz pour constater cette
détection d'erreur. Et frapper sur la touche delete
pour effacer le caractère 'z' erroné: le préfixe
redevient rouge.
Autre point très important: le curseur. Celui, ici de
couleur bleue, change de forme et s'adapte à
l'opérateur sélectionné.
Essayer les déplacements topologiques intuitifs avec
les touches:
right_arrow=ctrl-p, up_arrow=ctrl-a=ctrl-q, left_arrow=ctrl-o,
down_arrow=ctrl-z=ctrl-w
Donc compatibles pavé de flèches, ou sinon clavier
azerty ou qwerty.
Par exemple, se placer sur le y et monter sur le 2.
Essayer aussi le clic souris sur un opérateur: le
curseur s'y place instantanément.
Par exemple sélectionner la racine carrée en entier en
cliquant dans sa queue à gauche.
Reste les déplacements syntaxiques, correspondants
à l'arbre de l'expression:
ctrl-right_arrow=ctrl-f, ctrl-up_arrow=ctrl-u,
ctrl-left_arrow=ctrl-b, ctrl-down_arrow=ctrl-d
Par exemple, tester ctrl-up_arrow=ctrl-u et remonter les parents
jusqu'à sélectionner toute la formule.
Enfin on aura remarqué que l'affichage lors de la saisie
est optimisé: seules les parties nécessaires sont
réaffichées lorsqu'on entre de nouveaux
opérateurs.
Point numéro 3 : l'ère des éditeurs intuitifs ...
La plupart des éditeurs actuels obligent à un usage intensif de la souris, et à des longues séquences de déplacements pour atteindre des lieus peu éloignés. Ceci est un facteur de perte de temps considérable pour la saisie.
JavaMath propose donc des fonctionnalités destinées à accroître la vitesse de saisie, dont on retiendra:
On va illustrer ces capacités sur le très court exemple suivant:
On souhaite saisir a_n=sigma i pour i allant de 0 à n.
La séquence de touches utilisant ces capacités de
JavaMath est (taper rigoureusement dans
l'applet ci-dessous):
u _ n <espace> = ! s <tab> <tab> <entrée> i ; i = 0 ; n
|
La touche espace sert comme dans le premier exemple
à sortir du parenthésage implicite de l'indice.
La tabulation permet d'éviter la frappe du mot 'sigma'
qui est long et compliqué.
Le point virgule permet de passer d'un argument au suivant
dans le sigma (de façon circulaire).
Donc aucun clic souris, aucun déplacement ... Et on a pu saisir une expression non triviale.
Toujours dans l'esprit de l'intuitivité, JavaMath propose
une deletion élaborée. Par défaut,
lorsqu'une sélection est deletée (par la touche
delete), elle est simplement remplacée par un template.
Un cas spécial se produit si l'on souhaite supprimer justement
un template. Dans ce cas, l'éditeur agit en fonction de
l'opérateur parent concerné. Par exemple, si ?
représente un template et si on le supprime dans
l'expression a+?, il ne reste que le a, le plus a été
supprimé avec le template.
Exemple: sélectionner à la souris le sigma, puis taper
+ 22, enfin supprimer le 22 puis le plus.
Point numéro 4 : la puissance de la représentation matricielle
Les matrices sont parmi les objets les plus importants à représenter. JavaMath propose donc les possibilités suivantes:
Bien entendu, absolument rien n'empêche de saisir une matrice dans une matrice ...
L'exemple qui suit permet d'exploiter ces possibilités:
Frapper la séquence de touches suivante:
!m <tab> <entrée>
|
La matrice apparaît entre parenthèses (et est utilisable dans n'importe quelle expression).
On souhaite une nouvelle ligne: frapper | et une nouvelle ligne apparaît (ce qui donne en fait un vecteur deux dimensions).
On souhaite aussi deux nouvelles colonnes: frapper & & et deux nouvelles colonnes apparaissent.
Tester les déplacements topologiques: droite, haut, gauche, bas ...
Faire en sorte de taper des nombres ou des expressions dans les slots, avec les techniques vues dans les chapitres précédents (pourquoi pas une matrice ... ou pi par !pi).
On désire maintenant supprimer la colonne du milieu: placer le curseur sur la cette colonne (ligne quelconque) et taper ctrl-c.
On désire enfin supprimer la ligne la dernière: placer le cuseur sur la dernière ligne (colonne quelconque) et taper ctrl-r.
On pourra remarquer que l'extension et la deletion de lignes/colonnes sont relatives à la matrice la plus proche du curseur.
Point numéro 5 : pour finir grandeur nature
L'utilisateur est ici libre de ses idées pour saisir l'expression suivante:
|
|
NB:
Ces caractéristiques sont partiellement issues de mon travail concernant un éditeur d'équations général sous UNIX, et ont été implémentées en Java à l'occasion du projet Internet.
Opérateurs actuellement disponibles
Flux d'entrée
Editeur syntaxique interractif et intuitif
Technologie d'affichage
Les améliorations du système JavaMath sont facilitées par la généricité des méthodes de programmation, basées au niveau syntaxique sur une partition des types d'opérateurs en catégories syntaxiques (binaire, ...), au niveau de l'affichage sur une séparation des trois domaines algèbre/calcul d'affichage/affichage, et au niveau communications (Internet) par le concept de linéarisation, i.e. sérialisation, des formules sous forme infixe codable dans une chaîne ASCII.
L'ambition établie est de finaliser cette version bêta_1 pour proposer un système sur plateforme universelle, d'architecture légère, avec possibilité de connexion au travers du réseau global Internet à d'autres systèmes d'édition ou des systèmes de calculs algébriques.
Auteur: Christophe MAGNANI - 1997 (FRANCE)
Sujet:
Plate-formes de développement: Visual J++ / AppletViewer / Windows 95 / Windows NT / Netscape 3.01 95/NT/Unix
Package (sources java et classes) à récupérer sous forme tar.gz: javamath.tar.gz
Mail à : magnani@essi.fr