diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/w2latex/rtf.math.c |
Initial commit
Diffstat (limited to 'support/w2latex/rtf.math.c')
-rw-r--r-- | support/w2latex/rtf.math.c | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/support/w2latex/rtf.math.c b/support/w2latex/rtf.math.c new file mode 100644 index 0000000000..cf210272c0 --- /dev/null +++ b/support/w2latex/rtf.math.c @@ -0,0 +1,337 @@ +#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<strlen(formuleRTF)); + if (FLAG_Dollars==0) + strcat(formuleTeX,"$"); + else + strcat(formuleTeX,"$$"); + return formuleTeX; +} + +/*void main(void) +{ + strcpy(tampon," eq \\\\B(\\\\A(\\\\F(x+sin(x),1),\\\\R(27,sin(x)+ch(th(x))),\\\\I(1,2,log(x+sin(x)))))"); + printf("\n\n\t\t[%s]\n\n",Rec_Formule(tampon)); +}*/
\ No newline at end of file |