Page 1 sur 2

mathml

Publié : sam. oct. 06, 2012 8:18 am
par frederic han
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

Re: mathml

Publié : dim. oct. 07, 2012 7:11 am
par parisse
en effet, on va l'ajouter!

Re: mathml

Publié : mer. oct. 17, 2012 7:56 am
par frederic han
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

Re: mathml

Publié : mer. oct. 17, 2012 8:23 am
par parisse
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!

Re: mathml

Publié : mer. oct. 17, 2012 2:00 pm
par frederic han
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);

Re: mathml

Publié : jeu. oct. 18, 2012 6:49 am
par parisse
voila, j'ai incorpore tes modifs dans le source.

Re: mathml

Publié : ven. nov. 09, 2012 6:25 pm
par frederic han
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

Re: mathml

Publié : sam. nov. 10, 2012 11:01 am
par parisse
En attendant mieux, on doit pouvoir rajouter

Code : Tout sélectionner

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

Re: mathml

Publié : dim. oct. 20, 2013 5:33 pm
par frederic han
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

Re: mathml

Publié : lun. oct. 21, 2013 7:38 am
par parisse
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...

Re: mathml

Publié : jeu. déc. 26, 2013 10:11 am
par frederic han
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.

Re: mathml

Publié : sam. janv. 18, 2014 3:33 pm
par frederic han
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));

Re: mathml

Publié : mer. févr. 26, 2014 10:56 am
par frederic han
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>";
	}

Re: mathml

Publié : mer. févr. 26, 2014 11:42 am
par parisse
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.

Re: mathml

Publié : mar. mars 11, 2014 1:03 pm
par frederic han
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;