summaryrefslogtreecommitdiff
path: root/support/w2latex/rtf.math.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/w2latex/rtf.math.c
Initial commit
Diffstat (limited to 'support/w2latex/rtf.math.c')
-rw-r--r--support/w2latex/rtf.math.c337
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