#define OK 1 /************************************************************************************************** ** Function name : leveeq ** ------ ** Description : Enleve le symbole 'eq' montrant le debut d'une equation. ** Input : char*: Formule en format RTF ** Output : int : 1 si reussi, -1 si echec. **************************************************************************************************/ int leveeq(char * formuleRTF) { int i,j,k; i=0; while(formuleRTF[i]==' ' || formuleRTF[i]==0x09 /* Tab */) i++; if (formuleRTF[i]!='e' || formuleRTF[i+1]!='q') return -1; i+=2; while(formuleRTF[i]==' ' || formuleRTF[i]==0x09 /* Tab */) i++; strcpy(formuleRTF,&formuleRTF[i]); return OK; } /************************************************************************************************** ** Function name : Rec_Expression ** -------------- ** Description : Determine l'expression math'ematique correspondante, et trouve sa traduction en TeX ou appelle une autre fonction pour la gerer. ** Input : char*, char* : formule RTF et formule TeX (en output mais pointeur) ** Output : int: nombre de caracteres reconnus. (-1 si erreur). **************************************************************************************************/ int Rec_Expression(char* formuleRTF, char* formuleTeX) { int i,j,k,l,m,n; int Num_col_Matrix=0; char temp[10]; char coef=0; if (FLAG_Equation==2) coef='a'-'A'; /* Il s'agit d'une equation MAC en minuscules */ m=0; if ((FLAG_Equation!=2) && (formuleRTF[0]!=0x5c || formuleRTF[1]!=0x5c)) { /* La formule ne commence pas par un mot de commande: */ while(formuleRTF[m]!=0x5c) { if (m>=strlen(formuleRTF)) { return m; } sprintf(temp,"%c",formuleRTF[m]); strcat(formuleTeX,temp); m++; } } i=m+4; switch(formuleRTF[2+m]+coef) { case 'I': /* Il s'agit d'une integrale */ strcat(formuleTeX,"\\int"); strcat(formuleTeX,"_{"); j=i; while(formuleRTF[i]!=',') { /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; } strncat(formuleTeX,&formuleRTF[j],i-j); i++; strcat(formuleTeX,"}^{"); j=i; while(formuleRTF[i]!=',') { /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; } strncat(formuleTeX,&formuleRTF[j],i-j); i++; strcat(formuleTeX,"}"); j=i; k=1; while(k!=0) { /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; if (formuleRTF[i]=='(') k++; if (formuleRTF[i]==')') k--; } strncat(formuleTeX,&formuleRTF[j],i-j); return i+1; break; case 'A': /* Il s'agit d'une matrice */ strcat(formuleTeX,"\n\\begin{array}{"); j=i; while(formuleRTF[i]!=',') { if (formuleRTF[i]=='(') { /* On saute jusqu'a la fin de la parenthese fermante */ k=1; Num_col_Matrix++; while(k!=0) { i++; if (formuleRTF[i]=='(') k++; if (formuleRTF[i]==')') k--; } /* i--; */ } /* if (formuleRTF[i]=='.') Num_col_Matrix++; */ i++; } i=j; for (n=0;n<=Num_col_Matrix;n++) strcat(formuleTeX,"c"); strcat(formuleTeX,"}\n"); k=1; while (k!=0) { while(formuleRTF[i]!=',' && k!=0) { if (formuleRTF[i]=='.') strcat(formuleTeX," & "); /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; if (formuleRTF[i]=='(') k++; if (formuleRTF[i]==')') k--; } strncat(formuleTeX,&formuleRTF[j],i-j); i++; j=i; strncat(formuleTeX,"\\\\\n"); } strcat(formuleTeX,"\n\\end{array}"); return i+1; break; case 'X': /* La formule est encadree */ return -1; break; case 'F': strcat(formuleTeX,"\\frac"); strcat(formuleTeX,"{"); j=i; while(formuleRTF[i]!=',') { /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; } strncat(formuleTeX,&formuleRTF[j],i-j); i++; strcat(formuleTeX,"}{"); j=i; k=1; while(k!=0) { /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; if (formuleRTF[i]=='(') k++; if (formuleRTF[i]==')') k--; } strncat(formuleTeX,&formuleRTF[j],i-j); strcat(formuleTeX,"}"); return i+1; break; case 'R': /* Il s'agit d'une racine n-ieme */ strcat(formuleTeX,"{\\sqrt"); strcat(formuleTeX,"["); j=i; while(formuleRTF[i]!=',') { /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; } strncat(formuleTeX,&formuleRTF[j],i-j); i++; strcat(formuleTeX,"]{"); j=i; k=1; while(k!=0) { /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; if (formuleRTF[i]=='(') k++; if (formuleRTF[i]==')') k--; } strncat(formuleTeX,&formuleRTF[j],i-j); strcat(formuleTeX,"}}"); return i+1; break; case 'L': /* Il s'agit d'une liste */ return -1; break; case 'S': /* Il s'agit d'un jeu de coordonnees */ return -1; break; case 'O': /* Il s'agit d'une superposition */ return -1; break; case 'B': /* Il s'agit d'un element entre grosses parentheses */ strcat(formuleTeX,"\\left("); j=i; k=1; while(k!=0) { /* Tester si recursivite */ if (formuleRTF[i]==0x5c) { l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]); if (l<0) printf("ERREUR\n"); else { i=i+l-1; j+=l; } } i++; if (formuleRTF[i]=='(') k++; if (formuleRTF[i]==')') k--; } strncat(formuleTeX,&formuleRTF[j],i-j); strcat(formuleTeX,"\\right)"); return i+1; break; default: /* Code inconnu */ return -1; break; } } /************************************************************************************************** ** Function name : Rec_Formule ** ----------- ** Description : Reconnaissance d'une formule mathematique ** Input : char *: Formule en format RTF ** Output : char *: Formule en format TEX **************************************************************************************************/ char * Rec_Formule(char * formuleRTF) { char * formuleTeX; char temp[512]; char coef=0; int i,j,k; if (FLAG_Equation==1) /* Il s'agit d'une equation PC: Field */ if (leveeq(formuleRTF)==-1) return puretext(formuleRTF); formuleTeX=(char *) malloc (2*length); if (FLAG_Dollars==0) strcpy(formuleTeX,"$"); else strcpy(formuleTeX,"$$"); j=0; do { k=Rec_Expression(&formuleRTF[j],&formuleTeX[strlen(formuleTeX)]); if (k <0) return puretext(formuleRTF); j=j+k; } while (j