"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
#!/usr/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. # BEGIN { %num_mapping = ( '0' => '' , '1' => 'une' , '2' => 'deux' , '3' => 'trois' , '4' => 'quatre' , '5' => 'cinq' , '6' => 'six' , '7' => 'sept' , '8' => 'huit' , '9' => 'neuf' , '10' => 'dix' , '11' => 'onze' , '12' => 'douze' , '13' => 'treize' , '14' => 'quatorze' , '15' => 'quinze' , '16' => 'seize' , '20' => 'vingt' , '30' => 'trente' , '40' => 'quarante' , '50' => 'cinquante' , '60' => 'soixante' , '80' => 'quatre vingt' ); } # # Convert numbers 100 < $tens < 9 # sub convert_tens { local($tens) = $_[0]; if (exists $num_mapping{$tens}) { print "$num_mapping{$tens}"; } else { # # it is something > 16 # $sunit = $tens % 10; $stens = $tens - $sunit; if (exists $num_mapping{$stens}) { print "$num_mapping{$stens} "; if ($sunit == 1) { print "et "; } print "$num_mapping{$sunit}"; } else { # # special cases for numbers >= 70 # if ($stens == 70 || $stens == 90) { $sunit += 10; print "$num_mapping{$stens - 10} "; if ($tens == 71) { print "et "; } &convert_tens($sunit); } } } } # # Main Convert routine # sub convert { local($number) = $_[0]; # Special case if ($number == 0) { print "z�ro"; return; } my $tens = $number % 100; my $cents = ($number / 100) % 10; my $mils = ($number / 1000) % 100; if ($mils) { if ($mils > 1) { &convert($mils); print " "; } print "mille"; if ($cents || $tens) { print " "; } } if ($cents > 0) { if ($cents > 1) { print "$num_mapping{$cents} "; } print "cent"; if ($tens > 0) { print " "; } else { if ($cents > 1) { print "s"; } return; } } &convert_tens($tens); } # # Main program # (@ARGV) || die "need a .aux file to patch"; open(AUX, "<$ARGV[0]") || die "cannot open $ARGV[0]"; shift; $label = "LastPage"; while () { 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; } }
#!/bin/sh

scriptpath=`dirname $0`;

basefile=`basename $1 .tex`
pathfile=`dirname $1`
auxfile=$pathfile/$basefile.aux

# Run latex to update the .aux file
latex $1

# Patch the .aux file
mv $auxfile $auxfile~
$scriptpath/convnum.pl $auxfile~ > $auxfile

# Run latex again for the final output
echo "latex $1"
latex $1

Répondre à