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