>>Date: Thu, 22 Mar 2001 20:14:08 +0100
>>From: ben <[EMAIL PROTECTED]>
>>To: "Jean-Pierre.Chretien" <[EMAIL PROTECTED]>
>>CC: [EMAIL PROTECTED]
>>Subject: Re: Nombre en toute lettre
>>
>>"Jean-Pierre.Chretien" a écrit :
>>
>>> >>Je dois écrire des documents qui indiquent sur la page de couverture le
>>> >>nombre de pages du document en toute lettre. [...]
>>>
>>> Je ferai ça par un programme externe (comme bibtex ou makeindex)
>>> qui réalise la fonction requise avant une dernière passe.
>>> Évidemment l'interface avec LyX n'est peut-être pas évidente...
>>> Quant à l'écriture de la fonction, il suffit d'une table associative
>>> qu'il est possible d'écrire plus ou moins astucieusement.
>>> Je vois assez bien comment faire en Perl, pour éviter
>>> d'écrire brutalement la table: les exceptions ne sont pas
>>> trop nombreuses (encore moins quand on compte avec septante, etc.)
>>
>>J'ai fait ce petit truc, qui me suffit. Si ça peut intéresser quelqu'un ou si
>>le script en perl peut être amélioré (ce qui est certain) je suis preneur.
>>Pour l'utilisation sous LyX pas de problème, avec un convertisseur perso
>>LaTeX->DVI (num) qui fait 'runlatex $$i'.
>>
>>A+
>>
>>BG

En attachement, un modif structurelle (num2let.pm est un module
réutilisable) et la correction des - dans les nombres de 9 à 100
(cf Gouriou), avec un script de test.

Pour le Perl, pas d'états d'àme, la programmation la plus évidente
est la plus facile à tenir à jour, IMHO.

Il va de soi qu'il manque 2 ou 3 choses pour que ce soit général
(masculin/féminin, internationalisation par le locale).
-- 
Jean-Pierre
#!/usr/local/bin/perl
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
        if $running_under_some_shell;

#
# This script parses a .aux file and replace some labels page numbers
# by this number written in letter.
#

use num2let;
#
# Main program
#

(@ARGV) || die "need a .aux file to patch";

open(AUX, "<$ARGV[0]") || die "cannot open $ARGV[0]";

shift;

$label = "LastPage";

while (<AUX>) {

  if (/{$label}/) {
    $line = $_;
    ($num  = $line) =~ s/(.*{$label}{{.*}{)(\d*)}}/$2/g;
    ($prev = $line) =~ s/(.*{$label}{{.*}{)(\d*)}}/$1/g;
    $prev =~ s/\n//;
    print "$prev";
    &convert($num);
    print "}}\n";
  }
  else {
    print;
  }
}

num2let.pm

#!/usr/local/bin/perl
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
        if $running_under_some_shell;

#
# This script parses a .aux file and replace some labels page numbers
# by this number written in letter.
#

use num2let;
#
# Main program
#


foreach $i (0..201) {
  print "$i\t=> ";
convert($i);
print "\n";
}
foreach $i (1000..1001) {
  print "$i\t=> ";
convert($i);
print "\n";
}
exit;

Répondre à