JavaMath

Christophe MAGNANI (1997)
Projet ESSI3 Internet SAR6

 

 

 Bienvenue sur la page de démonstration de JavaMath !

 

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


 Présentation rapide

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


Quelques flashes ...

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.


Intégration d'équations dans une page 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:


Tutorial: saisie pas à pas d'une équation avec l'éditeur

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:


A propos des potentialités ...

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.

Distribution

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