/*************************************** * * * Copyright (c) 2007 Jean-Eric Pin * * All rights reserved. * * * * TAB = 2 spaces * * * ***************************************/ /*------------------------------------------------------------------- * InitLaTeX.c Jean-Eric Pin 31/05/2007 *------------------------------------------------------------------- */ #include <stdlib.h> #include <stdio.h> #include <math.h> #include "Globales.h" #include "Main.h" #include "InitLaTeX.h" #include "Memoire.h" #include "Sortie.h" #include "SortieLaTeX.h" #include "Utilitaires.h" extern unsigned long NbElements, DernierMot; extern info *Table; extern unsigned short MemoireAllouee, SemiReduit; long *TableauLongueurMots; long LongueurLaTeXMax; /**************************************************** * * Le tableau LargeurLettresLaTeX donne la largeur en * 100000 ieme de pt des lettres en LaTeX * ****************************************************/ long LargeurLettresLaTeX[26] = { 528589L, /* a */ 429166L, /* b */ 432756L, /* c */ 520486L, /* d */ 465627L, /* e */ 597226L, /* f */ 512846L, /* g */ 576158L, /* h */ 344513L, /* i */ 469049L, /* j */ 552084L, /* k */ 318057L, /* l */ 878014L, /* m */ 600235L, /* n */ 484723L, /* o */ 503125L, /* p */ 48229L, /* q */ 478937L, /* r */ 46875L, /* s */ 361111L, /* t */ 572458L, /* u */ 520601L, /* v */ 742825L, /* w */ 571527L, /* x */ 52616L, /* y */ 50903L /* z */ }; /**************************************************** * * Longueur LaTeX d'un mot non vide * ****************************************************/ long LongueurLaTeXMotNonVide(unsigned long n) { if (n == IDENTITE) return 0L; else return (LongueurLaTeXMotNonVide(Table[n].Prefixe) + LargeurLettresLaTeX[Table[n].Finale]); } /**************************************************** * * Longueur LaTeX d'un mot. * ****************************************************/ long LongueurLaTeXMot(unsigned long n) { if (n == IDENTITE) return 1L; else return LongueurLaTeXMotNonVide(n); } /**************************************************** * * Longueur LaTeX semi-reduite d'un mot * ****************************************************/ long LongueurLaTeXMotSemiReduite(unsigned long n) { lettre LettreEnCours; short Exposant; long Longueur = 0L; while (n != IDENTITE) { LettreEnCours = Table[n].Initiale; Exposant = 1; while ((Table[n].Suffixe != IDENTITE) && (Table[Table[n].Suffixe].Initiale == LettreEnCours)) { n = Table[n].Suffixe; Exposant++; } if (Exposant == 1) Longueur = Longueur + LargeurLettresLaTeX[LettreEnCours]; else if (Exposant < 10) Longueur = Longueur + LargeurLettresLaTeX[LettreEnCours] + LATEX_PREMIER_EXPOSANT; else /* Exposant >= 10 */ Longueur = Longueur + LargeurLettresLaTeX[LettreEnCours] + LATEX_PREMIER_EXPOSANT + LATEX_EXPOSANT * (NombreDeChiffres(n)-1); n = Table[n].Suffixe; } return Longueur; } /**************************************************** * * LongueurLaTeX * ****************************************************/ void LongueurLaTeXNormale(void) { unsigned long n; for (n = IDENTITE; n <= NbElements; n++) { TableauLongueurMots[n] = LongueurLaTeXMot(n); if (LongueurLaTeXMot(n) > LongueurLaTeXMax) LongueurLaTeXMax = LongueurLaTeXMot(n); } } /**************************************************** * * LongueurLaTeX * ****************************************************/ void LongueurLaTeXSemiReduite(void) { unsigned long n; for (n = IDENTITE; n <= NbElements; n++) { TableauLongueurMots[n] = LongueurLaTeXMotSemiReduite(n); if (LongueurLaTeXMotSemiReduite(n) > LongueurLaTeXMax) LongueurLaTeXMax = LongueurLaTeXMotSemiReduite(n); } } /**************************************************** * * LongueurLaTeX * ****************************************************/ void LongueurLaTeX(void) { LongueurLaTeXMax = 0; if (!(MemoireAllouee & MEMOIRE_TABLEAU_LONGUEUR_MOTS)) { TableauLongueurMots = ALLOC(long, NbElements+1); MemoireAllouee |= MEMOIRE_TABLEAU_LONGUEUR_MOTS; /* On prend note : on a alloue de la memoire. */ } if (SemiReduit) LongueurLaTeXSemiReduite(); else LongueurLaTeXNormale(); }