mathml

Xcas devel: interface utilisateur/user interface

Modérateur : xcasadmin

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

mathml

Message par frederic han » sam. oct. 06, 2012 8:18 am

Salut,

J'ai l'impression qu'il manque le cas _REAL dans mathml.cc

Par exemple avant case _CPLX

case _REAL:
return "<mn>"+e.print(contextptr)+"</mn>";

pour pouvoir afficher les multiprecisions.

non?
Fred

parisse
Messages : 5139
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: mathml

Message par parisse » dim. oct. 07, 2012 7:11 am

en effet, on va l'ajouter!

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mathml

Message par frederic han » mer. oct. 17, 2012 7:56 am

Bonjour,

j'ai une question, j'ai l'impression que mathml ne fait pas la difference d'affichage entre:

[[1],[2]]
et
([1],[2])

d'autre part set[3,4] affiche des crochets, ca serait mieux des {}

[5],6 me semble correct et comprehensible.


Dans dispatch.h je ne vois pas de subtype 0 pour les vecteurs, est il reserve pour les trucs entre crochets ou bien y a t'il autre chose?

Fred

parisse
Messages : 5139
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: mathml

Message par parisse » mer. oct. 17, 2012 8:23 am

Le subtype 0 est en effet le subtype des vecteurs normaux, affiches avec des crochets dans xcas.
Pour le reste, c'est Jean-Pierre Branchard qui a ecrit le code de conversion mathml, je n'ai pas regarde, mais je pense qu'il ne verra pas d'inconvenients a ce que tu l'ameliores!

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mathml

Message par frederic han » mer. oct. 17, 2012 2:00 pm

J'ai un peu teste cela pour mathml.cc:
(Ca laisse les vrai matrices avec des parentheses, et je ne mets rien pour les () vu que dans xcas c'est applati. Curieusement la confusion venait de ckmatrix qui dit oui a ([2],[3])


157,158c157,161
< if (type==_SEQ__VECT) s.append("(\" close=\")\">");
< else s.append("[\" close=\"]\">");
---
> if (type==_SEQ__VECT) s.append("\" close=\"\">");
> else {
> if (type==_SET__VECT) s.append("{\" close=\"}\">");
> else s.append("[\" close=\"]\">");
> }
1033,1034c1036,1037
< if (ckmatrix(*e._VECTptr))
< return matrix2mathml(*e._VECTptr,contextptr);
---
> if (ckmatrix(*e._VECTptr)&&e.subtype!=_SEQ__VECT)//0 ou 11 conviennent mais pas 1
> return matrix2mathml(*e._VECTptr,contextptr);

parisse
Messages : 5139
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: mathml

Message par parisse » jeu. oct. 18, 2012 6:49 am

voila, j'ai incorpore tes modifs dans le source.

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mathml

Message par frederic han » ven. nov. 09, 2012 6:25 pm

Salut,
J'ai l'impression que les tables ne sont pas gerees en mathml.

par exemple
table(1=0) fait planter qcas.

ou si quelqu'un tente: E[0]:=1; sans avoir defini E

Fred

parisse
Messages : 5139
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: mathml

Message par parisse » sam. nov. 10, 2012 11:01 am

En attendant mieux, on doit pouvoir rajouter

Code : Tout sélectionner

diff mathml.cc mathml.cc~
1048c1048
<       case _FUNC: case _MAP:
---
>       case _FUNC:

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mathml

Message par frederic han » dim. oct. 20, 2013 5:33 pm

J'ai l'impression que GF a un affichage special qui n'est pas tres aprecie par mathml.
(sous qcas ca me repond nothing_to_print_tex)
Fred

parisse
Messages : 5139
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: mathml

Message par parisse » lun. oct. 21, 2013 7:38 am

L'affichage latex n'est pas gere, et il semble etre appele par l'afficheur mathml. Je rajoute donc le support latex pour les elements de corps finis, mais je ne sais pas si ca permettra d'avoir un affichage mathml correct, il faudra peut-etre intervenir directement dans mathml.cc...

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mathml

Message par frederic han » jeu. déc. 26, 2013 10:11 am

Salut,

Actuellement, en matml les unites ne sont pas traitees et elles apparaissent sous la forme _(1,_m)
j'ai tente une petite amelioration qui me semble plus lisible:

Code : Tout sélectionner

diff --git a/../../../windows/giac-1.1.0/src/mathml.cc b/mathml.cc
index 722f84c..91f30b5 100644
--- a/../../../windows/giac-1.1.0/src/mathml.cc
+++ b/mathml.cc
@@ -437,6 +437,14 @@ namespace giac {
     return  "<mo>&VerticalBar;</mo>"+gen2mathml(e._SYMBptr->feuille,contextptr)+ "<mo>&VerticalBar;</mo>";
   }
 
+  static string mathml_printasunit(const gen e,GIAC_CONTEXT){
+     vecteur v = *e._SYMBptr->feuille._VECTptr;
+     if (v.size()!=2)
+       return "<mtext>"+e.print(contextptr)+"</mtext>";
+ 
+     return  "<msub><mrow>"+gen2mathml(eval(v[0],eval_level(contextptr),contextptr),contextptr)+"</mrow><mrow>"+gen2mathml(v[1],contextptr)+"</mrow></msub>";
+  }
+ 
 
 
   //---------------- Zone SVG  ---------------
@@ -993,6 +1001,8 @@ namespace giac {
       return mathml_printassum(e,contextptr);
     else if (e.type==_SYMB && e._SYMBptr->sommet==at_abs)
       return mathml_printasabs(e,contextptr);
+    else if (e.type==_SYMB && e._SYMBptr->sommet==at_unit)
+      return mathml_printasunit(e,contextptr);
     else
       switch (e.type){
       case _INT_: case _ZINT:                        
mathml.diff (END)
fred.

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mathml

Message par frederic han » sam. janv. 18, 2014 3:33 pm

Salut,
en mathml lorsque le gen est une string, elle etait retournee telle quelle, par exemple les message contenant & ou < disparaissaient sous qcas.
Je propose donc quelques modifs.

Il y avait aussi le probleme de GF que tu avais corrige avec du latex, avec la modif suivante ca semble marcher pour moi.

Code : Tout sélectionner

macbookito(fred)$ cat mathml.diff 
78a79,102
>   //fred
>   string string2mathml(const string & m){
>     string s=m;
>     string t="";
>     string mat[4]={"&","<",">","\n"};
>     string rep[4]={"&","<",">","</mi></mtd></mtr><mtr><mtd><mi>"};
>     //start with & before adding new ones
>     for(int siz=0;siz<4;siz++){
>     int c=0,k=-1,le=s.length();
>       while (c<le){
>         k=s.find(mat[siz],c);
>         if (k!=-1){
> 	  s.replace(k,1,rep[siz]);c=k+rep[siz].length()-1;le=le+rep[siz].length()-1;
>         }
>         else{
> 	  c=le;
>         }
>       }
>     }
>     return "<mtable columnalign=\"left\"><mtr><mtd><mi>"+s+"</mi></mtd></mtr></mtable>";
>   }
> 
> 
> 
244,245d267
< 
< 
1067c1089,1090
< 	return "<mi>"+(*e._STRNGptr)+"</mi>";
---
> 	//fred return "<mi>"+(*e._STRNGptr)+"</mi>";
> 	return string2mathml(*e._STRNGptr);
1071c1094,1095
< 	return "<mi>"+e._USERptr->texprint(contextptr)+"</mi>"; // <--------------------------- A traduire ?
---
> 	//fred: return "<mi>"+e._USERptr->texprint(contextptr)+"</mi>"; // <--------------------------- A traduire ?
> 	return string2mathml(e.print(contextptr));

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mathml

Message par frederic han » mer. févr. 26, 2014 10:56 am

Salut,
j'ai un soucis avec l'affichage des negatifs dans les puissances.

Ex:
2*(-5)^n

donne en mathml:
2 -5^n
ce qui est trompeur.

J'ai tente de rajouter des parentheses par exemple comme cela:

ligne 1036-1044 de mathml.cc

Code : Tout sélectionner

      switch (e.type){
      case _INT_: case _ZINT:
	if(is_positive(e,contextptr)){
	  return "<mn>"+e.print(contextptr)+"</mn>";
	}
	else{
	  return "<mo>(</mo><mn>"+e.print(contextptr)+"</mn><mo>)</mo>";
	}

parisse
Messages : 5139
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: mathml

Message par parisse » mer. févr. 26, 2014 11:42 am

Est-ce que ca ne risque pas d'en rajouter trop de parentheses? Et il faudrait traiter aussi les doubles, real,... J'ai plutot l'impression qu'il faudrait traiter ca en ligne 913.

frederic han
Messages : 1113
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mathml

Message par frederic han » mar. mars 11, 2014 1:03 pm

Bon j'ai regarde mathml et je me pose quelques questions pour savoir si on ne peut pas simplifier.
(Je les ai mises en commentaire dans le diff)

Avec le diff suivant je ne remarque pas de problemes.
(je n'ai pas touche au: "A revoir" le seul exemple ou je le trouve utile est un truc du genre: '1/y*(-3)'

Il y avait des incoherences, parfois * parfois &times;

Code : Tout sélectionner

197c197,200
<     if (eval(g,eval_level(contextptr),contextptr).is_constant())
---
>     //fred: sqrt(2) est constant mais pas besoin de x.
>     //if (eval(g,eval_level(contextptr),contextptr).is_constant())
>     gen gg=eval(g,eval_level(contextptr),contextptr);
>     if( (gg.type==_INT_)||(gg.type==_ZINT) || (gg.type==_REAL) || (gg.type==_DOUBLE_) )
199,200c202,205
<     else {
<       if (g.type==_SYMB) {
---
>     /* a quoi cela sert il de mettre un x dans tous ces cas?
>        else {
>        
> 	 if (g.type==_SYMB) {
205c210
<     }
---
>       }*/
209a215
>     bool isprecINT = false;
219a226,237
>       }
>       else if ( isprecINT && (it->type==_SYMB) &&  (it->_SYMBptr->sommet==at_pow) ) {
> 	  symbolic mys = *(it->_SYMBptr);
> 	  if(!((mys.feuille._VECTptr->back()==plus_one_half))){
> 	     if ((mys.feuille._VECTptr->front().type==_INT_)||(mys.feuille._VECTptr->front().type==_ZINT)){
> 	        if  (is_positive(mys.feuille._VECTptr->front(),contextptr))
> 	          s += "<mo>&times;</mo>";//  2*2^n et 22^n, 2*2^(1/7)  mais pas 2*sqrt(2) 
> 	     }
> 	  } 
> 
> 	 s += gen2mathml(*it,contextptr);
>       }
224c242,244
<     }
---
>        }
>       if(  (it->type==_INT_)||(it->type==_ZINT) || (it->type==_REAL) || (it->type==_DOUBLE_) ){
> 	isprecINT=true;
226,228c246,247
<       else 
< {	s += gen2mathml(*it,contextptr);
< 
---
>       else{
> 	isprecINT=false;
233,234c252,253
<       else if (needs_times(*it,contextptr))
<     s += "<mo>&times;</mo>";
---
>       else if ((needs_times(*it,contextptr))&& isprecINT)
> 	s += "<mo>&times;</mo>";
241a261
>     bool isprecINT = false;
253a274,284
>       else if ( isprecINT && (it->type==_SYMB) &&  (it->_SYMBptr->sommet==at_pow)  ) {
> 	  symbolic mys = *(it->_SYMBptr);
> 	   if(!((mys.feuille._VECTptr->back()==plus_one_half))){
> 	     if ((mys.feuille._VECTptr->front().type==_INT_)||(mys.feuille._VECTptr->front().type==_ZINT)){
> 	       if  (is_positive(mys.feuille._VECTptr->front(),contextptr))
> 		 s += "<mo>&times;</mo>";//2*2^n  ou 2*2^(1/7)  != 22^(1/3)
> 	     } 
> 	   }
> 
> 	 s += gen2mathml(*it,contextptr);
>       }
255a287,293
> 
>       if(  (it->type==_INT_)||(it->type==_ZINT) || (it->type==_REAL) || (it->type==_DOUBLE_) ){
> 	isprecINT=true;
>       }
>       else{
> 	isprecINT=false;
>       }
259,260c297,298
<       else if (needs_times(*it,contextptr))
< 	s += "<mo>*</mo>";  
---
>       else if ((needs_times(*it,contextptr)) && isprecINT)
> 	s +="<mo>&times;</mo>";
917c955
<       }
---
> 	 }
957c995,996
< 	      +"</mrow></mfrac><mo>*</mo>"; // A revoir ?  //"} \\* ";
---
> 	      +"</mrow></mfrac>";
> 	    s+="<mo>&times;</mo>"; // A revoir ?  utile pour '1/y*(-33)' sinon un espace pour couper les barres de fractions serait plus joli
981c1020
<       string s_no_bra= "<msup><mrow>"+gen2mathml((*(mys.feuille._VECTptr))[0],contextptr) 
---
>       string s_no_bra= "<msup><mrow> "+gen2mathml((*(mys.feuille._VECTptr))[0],contextptr) 
998a1038,1043
>           else return s_bra;
>       }
>       //fred 2*(-1)^n
>       //_REAL et _DOUBLE_ inutiles (-1.5)^n passe en exp
>       else if ((mys.feuille._VECTptr->front().type==_INT_)||(mys.feuille._VECTptr->front().type==_ZINT)){
> 	if  (is_positive(mys.feuille._VECTptr->front(),contextptr)) return s_no_bra;


Répondre