#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;
}