#! /share/nfs/users1/umr-tge/zoonek/gnu/Linux/bin/perl -w
#
# This is a generated file -- do not edit
#
package Init;
use strict;
use Carp qw(:DEFAULT cluck);

use constant TRUE  => (0==0);
use constant FALSE => (0==1);

use constant NORMAL  => "normal";
use constant SMALLCAPS => "smallcaps";
use constant EXPERT  => "expert";
use constant MEDIUM  => "medium";
use constant BOLD    => "bold";
use constant UPRIGHT => "upright";
use constant ITALICS => "italics";
use constant SLANTED => "slanted";
use constant UPRIGHTITALICS => "uprightitalics";
use constant NORMALCAPS  => "normalcaps";
use constant ALLCAPS     => "allcaps";
use constant CONDENSED   => "condensed";
use constant EXTENDED    => "extended";

use constant TTF => "ttf";
use constant AFM => "afm";

our @caps = (NORMALCAPS, SMALLCAPS); # RAJOUTER ALLCAPS
our @shape = (UPRIGHT, SLANTED, ITALICS, UPRIGHTITALICS);
our @width = (NORMAL, CONDENSED, EXTENDED);
our @series = (MEDIUM, BOLD);

#@caps=(NORMALCAPS); @shape=(UPRIGHT); @width=(NORMAL); @series=(MEDIUM);

our @test_files = qw/test-toto-1 test-toto-2 test-toto-3/;

sub write_a_few_files {
open(F, ">T1-WGL4.enc") || die "Cannot open T1-WGL4.enc for writing: ";
print F "\% T1-WGL4.enc\n";
print F "\%\n";
print F "\%\n";
print F "\% This is LaTeX T1 encoding for WGL4 encoded TrueType fonts\n";
print F "\% (e.g. from Windows 95)\n";
print F "\%\n";
print F "\%\n";
print F "\% Note that /hyphen appears twice (for the T1 code points `hyphen' 0x2d\n";
print F "\% and `hyphenchar' 0x7f).\n";
print F "\%\n";
print F "\%\n";
print F "\% LIGKERN space l =: lslash ;\n";
print F "\% LIGKERN space L =: Lslash ;\n";
print F "\% LIGKERN question quoteleft =: questiondown ;\n";
print F "\% LIGKERN exclam quoteleft =: exclamdown ;\n";
print F "\% LIGKERN hyphen hyphen =: endash ;\n";
print F "\% LIGKERN endash hyphen =: emdash ;\n";
print F "\% LIGKERN quoteleft quoteleft =: quotedblleft ;\n";
print F "\% LIGKERN quoteright quoteright =: quotedblright ;\n";
print F "\% LIGKERN comma comma =: quotedblbase ;\n";
print F "\% LIGKERN less less =: guillemotleft ;\n";
print F "\% LIGKERN greater greater =: guillemotright ;\n";
print F "\%\n";
print F "\% LIGKERN f i =: fi ;\n";
print F "\% LIGKERN f l =: fl ;\n";
print F "\% LIGKERN f f =: ff ;\n";
print F "\% LIGKERN ff i =: ffi ;\n";
print F "\% LIGKERN ff l =: ffl ;\n";
print F "\%\n";
print F "\%   We blow away kerns to and from spaces (TeX doesn't have a\n";
print F "\%   space) and also remove any kerns from the numbers.\n";
print F "\%\n";
print F "\% LIGKERN space {} \* ; \* {} space ;\n";
print F "\% LIGKERN zero {} \* ; \* {} zero ;\n";
print F "\% LIGKERN one {} \* ; \* {} one ;\n";
print F "\% LIGKERN two {} \* ; \* {} two ;\n";
print F "\% LIGKERN three {} \* ; \* {} three ;\n";
print F "\% LIGKERN four {} \* ; \* {} four ;\n";
print F "\% LIGKERN five {} \* ; \* {} five ;\n";
print F "\% LIGKERN six {} \* ; \* {} six ;\n";
print F "\% LIGKERN seven {} \* ; \* {} seven ;\n";
print F "\% LIGKERN eight {} \* ; \* {} eight ;\n";
print F "\% LIGKERN nine {} \* ; \* {} nine ;\n";
print F "\n";
print F "/T1Encoding [          \% now 256 chars follow\n";
print F "\% 0x00\n";
print F "  /grave /acute /circumflex /tilde\n";
print F "  /dieresis /hungarumlaut /ring /caron\n";
print F "  /breve /macron /dotaccent /cedilla\n";
print F "  /ogonek /quotesinglbase /guilsinglleft /guilsinglright\n";
print F "\% 0x10\n";
print F "  /quotedblleft /quotedblright /quotedblbase /guillemotleft\n";
print F "  /guillemotright /endash /emdash /compwordmark\n";
print F "  /perthousandzero /dotlessi /dotlessj /ff\n";
print F "  /fi /fl /ffi /ffl\n";
print F "\% 0x20\n";
print F "  /visualspace /exclam /quotedbl /numbersign\n";
print F "  /dollar /percent /ampersand /quoteright\n";
print F "  /parenleft /parenright /asterisk /plus\n";
print F "  /comma /hyphen /period /slash\n";
print F "\% 0x30\n";
print F "  /zero /one /two /three\n";
print F "  /four /five /six /seven\n";
print F "  /eight /nine /colon /semicolon\n";
print F "  /less /equal /greater /question\n";
print F "\% 0x40\n";
print F "  /at /A /B /C\n";
print F "  /D /E /F /G\n";
print F "  /H /I /J /K\n";
print F "  /L /M /N /O\n";
print F "\% 0x50\n";
print F "  /P /Q /R /S\n";
print F "  /T /U /V /W\n";
print F "  /X /Y /Z /bracketleft\n";
print F "  /backslash /bracketright /asciicircum /underscore\n";
print F "\% 0x60\n";
print F "  /quoteleft /a /b /c\n";
print F "  /d /e /f /g\n";
print F "  /h /i /j /k\n";
print F "  /l /m /n /o\n";
print F "\% 0x70\n";
print F "  /p /q /r /s\n";
print F "  /t /u /v /w\n";
print F "  /x /y /z /braceleft\n";
print F "  /bar /braceright /asciitilde /hyphen\n";
print F "\% 0x80\n";
print F "  /Abreve /Aogonek /Cacute /Ccaron\n";
print F "  /Dcaron /Ecaron /Eogonek /Gbreve\n";
print F "  /Lacute /Lcaron /Lslash /Nacute\n";
print F "  /Ncaron /Eng /Odblacute /Racute\n";
print F "\% 0x90\n";
print F "  /Rcaron /Sacute /Scaron /Scedilla\n";
print F "  /Tcaron /Tcedilla /Udblacute /Uring\n";
print F "  /Ydieresis /Zacute /Zcaron /Zdot\n";
print F "  /IJ /Idot /dmacron /section\n";
print F "\% 0xA0\n";
print F "  /abreve /aogonek /cacute /ccaron\n";
print F "  /dcaron /ecaron /eogonek /gbreve\n";
print F "  /lacute /lcaron /lslash /nacute\n";
print F "  /ncaron /eng /odblacute /racute\n";
print F "\% 0xB0\n";
print F "  /rcaron /sacute /scaron /scedilla\n";
print F "  /tcaron /tcedilla /udblacute /uring\n";
print F "  /ydieresis /zacute /zcaron /zdot\n";
print F "  /ij /exclamdown /questiondown /sterling\n";
print F "\% 0xC0\n";
print F "  /Agrave /Aacute /Acircumflex /Atilde\n";
print F "  /Adieresis /Aring /AE /Ccedilla\n";
print F "  /Egrave /Eacute /Ecircumflex /Edieresis\n";
print F "  /Igrave /Iacute /Icircumflex /Idieresis\n";
print F "\% 0xD0\n";
print F "  /Eth /Ntilde /Ograve /Oacute\n";
print F "  /Ocircumflex /Otilde /Odieresis /OE\n";
print F "  /Oslash /Ugrave /Uacute /Ucircumflex\n";
print F "  /Udieresis /Yacute /Thorn /Germandbls\n";
print F "\% 0xE0\n";
print F "  /agrave /aacute /acircumflex /atilde\n";
print F "  /adieresis /aring /ae /ccedilla\n";
print F "  /egrave /eacute /ecircumflex /edieresis\n";
print F "  /igrave /iacute /icircumflex /idieresis\n";
print F "\% 0xF0\n";
print F "  /eth /ntilde /ograve /oacute\n";
print F "  /ocircumflex /otilde /odieresis /oe\n";
print F "  /oslash /ugrave /uacute /ucircumflex\n";
print F "  /udieresis /yacute /thorn /germandbls\n";
print F "] def\n";
print F "\n";
print F "\% eof\n";
close F;

open(F, ">dotlessj.mtx") || die "Cannot open dotlessj.mtx for writing: ";
print F "\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\n";
print F "\%\%\n";
print F "\%\% This is the file dotlessj.mtx, part of the VFinst package\n";
print F "\%\% (version 0.95, December, 1997) for PostScript Type1 font \n";
print F "\%\% installation.  (Author: Alan Hoenig, ajhjj\@cunyvm.cuny.edu)\n";
print F "\%\%\n";
print F "\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\n";
print F "\n";
print F "\n";
print F "\\relax\n";
print F "\n";
print F "This fontinst file sets a dotless j glyph for a TeX\n";
print F "math italic font.  The following code is due to Thierry Bouche,\n";
print F "a paper of whose on virtual math fonts can be found at\n";
print F "ftp://fourier.ujf-grenoble.fr/pub/contrib-tex/gut/mathfonts-pk.ps.gz\n";
print F "\n";
print F "\\metrics\n";
print F "\n";
print F "\\ifisglyph{j}\\then\n";
print F "\\ifisglyph{dotlessi}\\then\n";
print F "  \\resetglyph{dotlessj}\n";
print F "  \\glyphspecial{ps: gsave gsave}\n";
print F "   \\push\n";
print F "     \\moveup{\\neg{\\depth{j}}}\n";
print F "      \\movert{\\neg{\\width{j}}}\n";
print F "    \\glyphspecial{ps: currentpoint /JDepth exch def /JLeft exch def}\n";
print F "     \\moveup{\\add{\\depth{j}}{\\height{dotlessi}}}\n";
print F "     \%\\movert{\\mul{\\width{j}}{2}}\n";
print F "     \\movert{\\scale{\\width{j}}{2500}}\n";
print F "     \\glyphspecial{ps: currentpoint /IHeight exch def /JRight exch def grestore}\n";
print F "     \\glyphspecial{ps:   JLeft JDepth moveto JLeft neg JRight add 0 rlineto\n";
print F "  	0 JDepth neg IHeight add rlineto JLeft neg JRight add neg 0\n";
print F "  	rlineto 0 JDepth neg IHeight add neg rlineto closepath  clip}\n";
print F "     \\pop\n";
print F "     \\glyph{j}{1000}\n";
print F "     \\glyphspecial{ps: grestore}\n";
print F "  	   \\resetdepth{\\depth{j}}\n";
print F "  	   \\resetwidth{\\width{j}}\n";
print F "  	   \\resetitalic{\\italic{j}}\n";
print F "  	   \\resetheight{\\height{dotlessi}}\n";
print F "  \\endresetglyph\n";
print F "\\fi\n";
print F "\\fi\n";
print F "\n";
print F "\\endmetrics\n";
close F;

open(F, ">fake_bold.mtx") || die "Cannot open fake_bold.mtx for writing: ";
print F "\\relax\n";
print F "\\metrics\n";
print F "\\begingroup\n";
print F "  \\catcode`\\{=11\n";
print F "  \\catcode`\\}=11\n";
print F "  \\catcode`\\(=1\n";
print F "  \\catcode`\\)=2\n";
print F "  \\global\\def\\doit#1(\%\n";
print F "  \\ifisglyph(#1)\\then\n";
print F "    \\resetglyph(#1)\n";
print F "      \\glyphspecial(ps: gsave 0 30 360 { )\n";
print F "      \\glyphspecial(ps: dup sin 1 mul exch cos 1 mul translate )\n";
print F "      \\push \\glyph(#1)(1000) \\pop\n";
print F "      \\glyphspecial(ps: } for grestore )\n";
print F "      \\glyph(#1)(1000)\n";
print F "    \\endresetglyph\n";
print F "  \\fi)\n";
print F "  \\catcode`\\{=1\n";
print F "  \\catcode`\\}=2\n";
print F "  \\catcode`\\(=12\n";
print F "  \\catcode`\\)=12\n";
print F "\\endgroup\n";
print F "\\input caracteres\n";
print F "\\endmetrics\n";
close F;

open(F, ">no_unfakable_greek.mtx") || die "Cannot open no_unfakable_greek.mtx for writing: ";
print F "\\relax\n";
print F "\\metrics\n";
print F "\n";
print F "\\RequirePackage{ifthen}\n";
print F "\n";
print F "\\def\\reallyunfakable#1{\n";
print F "   \\setglyph{#1}\n";
print F "      \\ifisglyph{#1-not}\\then\n";
print F "         \\moveup{\\neg{\\depth{#1-not}}}\n";
print F "         \\glyphrule{\n";
print F "            \\width{#1-not}\n";
print F "         }{\n";
print F "            \\add{\\depth{#1-not}}{\\height{#1-not}}\n";
print F "         }\n";
print F "         \\resetitalic{\\italic{#1-not}}\n";
print F "         \\moveup{\\depth{#1-not}}\n";
print F "      \\else\n";
print F "         \\glyphrule{500}{500}\n";
print F "      \\fi\n";
print F "      \\glyphwarning{missing glyph `#1'}\n";
print F "   \\endsetglyph\n";
print F "}\n";
print F "\\def\\unfakable#1{\n";
print F "  \\let\\iftmp\\iftrue\n";
print F "  \\ifthenelse{\\equal{#1}{Gamma}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Theta}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Lambda}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Xi}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Pi}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Sigma}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Upsilon}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Delta}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Upsilon1}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Phi}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Psi}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\ifthenelse{\\equal{#1}{Omega}}{\\let\\iftmp\\iffalse}{}\n";
print F "  \\iftmp\\reallyunfakable{#1}\\fi\n";
print F "}\n";
print F "\n";
print F "\\endmetrics\n";
close F;

open(F, ">cmr10.mtx") || die "Cannot open cmr10.mtx for writing: ";
print F "\%Filename: cmr10.mtx\n";
print F "\%Created by: tex 16.fontinst\n";
print F "\%Created using: \\pltomtx{cmr10}{cmr10}\n";
print F "\n";
print F "\%This file contains the information of cmr10.pl in a form\n";
print F "\%more easily read by TeX. It is used by the fontinst package.\n";
print F "\n";
print F "\%THIS FILE CAN BE DELETED.\n";
print F "\n";
print F "\\relax\n";
print F "\\metrics\n";
print F "\n";
print F "\\needsfontinstversion{1.801}\n";
print F "\n";
print F "\\setdim{designsize}{10.0pt}\n";
print F "\\setint{italicslant}{0000}\n";
print F "\\setint{interword}{0333}\n";
print F "\\setint{stretchword}{0166}\n";
print F "\\setint{shrinkword}{0111}\n";
print F "\\setint{xheight}{0430}\n";
print F "\\setint{quad}{1000}\n";
print F "\\setint{extraspace}{0111}\n";
print F "\\setkern{lslashslash}{l}{-0277}\n";
print F "\\setkern{lslashslash}{L}{-0319}\n";
print F "\\setkern{f}{quoteright}{0077}\n";
print F "\\setkern{f}{question}{0077}\n";
print F "\\setkern{f}{exclam}{0077}\n";
print F "\\setkern{f}{parenright}{0077}\n";
print F "\\setkern{f}{bracketright}{0077}\n";
print F "\\setkern{ff}{quoteright}{0077}\n";
print F "\\setkern{ff}{question}{0077}\n";
print F "\\setkern{ff}{exclam}{0077}\n";
print F "\\setkern{ff}{parenright}{0077}\n";
print F "\\setkern{ff}{bracketright}{0077}\n";
print F "\\setkern{quoteright}{question}{0111}\n";
print F "\\setkern{quoteright}{exclam}{0111}\n";
print F "\\setkern{k}{a}{-0055}\n";
print F "\\setkern{v}{a}{-0055}\n";
print F "\\setkern{k}{e}{-0027}\n";
print F "\\setkern{v}{e}{-0027}\n";
print F "\\setkern{w}{e}{-0027}\n";
print F "\\setkern{k}{a}{-0027}\n";
print F "\\setkern{v}{a}{-0027}\n";
print F "\\setkern{w}{a}{-0027}\n";
print F "\\setkern{k}{o}{-0027}\n";
print F "\\setkern{v}{o}{-0027}\n";
print F "\\setkern{w}{o}{-0027}\n";
print F "\\setkern{k}{c}{-0027}\n";
print F "\\setkern{v}{c}{-0027}\n";
print F "\\setkern{w}{c}{-0027}\n";
print F "\\setkern{P}{A}{-0083}\n";
print F "\\setkern{P}{o}{-0027}\n";
print F "\\setkern{y}{o}{-0027}\n";
print F "\\setkern{P}{e}{-0027}\n";
print F "\\setkern{y}{e}{-0027}\n";
print F "\\setkern{P}{a}{-0027}\n";
print F "\\setkern{y}{a}{-0027}\n";
print F "\\setkern{P}{period}{-0083}\n";
print F "\\setkern{y}{period}{-0083}\n";
print F "\\setkern{P}{comma}{-0083}\n";
print F "\\setkern{y}{comma}{-0083}\n";
print F "\\setkern{F}{o}{-0083}\n";
print F "\\setkern{V}{o}{-0083}\n";
print F "\\setkern{W}{o}{-0083}\n";
print F "\\setkern{F}{e}{-0083}\n";
print F "\\setkern{V}{e}{-0083}\n";
print F "\\setkern{W}{e}{-0083}\n";
print F "\\setkern{F}{u}{-0083}\n";
print F "\\setkern{V}{u}{-0083}\n";
print F "\\setkern{W}{u}{-0083}\n";
print F "\\setkern{F}{r}{-0083}\n";
print F "\\setkern{V}{r}{-0083}\n";
print F "\\setkern{W}{r}{-0083}\n";
print F "\\setkern{F}{a}{-0083}\n";
print F "\\setkern{V}{a}{-0083}\n";
print F "\\setkern{W}{a}{-0083}\n";
print F "\\setkern{F}{A}{-0111}\n";
print F "\\setkern{V}{A}{-0111}\n";
print F "\\setkern{W}{A}{-0111}\n";
print F "\\setkern{F}{O}{-0027}\n";
print F "\\setkern{V}{O}{-0027}\n";
print F "\\setkern{W}{O}{-0027}\n";
print F "\\setkern{K}{O}{-0027}\n";
print F "\\setkern{X}{O}{-0027}\n";
print F "\\setkern{F}{C}{-0027}\n";
print F "\\setkern{V}{C}{-0027}\n";
print F "\\setkern{W}{C}{-0027}\n";
print F "\\setkern{K}{C}{-0027}\n";
print F "\\setkern{X}{C}{-0027}\n";
print F "\\setkern{F}{G}{-0027}\n";
print F "\\setkern{V}{G}{-0027}\n";
print F "\\setkern{W}{G}{-0027}\n";
print F "\\setkern{K}{G}{-0027}\n";
print F "\\setkern{X}{G}{-0027}\n";
print F "\\setkern{F}{Q}{-0027}\n";
print F "\\setkern{V}{Q}{-0027}\n";
print F "\\setkern{W}{Q}{-0027}\n";
print F "\\setkern{K}{Q}{-0027}\n";
print F "\\setkern{X}{Q}{-0027}\n";
print F "\\setkern{T}{y}{-0027}\n";
print F "\\setkern{T}{e}{-0083}\n";
print F "\\setkern{Y}{e}{-0083}\n";
print F "\\setkern{T}{o}{-0083}\n";
print F "\\setkern{Y}{o}{-0083}\n";
print F "\\setkern{T}{r}{-0083}\n";
print F "\\setkern{Y}{r}{-0083}\n";
print F "\\setkern{T}{a}{-0083}\n";
print F "\\setkern{Y}{a}{-0083}\n";
print F "\\setkern{T}{A}{-0083}\n";
print F "\\setkern{Y}{A}{-0083}\n";
print F "\\setkern{T}{u}{-0083}\n";
print F "\\setkern{Y}{u}{-0083}\n";
print F "\\setkern{D}{X}{-0027}\n";
print F "\\setkern{O}{X}{-0027}\n";
print F "\\setkern{D}{W}{-0027}\n";
print F "\\setkern{O}{W}{-0027}\n";
print F "\\setkern{D}{A}{-0027}\n";
print F "\\setkern{O}{A}{-0027}\n";
print F "\\setkern{D}{V}{-0027}\n";
print F "\\setkern{O}{V}{-0027}\n";
print F "\\setkern{D}{Y}{-0027}\n";
print F "\\setkern{O}{Y}{-0027}\n";
print F "\\setkern{h}{t}{-0027}\n";
print F "\\setkern{m}{t}{-0027}\n";
print F "\\setkern{n}{t}{-0027}\n";
print F "\\setkern{h}{u}{-0027}\n";
print F "\\setkern{m}{u}{-0027}\n";
print F "\\setkern{n}{u}{-0027}\n";
print F "\\setkern{h}{b}{-0027}\n";
print F "\\setkern{m}{b}{-0027}\n";
print F "\\setkern{n}{b}{-0027}\n";
print F "\\setkern{h}{y}{-0027}\n";
print F "\\setkern{m}{y}{-0027}\n";
print F "\\setkern{n}{y}{-0027}\n";
print F "\\setkern{h}{v}{-0027}\n";
print F "\\setkern{m}{v}{-0027}\n";
print F "\\setkern{n}{v}{-0027}\n";
print F "\\setkern{h}{w}{-0027}\n";
print F "\\setkern{m}{w}{-0027}\n";
print F "\\setkern{n}{w}{-0027}\n";
print F "\\setkern{c}{h}{-0027}\n";
print F "\\setkern{c}{k}{-0027}\n";
print F "\\setkern{b}{e}{0027}\n";
print F "\\setkern{o}{e}{0027}\n";
print F "\\setkern{p}{e}{0027}\n";
print F "\\setkern{b}{o}{0027}\n";
print F "\\setkern{o}{o}{0027}\n";
print F "\\setkern{p}{o}{0027}\n";
print F "\\setkern{b}{x}{-0027}\n";
print F "\\setkern{o}{x}{-0027}\n";
print F "\\setkern{p}{x}{-0027}\n";
print F "\\setkern{b}{d}{0027}\n";
print F "\\setkern{o}{d}{0027}\n";
print F "\\setkern{p}{d}{0027}\n";
print F "\\setkern{b}{c}{0027}\n";
print F "\\setkern{o}{c}{0027}\n";
print F "\\setkern{p}{c}{0027}\n";
print F "\\setkern{b}{q}{0027}\n";
print F "\\setkern{o}{q}{0027}\n";
print F "\\setkern{p}{q}{0027}\n";
print F "\\setkern{b}{v}{-0027}\n";
print F "\\setkern{o}{v}{-0027}\n";
print F "\\setkern{p}{v}{-0027}\n";
print F "\\setkern{a}{v}{-0027}\n";
print F "\\setkern{b}{j}{0055}\n";
print F "\\setkern{o}{j}{0055}\n";
print F "\\setkern{p}{j}{0055}\n";
print F "\\setkern{a}{j}{0055}\n";
print F "\\setkern{b}{y}{-0027}\n";
print F "\\setkern{o}{y}{-0027}\n";
print F "\\setkern{p}{y}{-0027}\n";
print F "\\setkern{a}{y}{-0027}\n";
print F "\\setkern{t}{y}{-0027}\n";
print F "\\setkern{b}{w}{-0027}\n";
print F "\\setkern{o}{w}{-0027}\n";
print F "\\setkern{p}{w}{-0027}\n";
print F "\\setkern{a}{w}{-0027}\n";
print F "\\setkern{t}{w}{-0027}\n";
print F "\\setkern{u}{w}{-0027}\n";
print F "\\setkern{A}{t}{-0027}\n";
print F "\\setkern{R}{t}{-0027}\n";
print F "\\setkern{A}{C}{-0027}\n";
print F "\\setkern{R}{C}{-0027}\n";
print F "\\setkern{A}{O}{-0027}\n";
print F "\\setkern{R}{O}{-0027}\n";
print F "\\setkern{A}{G}{-0027}\n";
print F "\\setkern{R}{G}{-0027}\n";
print F "\\setkern{A}{U}{-0027}\n";
print F "\\setkern{R}{U}{-0027}\n";
print F "\\setkern{A}{Q}{-0027}\n";
print F "\\setkern{R}{Q}{-0027}\n";
print F "\\setkern{A}{T}{-0083}\n";
print F "\\setkern{R}{T}{-0083}\n";
print F "\\setkern{L}{T}{-0083}\n";
print F "\\setkern{A}{Y}{-0083}\n";
print F "\\setkern{R}{Y}{-0083}\n";
print F "\\setkern{L}{Y}{-0083}\n";
print F "\\setkern{A}{V}{-0111}\n";
print F "\\setkern{R}{V}{-0111}\n";
print F "\\setkern{L}{V}{-0111}\n";
print F "\\setkern{A}{W}{-0111}\n";
print F "\\setkern{R}{W}{-0111}\n";
print F "\\setkern{L}{W}{-0111}\n";
print F "\\setkern{g}{j}{0027}\n";
print F "\\setkern{I}{I}{0027}\n";
print F "\\setrawglyph{Gamma}{cmr10}{10.0pt}{0}{625}{683}{0}{0}\n";
print F "\\setrawglyph{Delta}{cmr10}{10.0pt}{1}{833}{683}{0}{0}\n";
print F "\\setrawglyph{Theta}{cmr10}{10.0pt}{2}{777}{683}{0}{0}\n";
print F "\\setrawglyph{Lambda}{cmr10}{10.0pt}{3}{694}{683}{0}{0}\n";
print F "\\setrawglyph{Xi}{cmr10}{10.0pt}{4}{666}{683}{0}{0}\n";
print F "\\setrawglyph{Pi}{cmr10}{10.0pt}{5}{750}{683}{0}{0}\n";
print F "\\setrawglyph{Sigma}{cmr10}{10.0pt}{6}{722}{683}{0}{0}\n";
print F "\\setrawglyph{Upsilon}{cmr10}{10.0pt}{7}{777}{683}{0}{0}\n";
print F "\\setrawglyph{Phi}{cmr10}{10.0pt}{8}{722}{683}{0}{0}\n";
print F "\\setrawglyph{Psi}{cmr10}{10.0pt}{9}{777}{683}{0}{0}\n";
print F "\\setrawglyph{Omega}{cmr10}{10.0pt}{10}{722}{683}{0}{0}\n";
print F "\\setrawglyph{ff}{cmr10}{10.0pt}{11}{583}{694}{0}{77}\n";
print F "\\setrawglyph{fi}{cmr10}{10.0pt}{12}{555}{694}{0}{0}\n";
print F "\\setrawglyph{fl}{cmr10}{10.0pt}{13}{555}{694}{0}{0}\n";
print F "\\setrawglyph{ffi}{cmr10}{10.0pt}{14}{833}{694}{0}{0}\n";
print F "\\setrawglyph{ffl}{cmr10}{10.0pt}{15}{833}{694}{0}{0}\n";
print F "\\setrawglyph{dotlessi}{cmr10}{10.0pt}{16}{277}{430}{0}{0}\n";
print F "\\setrawglyph{dotlessj}{cmr10}{10.0pt}{17}{305}{430}{194}{0}\n";
print F "\\setrawglyph{grave}{cmr10}{10.0pt}{18}{500}{694}{0}{0}\n";
print F "\\setrawglyph{acute}{cmr10}{10.0pt}{19}{500}{694}{0}{0}\n";
print F "\\setrawglyph{caron}{cmr10}{10.0pt}{20}{500}{628}{0}{0}\n";
print F "\\setrawglyph{breve}{cmr10}{10.0pt}{21}{500}{694}{0}{0}\n";
print F "\\setrawglyph{macron}{cmr10}{10.0pt}{22}{500}{567}{0}{0}\n";
print F "\\setrawglyph{ringfitted}{cmr10}{10.0pt}{23}{750}{694}{0}{0}\n";
print F "\\setrawglyph{cedilla}{cmr10}{10.0pt}{24}{444}{0}{170}{0}\n";
print F "\\setrawglyph{germandbls}{cmr10}{10.0pt}{25}{500}{694}{0}{0}\n";
print F "\\setrawglyph{ae}{cmr10}{10.0pt}{26}{722}{430}{0}{0}\n";
print F "\\setrawglyph{oe}{cmr10}{10.0pt}{27}{777}{430}{0}{0}\n";
print F "\\setrawglyph{oslash}{cmr10}{10.0pt}{28}{500}{527}{97}{0}\n";
print F "\\setrawglyph{AE}{cmr10}{10.0pt}{29}{902}{683}{0}{0}\n";
print F "\\setrawglyph{OE}{cmr10}{10.0pt}{30}{1013}{683}{0}{0}\n";
print F "\\setrawglyph{Oslash}{cmr10}{10.0pt}{31}{777}{731}{48}{0}\n";
print F "\\setrawglyph{lslashslash}{cmr10}{10.0pt}{32}{277}{430}{0}{0}\n";
print F "\\setrawglyph{exclam}{cmr10}{10.0pt}{33}{277}{694}{0}{0}\n";
print F "\\setrawglyph{quotedblright}{cmr10}{10.0pt}{34}{500}{694}{0}{0}\n";
print F "\\setrawglyph{numbersign}{cmr10}{10.0pt}{35}{833}{694}{194}{0}\n";
print F "\\setrawglyph{dollar}{cmr10}{10.0pt}{36}{500}{750}{55}{0}\n";
print F "\\setrawglyph{percent}{cmr10}{10.0pt}{37}{833}{750}{55}{0}\n";
print F "\\setrawglyph{ampersand}{cmr10}{10.0pt}{38}{777}{694}{0}{0}\n";
print F "\\setrawglyph{quoteright}{cmr10}{10.0pt}{39}{277}{694}{0}{0}\n";
print F "\\setrawglyph{parenleft}{cmr10}{10.0pt}{40}{388}{750}{250}{0}\n";
print F "\\setrawglyph{parenright}{cmr10}{10.0pt}{41}{388}{750}{250}{0}\n";
print F "\\setrawglyph{asterisk}{cmr10}{10.0pt}{42}{500}{750}{0}{0}\n";
print F "\\setrawglyph{plus}{cmr10}{10.0pt}{43}{777}{583}{83}{0}\n";
print F "\\setrawglyph{comma}{cmr10}{10.0pt}{44}{277}{105}{194}{0}\n";
print F "\\setrawglyph{hyphen}{cmr10}{10.0pt}{45}{333}{430}{0}{0}\n";
print F "\\setrawglyph{period}{cmr10}{10.0pt}{46}{277}{105}{0}{0}\n";
print F "\\setrawglyph{slash}{cmr10}{10.0pt}{47}{500}{750}{250}{0}\n";
print F "\\setrawglyph{zero}{cmr10}{10.0pt}{48}{500}{644}{0}{0}\n";
print F "\\setrawglyph{one}{cmr10}{10.0pt}{49}{500}{644}{0}{0}\n";
print F "\\setrawglyph{two}{cmr10}{10.0pt}{50}{500}{644}{0}{0}\n";
print F "\\setrawglyph{three}{cmr10}{10.0pt}{51}{500}{644}{0}{0}\n";
print F "\\setrawglyph{four}{cmr10}{10.0pt}{52}{500}{644}{0}{0}\n";
print F "\\setrawglyph{five}{cmr10}{10.0pt}{53}{500}{644}{0}{0}\n";
print F "\\setrawglyph{six}{cmr10}{10.0pt}{54}{500}{644}{0}{0}\n";
print F "\\setrawglyph{seven}{cmr10}{10.0pt}{55}{500}{644}{0}{0}\n";
print F "\\setrawglyph{eight}{cmr10}{10.0pt}{56}{500}{644}{0}{0}\n";
print F "\\setrawglyph{nine}{cmr10}{10.0pt}{57}{500}{644}{0}{0}\n";
print F "\\setrawglyph{colon}{cmr10}{10.0pt}{58}{277}{430}{0}{0}\n";
print F "\\setrawglyph{semicolon}{cmr10}{10.0pt}{59}{277}{430}{194}{0}\n";
print F "\\setrawglyph{exclamdown}{cmr10}{10.0pt}{60}{277}{500}{194}{0}\n";
print F "\\setrawglyph{equal}{cmr10}{10.0pt}{61}{777}{366}{-133}{0}\n";
print F "\\setrawglyph{questiondown}{cmr10}{10.0pt}{62}{472}{500}{194}{0}\n";
print F "\\setrawglyph{question}{cmr10}{10.0pt}{63}{472}{694}{0}{0}\n";
print F "\\setrawglyph{at}{cmr10}{10.0pt}{64}{777}{694}{0}{0}\n";
print F "\\setrawglyph{A}{cmr10}{10.0pt}{65}{750}{683}{0}{0}\n";
print F "\\setrawglyph{B}{cmr10}{10.0pt}{66}{708}{683}{0}{0}\n";
print F "\\setrawglyph{C}{cmr10}{10.0pt}{67}{722}{683}{0}{0}\n";
print F "\\setrawglyph{D}{cmr10}{10.0pt}{68}{763}{683}{0}{0}\n";
print F "\\setrawglyph{E}{cmr10}{10.0pt}{69}{680}{683}{0}{0}\n";
print F "\\setrawglyph{F}{cmr10}{10.0pt}{70}{652}{683}{0}{0}\n";
print F "\\setrawglyph{G}{cmr10}{10.0pt}{71}{784}{683}{0}{0}\n";
print F "\\setrawglyph{H}{cmr10}{10.0pt}{72}{750}{683}{0}{0}\n";
print F "\\setrawglyph{I}{cmr10}{10.0pt}{73}{361}{683}{0}{0}\n";
print F "\\setrawglyph{J}{cmr10}{10.0pt}{74}{513}{683}{0}{0}\n";
print F "\\setrawglyph{K}{cmr10}{10.0pt}{75}{777}{683}{0}{0}\n";
print F "\\setrawglyph{L}{cmr10}{10.0pt}{76}{625}{683}{0}{0}\n";
print F "\\setrawglyph{M}{cmr10}{10.0pt}{77}{916}{683}{0}{0}\n";
print F "\\setrawglyph{N}{cmr10}{10.0pt}{78}{750}{683}{0}{0}\n";
print F "\\setrawglyph{O}{cmr10}{10.0pt}{79}{777}{683}{0}{0}\n";
print F "\\setrawglyph{P}{cmr10}{10.0pt}{80}{680}{683}{0}{0}\n";
print F "\\setrawglyph{Q}{cmr10}{10.0pt}{81}{777}{683}{194}{0}\n";
print F "\\setrawglyph{R}{cmr10}{10.0pt}{82}{736}{683}{0}{0}\n";
print F "\\setrawglyph{S}{cmr10}{10.0pt}{83}{555}{683}{0}{0}\n";
print F "\\setrawglyph{T}{cmr10}{10.0pt}{84}{722}{683}{0}{0}\n";
print F "\\setrawglyph{U}{cmr10}{10.0pt}{85}{750}{683}{0}{0}\n";
print F "\\setrawglyph{V}{cmr10}{10.0pt}{86}{750}{683}{0}{13}\n";
print F "\\setrawglyph{W}{cmr10}{10.0pt}{87}{1027}{683}{0}{13}\n";
print F "\\setrawglyph{X}{cmr10}{10.0pt}{88}{750}{683}{0}{0}\n";
print F "\\setrawglyph{Y}{cmr10}{10.0pt}{89}{750}{683}{0}{25}\n";
print F "\\setrawglyph{Z}{cmr10}{10.0pt}{90}{611}{683}{0}{0}\n";
print F "\\setrawglyph{bracketleft}{cmr10}{10.0pt}{91}{277}{750}{250}{0}\n";
print F "\\setrawglyph{quotedblleft}{cmr10}{10.0pt}{92}{500}{694}{0}{0}\n";
print F "\\setrawglyph{bracketright}{cmr10}{10.0pt}{93}{277}{750}{250}{0}\n";
print F "\\setrawglyph{circumflex}{cmr10}{10.0pt}{94}{500}{694}{0}{0}\n";
print F "\\setrawglyph{dotaccent}{cmr10}{10.0pt}{95}{277}{667}{0}{0}\n";
print F "\\setrawglyph{quoteleft}{cmr10}{10.0pt}{96}{277}{694}{0}{0}\n";
print F "\\setrawglyph{a}{cmr10}{10.0pt}{97}{500}{430}{0}{0}\n";
print F "\\setrawglyph{b}{cmr10}{10.0pt}{98}{555}{694}{0}{0}\n";
print F "\\setrawglyph{c}{cmr10}{10.0pt}{99}{444}{430}{0}{0}\n";
print F "\\setrawglyph{d}{cmr10}{10.0pt}{100}{555}{694}{0}{0}\n";
print F "\\setrawglyph{e}{cmr10}{10.0pt}{101}{444}{430}{0}{0}\n";
print F "\\setrawglyph{f}{cmr10}{10.0pt}{102}{305}{694}{0}{77}\n";
print F "\\setrawglyph{g}{cmr10}{10.0pt}{103}{500}{430}{194}{13}\n";
print F "\\setrawglyph{h}{cmr10}{10.0pt}{104}{555}{694}{0}{0}\n";
print F "\\setrawglyph{i}{cmr10}{10.0pt}{105}{277}{667}{0}{0}\n";
print F "\\setrawglyph{j}{cmr10}{10.0pt}{106}{305}{667}{194}{0}\n";
print F "\\setrawglyph{k}{cmr10}{10.0pt}{107}{527}{694}{0}{0}\n";
print F "\\setrawglyph{l}{cmr10}{10.0pt}{108}{277}{694}{0}{0}\n";
print F "\\setrawglyph{m}{cmr10}{10.0pt}{109}{833}{430}{0}{0}\n";
print F "\\setrawglyph{n}{cmr10}{10.0pt}{110}{555}{430}{0}{0}\n";
print F "\\setrawglyph{o}{cmr10}{10.0pt}{111}{500}{430}{0}{0}\n";
print F "\\setrawglyph{p}{cmr10}{10.0pt}{112}{555}{430}{194}{0}\n";
print F "\\setrawglyph{q}{cmr10}{10.0pt}{113}{527}{430}{194}{0}\n";
print F "\\setrawglyph{r}{cmr10}{10.0pt}{114}{391}{430}{0}{0}\n";
print F "\\setrawglyph{s}{cmr10}{10.0pt}{115}{394}{430}{0}{0}\n";
print F "\\setrawglyph{t}{cmr10}{10.0pt}{116}{388}{615}{0}{0}\n";
print F "\\setrawglyph{u}{cmr10}{10.0pt}{117}{555}{430}{0}{0}\n";
print F "\\setrawglyph{v}{cmr10}{10.0pt}{118}{527}{430}{0}{13}\n";
print F "\\setrawglyph{w}{cmr10}{10.0pt}{119}{722}{430}{0}{13}\n";
print F "\\setrawglyph{x}{cmr10}{10.0pt}{120}{527}{430}{0}{0}\n";
print F "\\setrawglyph{y}{cmr10}{10.0pt}{121}{527}{430}{194}{13}\n";
print F "\\setrawglyph{z}{cmr10}{10.0pt}{122}{444}{430}{0}{0}\n";
print F "\\setrawglyph{rangedash}{cmr10}{10.0pt}{123}{500}{430}{0}{27}\n";
print F "\\setrawglyph{punctdash}{cmr10}{10.0pt}{124}{1000}{430}{0}{27}\n";
print F "\\setrawglyph{hungarumlaut}{cmr10}{10.0pt}{125}{500}{694}{0}{0}\n";
print F "\\setrawglyph{tilde}{cmr10}{10.0pt}{126}{500}{667}{0}{0}\n";
print F "\\setrawglyph{dieresis}{cmr10}{10.0pt}{127}{500}{667}{0}{0}\n";
print F "\n";
print F "\\endmetrics\n";
close F;

open(F, ">caracteres.tex") || die "Cannot open caracteres.tex for writing: ";
print F "\\input symboles\n";
print F "\\input chiffres\n";
print F "\\input minuscules\n";
print F "\\input majuscules\n";
close F;

open(F, ">chiffres.tex") || die "Cannot open chiffres.tex for writing: ";
print F "\\doit{eight}\n";
print F "\\doit{five}\n";
print F "\\doit{four}\n";
print F "\\doit{nine}\n";
print F "\\doit{one}\n";
print F "\\doit{seven}\n";
print F "\\doit{six}\n";
print F "\\doit{three}\n";
print F "\\doit{two}\n";
print F "\\doit{zero}\n";
close F;

open(F, ">majuscules.tex") || die "Cannot open majuscules.tex for writing: ";
print F "\\doit{AE}\n";
print F "\\doit{Aacute}\n";
print F "\\doit{Abreve}\n";
print F "\\doit{Acircumflex}\n";
print F "\\doit{Acute}\n";
print F "\\doit{Adieresis}\n";
print F "\\doit{Agrave}\n";
print F "\\doit{Aogonek}\n";
print F "\\doit{Aring}\n";
print F "\\doit{Atilde}\n";
print F "\\doit{A}\n";
print F "\\doit{Breve}\n";
print F "\\doit{B}\n";
print F "\\doit{Cacute}\n";
print F "\\doit{Caron}\n";
print F "\\doit{Ccaron}\n";
print F "\\doit{Ccedilla}\n";
print F "\\doit{Cedilla}\n";
print F "\\doit{Circumflex}\n";
print F "\\doit{C}\n";
print F "\\doit{Dbar}\n";
print F "\\doit{Dcaron}\n";
print F "\\doit{Dieresis}\n";
print F "\\doit{Dotaccent}\n";
print F "\\doit{D}\n";
print F "\\doit{Eacute}\n";
print F "\\doit{Ecaron}\n";
print F "\\doit{Ecircumflex}\n";
print F "\\doit{Edieresis}\n";
print F "\\doit{Egrave}\n";
print F "\\doit{Eogonek}\n";
print F "\\doit{Eth}\n";
print F "\\doit{E}\n";
print F "\\doit{FFI}\n";
print F "\\doit{FFL}\n";
print F "\\doit{FF}\n";
print F "\\doit{FI}\n";
print F "\\doit{FL}\n";
print F "\\doit{F}\n";
print F "\\doit{Gbreve}\n";
print F "\\doit{Grave}\n";
print F "\\doit{G}\n";
print F "\\doit{Hungarumlaut}\n";
print F "\\doit{H}\n";
print F "\\doit{IJ}\n";
print F "\\doit{Iacute}\n";
print F "\\doit{Icircumflex}\n";
print F "\\doit{Idieresis}\n";
print F "\\doit{Idotaccent}\n";
print F "\\doit{Igrave}\n";
print F "\\doit{I}\n";
print F "\\doit{J}\n";
print F "\\doit{K}\n";
print F "\\doit{Lacute}\n";
print F "\\doit{Lcaron}\n";
print F "\\doit{Lslash}\n";
print F "\\doit{L}\n";
print F "\\doit{Macron}\n";
print F "\\doit{M}\n";
print F "\\doit{Nacute}\n";
print F "\\doit{Ncaron}\n";
print F "\\doit{Ng}\n";
print F "\\doit{Ntilde}\n";
print F "\\doit{N}\n";
print F "\\doit{OE}\n";
print F "\\doit{Oacute}\n";
print F "\\doit{Ocircumflex}\n";
print F "\\doit{Odieresis}\n";
print F "\\doit{Ogonek}\n";
print F "\\doit{Ograve}\n";
print F "\\doit{Ohungarumlaut}\n";
print F "\\doit{Oslash}\n";
print F "\\doit{Otilde}\n";
print F "\\doit{O}\n";
print F "\\doit{P}\n";
print F "\\doit{Q}\n";
print F "\\doit{Racute}\n";
print F "\\doit{Rcaron}\n";
print F "\\doit{Ring}\n";
print F "\\doit{R}\n";
print F "\\doit{SS}\n";
print F "\\doit{Sacute}\n";
print F "\\doit{Scaron}\n";
print F "\\doit{Scedilla}\n";
print F "\\doit{S}\n";
print F "\\doit{Tcaron}\n";
print F "\\doit{Tcedilla}\n";
print F "\\doit{Thorn}\n";
print F "\\doit{Tilde}\n";
print F "\\doit{T}\n";
print F "\\doit{Uacute}\n";
print F "\\doit{Ucircumflex}\n";
print F "\\doit{Udieresis}\n";
print F "\\doit{Ugrave}\n";
print F "\\doit{Uhungarumlaut}\n";
print F "\\doit{Uring}\n";
print F "\\doit{U}\n";
print F "\\doit{V}\n";
print F "\\doit{W}\n";
print F "\\doit{X}\n";
print F "\\doit{Yacute}\n";
print F "\\doit{Ydieresis}\n";
print F "\\doit{Y}\n";
print F "\\doit{Zacute}\n";
print F "\\doit{Zcaron}\n";
print F "\\doit{Zdotaccent}\n";
print F "\\doit{Z}\n";
print F "\\doit{dotlessI}\n";
print F "\\doit{dotlessJ}\n";
close F;

open(F, ">minuscules.tex") || die "Cannot open minuscules.tex for writing: ";
print F "\\doit{aacute}\n";
print F "\\doit{abreve}\n";
print F "\\doit{acircumflex}\n";
print F "\\doit{acute}\n";
print F "\\doit{adieresis}\n";
print F "\\doit{ae}\n";
print F "\\doit{agrave}\n";
print F "\\doit{aogonek}\n";
print F "\\doit{aring}\n";
print F "\\doit{atilde}\n";
print F "\\doit{a}\n";
print F "\\doit{breve}\n";
print F "\\doit{b}\n";
print F "\\doit{cacute}\n";
print F "\\doit{caron}\n";
print F "\\doit{ccaron}\n";
print F "\\doit{ccedilla}\n";
print F "\\doit{cedilla}\n";
print F "\\doit{circumflex}\n";
print F "\\doit{c}\n";
print F "\\doit{dbar}\n";
print F "\\doit{dcaron}\n";
print F "\\doit{dieresis}\n";
print F "\\doit{dotaccent}\n";
print F "\\doit{dotlessi}\n";
print F "\\doit{dotlessj}\n";
print F "\\doit{d}\n";
print F "\\doit{eacute}\n";
print F "\\doit{ecaron}\n";
print F "\\doit{ecircumflex}\n";
print F "\\doit{edieresis}\n";
print F "\\doit{egrave}\n";
print F "\\doit{eogonek}\n";
print F "\\doit{eth}\n";
print F "\\doit{e}\n";
print F "\\doit{ffi}\n";
print F "\\doit{ffl}\n";
print F "\\doit{ff}\n";
print F "\\doit{fi}\n";
print F "\\doit{fl}\n";
print F "\\doit{f}\n";
print F "\\doit{gbreve}\n";
print F "\\doit{germandbls}\n";
print F "\\doit{grave}\n";
print F "\\doit{g}\n";
print F "\\doit{hungarumlaut}\n";
print F "\\doit{h}\n";
print F "\\doit{iacute}\n";
print F "\\doit{icircumflex}\n";
print F "\\doit{idieresis}\n";
print F "\\doit{idotaccent}\n";
print F "\\doit{igrave}\n";
print F "\\doit{ij}\n";
print F "\\doit{i}\n";
print F "\\doit{j}\n";
print F "\\doit{k}\n";
print F "\\doit{lacute}\n";
print F "\\doit{lcaron}\n";
print F "\\doit{lslash}\n";
print F "\\doit{l}\n";
print F "\\doit{macron}\n";
print F "\\doit{m}\n";
print F "\\doit{nacute}\n";
print F "\\doit{ncaron}\n";
print F "\\doit{ng}\n";
print F "\\doit{ntilde}\n";
print F "\\doit{n}\n";
print F "\\doit{oacute}\n";
print F "\\doit{ocircumflex}\n";
print F "\\doit{odieresis}\n";
print F "\\doit{oe}\n";
print F "\\doit{ogonek}\n";
print F "\\doit{ograve}\n";
print F "\\doit{ohungarumlaut}\n";
print F "\\doit{oslash}\n";
print F "\\doit{otilde}\n";
print F "\\doit{o}\n";
print F "\\doit{p}\n";
print F "\\doit{q}\n";
print F "\\doit{racute}\n";
print F "\\doit{rcaron}\n";
print F "\\doit{ring}\n";
print F "\\doit{r}\n";
print F "\\doit{sacute}\n";
print F "\\doit{scaron}\n";
print F "\\doit{scedilla}\n";
print F "\\doit{s}\n";
print F "\\doit{tcaron}\n";
print F "\\doit{tcedilla}\n";
print F "\\doit{thorn}\n";
print F "\\doit{tilde}\n";
print F "\\doit{t}\n";
print F "\\doit{uacute}\n";
print F "\\doit{ucircumflex}\n";
print F "\\doit{udieresis}\n";
print F "\\doit{ugrave}\n";
print F "\\doit{uhungarumlaut}\n";
print F "\\doit{uring}\n";
print F "\\doit{u}\n";
print F "\\doit{v}\n";
print F "\\doit{w}\n";
print F "\\doit{x}\n";
print F "\\doit{yacute}\n";
print F "\\doit{ydieresis}\n";
print F "\\doit{y}\n";
print F "\\doit{zacute}\n";
print F "\\doit{zcaron}\n";
print F "\\doit{zdotaccent}\n";
print F "\\doit{z}\n";
close F;

open(F, ">symboles.tex") || die "Cannot open symboles.tex for writing: ";
print F "\\doit{quotesinglbase}\n";
print F "\\doit{guilsinglleft}\n";
print F "\\doit{guilsinglright}\n";
print F "\\doit{quotedblleft}\n";
print F "\\doit{quotedblright}\n";
print F "\\doit{quotedblbase}\n";
print F "\\doit{guillemotleft}\n";
print F "\\doit{guillemotright}\n";
print F "\\doit{rangedash}\n";
print F "\\doit{punctdash}\n";
print F "\\doit{compwordmark}\n";
print F "\\doit{perthousandzero}\n";
print F "\\doit{visiblespace}\n";
print F "\\doit{exclam}\n";
print F "\\doit{quotedbl}\n";
print F "\\doit{numbersign}\n";
print F "\\doit{dollar}\n";
print F "\\doit{percent}\n";
print F "\\doit{ampersand}\n";
print F "\\doit{quoteright}\n";
print F "\\doit{parenleft}\n";
print F "\\doit{parenright}\n";
print F "\\doit{asterisk}\n";
print F "\\doit{plus}\n";
print F "\\doit{comma}\n";
print F "\\doit{hyphen}\n";
print F "\\doit{period}\n";
print F "\\doit{slash}\n";
print F "\\doit{colon}\n";
print F "\\doit{semicolon}\n";
print F "\\doit{less}\n";
print F "\\doit{equal}\n";
print F "\\doit{greater}\n";
print F "\\doit{question}\n";
print F "\\doit{at}\n";
print F "\\doit{bracketleft}\n";
print F "\\doit{backslash}\n";
print F "\\doit{bracketright}\n";
print F "\\doit{asciicircum}\n";
print F "\\doit{underscore}\n";
print F "\\doit{quoteleft}\n";
print F "\\doit{braceleft}\n";
print F "\\doit{bar}\n";
print F "\\doit{braceright}\n";
print F "\\doit{asciitilde}\n";
print F "\\doit{hyphenchar}\n";
print F "\\doit{section}\n";
print F "\\doit{exclamdown}\n";
print F "\\doit{questiondown}\n";
print F "\\doit{sterling}\n";
close F;

open(F, ">font-toto.sty") || die "Cannot open font-toto.sty for writing: ";
print F "\\ProvidesFile{font-toto.sty}\n";
print F "\\ProvidesPackage{font-toto}\n";
print F "\\expandafter\\newif\\csname if\@toto\@default\\endcsname\n";
print F "\\csname \@toto\@defaultfalse\\endcsname\n";
print F "\\DeclareOption{default}{\\csname \@toto\@defaulttrue\\endcsname}\n";
print F "\\ProcessOptions\n";
print F "\\expandafter\\def\\csname texttoto\\endcsname#1{{\\fontencoding{T1}\\fontfamily{toto}\\selectfont #1}}\n";
print F "\\csname if\@toto\@default\\endcsname\n";
print F "  \\def\\encodingdefault{T1}\n";
print F "  \\def\\familydefault{toto}\n";
print F "  \\def\\bfdefault{b}\n";
print F "\\fi\n";
print F "\\endinput\n";
close F;

open(F, ">test-toto-1.tex") || die "Cannot open test-toto-1.tex for writing: ";
print F "\\documentclass[a4paper,12pt]{article}\n";
print F "\\usepackage{fontsmpl}\n";
print F "\\usepackage[default]{font-toto}\n";
print F "\\begin{document}\n";
print F "\\fontsample\n";
print F "\\end{document}\n";
close F;

open(F, ">test-toto-2.tex") || die "Cannot open test-toto-2.tex for writing: ";
print F "\\documentclass[a4paper,12pt]{article}\n";
print F "\\usepackage{fontsmpl}\n";
print F "\\usepackage{amsmath,amssymb}\n";
print F "\\usepackage[default]{font-toto}\n";
print F "\\begin{document}\n";
print F "Ceci est un texte simple, avec du \\textbf{gras}, de l'\\emph{italique},\n";
print F "du \\emph{\\textbf{gras} italique} et même des \n";
print F "\\textsc{Petites Capitales}...\n";
print F "\n";
print F "Voici maintenant un peu de mathématiques : pour tout réel \$x\$, on pose\n";
print F "\$\$f(x) = \\dfrac{\\sin x}{\\sqrt{1+\\cos^2 x}}. \$\$\n";
print F "\\end{document}\n";
close F;

open(F, ">test-toto-3.tex") || die "Cannot open test-toto-3.tex for writing: ";
print F "\\documentclass[a4paper,12pt]{article}\n";
print F "\\usepackage{amsmath,amssymb}\n";
print F "\\usepackage[default]{font-toto}\n";
print F "\\begin{document}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/m/n}{\\usefont{T1}{toto}{m}{n}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/m/sl}{\\usefont{T1}{toto}{m}{sl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/m/sc}{\\usefont{T1}{toto}{m}{sc}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/m/scsl}{\\usefont{T1}{toto}{m}{scsl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/m/it}{\\usefont{T1}{toto}{m}{it}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/m/scit}{\\usefont{T1}{toto}{m}{scit}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/c/n}{\\usefont{T1}{toto}{c}{n}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/c/sl}{\\usefont{T1}{toto}{c}{sl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/c/sc}{\\usefont{T1}{toto}{c}{sc}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/c/scsl}{\\usefont{T1}{toto}{c}{scsl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/c/it}{\\usefont{T1}{toto}{c}{it}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/c/scit}{\\usefont{T1}{toto}{c}{scit}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/x/n}{\\usefont{T1}{toto}{x}{n}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/x/sl}{\\usefont{T1}{toto}{x}{sl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/x/sc}{\\usefont{T1}{toto}{x}{sc}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/x/scsl}{\\usefont{T1}{toto}{x}{scsl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/x/it}{\\usefont{T1}{toto}{x}{it}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/x/scit}{\\usefont{T1}{toto}{x}{scit}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/b/n}{\\usefont{T1}{toto}{b}{n}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/b/sl}{\\usefont{T1}{toto}{b}{sl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/b/sc}{\\usefont{T1}{toto}{b}{sc}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/b/scsl}{\\usefont{T1}{toto}{b}{scsl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/b/it}{\\usefont{T1}{toto}{b}{it}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/b/scit}{\\usefont{T1}{toto}{b}{scit}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bc/n}{\\usefont{T1}{toto}{bc}{n}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bc/sl}{\\usefont{T1}{toto}{bc}{sl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bc/sc}{\\usefont{T1}{toto}{bc}{sc}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bc/scsl}{\\usefont{T1}{toto}{bc}{scsl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bc/it}{\\usefont{T1}{toto}{bc}{it}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bc/scit}{\\usefont{T1}{toto}{bc}{scit}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bx/n}{\\usefont{T1}{toto}{bx}{n}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bx/sl}{\\usefont{T1}{toto}{bx}{sl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bx/sc}{\\usefont{T1}{toto}{bx}{sc}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bx/scsl}{\\usefont{T1}{toto}{bx}{scsl}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bx/it}{\\usefont{T1}{toto}{bx}{it}The quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\par\\noindent\\mbox{}\\llap{toto/bx/scit}{\\usefont{T1}{toto}{bx}{scit}The\n";
print F "  quick brown fox... -- << ff >> àùèéîÏñæ\\oe fi ffi fl ffl ft fft fff}\n";
print F "\\end{document}\n";
close F;

}
package Log;
use strict;
use Carp qw(:DEFAULT cluck);

use constant TRUE  => (0==0);
use constant FALSE => (0==1);

use constant NORMAL  => "normal";
use constant SMALLCAPS => "smallcaps";
use constant EXPERT  => "expert";
use constant MEDIUM  => "medium";
use constant BOLD    => "bold";
use constant UPRIGHT => "upright";
use constant ITALICS => "italics";
use constant SLANTED => "slanted";
use constant UPRIGHTITALICS => "uprightitalics";
use constant NORMALCAPS  => "normalcaps";
use constant ALLCAPS     => "allcaps";
use constant CONDENSED   => "condensed";
use constant EXTENDED    => "extended";

use constant TTF => "ttf";
use constant AFM => "afm";

our @caps = (NORMALCAPS, SMALLCAPS); # RAJOUTER ALLCAPS
our @shape = (UPRIGHT, SLANTED, ITALICS, UPRIGHTITALICS);
our @width = (NORMAL, CONDENSED, EXTENDED);
our @series = (MEDIUM, BOLD);

#@caps=(NORMALCAPS); @shape=(UPRIGHT); @width=(NORMAL); @series=(MEDIUM);

our @test_files = qw/test-toto-1 test-toto-2 test-toto-3/;


sub debug {
  shift;
  print STDERR "@_\n";
}

sub system {
  my ($command) = @_;
  log_append("$command\n");
#  CORE::system "($command) >/dev/null 2>&1";
  CORE::system "$command";
}

sub latex {
  my ($file) = @_;
  Log::system "latex --interaction=nonstopmode $file";
}

sub mkdir ($) {
  my ($rep) = @_;
  log_append("mkdir $rep\n");
  CORE::mkdir $rep, 0777 || die "Cannot mkdir $rep: $!";
}

sub chdir ($) {
  my ($rep) = @_;
  log_append("chdir $rep\n");
  CORE::chdir $rep || die "Cannot chdir to $rep: $!";
}

sub append {
  my $file = shift;
  my @lines = @_;
  confess "Filename `$file' contains strange characters"
    unless $file =~ m|^[-0-9A-Za-z_=./]*$|;
  open(APPEND, ">>$file") || confess "Cannot open $file for appending: $!";
  foreach(@lines){
    print APPEND $_;
    s/\'/\\\'/g;
    my $echo = "echo";
    $echo .= " -n" if chomp;
    log_append("$echo '$_' >>$file\n");
  }
  close APPEND;
}

BEGIN { unlink "log"; }
sub log_append {
  my @lines = @_;
  open(APPEND, ">>log") || confess "Cannot open log for appending: $!";
  foreach(@lines){
    print APPEND $_;
    print STDERR ">> $_";
  }
  close APPEND;
}

sub write {
  my $file = shift;
  my @lines = @_;
  confess "Filename `$file' contains strange characters"
    unless $file =~ m|^[-0-9A-Za-z_=./]*$|;
  open(WRITE, ">$file") || confess "Cannot open $file for writing: $!";
  log_append("rm -f $file\n");
  foreach(@lines){
    print WRITE $_;
    s/\'/\\\'/g;
    my $echo = "echo";
    $echo .= " -n" if chomp;
    log_append("$echo '$_' >>$file\n");
  }
  close WRITE;
}

sub remplace {
  my ($a, $b, $in, $out) = @_;
  unless( defined $out ){
    $out = $in;
    $out =~ s/$a/$b/g;
  }
  confess "input file ($in) and output file ($out) are the same"
    if $in eq $out;
  open(F, $in)     || die "Cannot open $in for reading: $!";
  open(G, ">$out") || die "Cannot open $out for writing: $!";
  while(<F>){
    s/$a/$b/g;
    print G;
  }
  close F;
  close G;
  log_append("perl -p -e 's/$a/$b/g' $in >$out\n");
}
package Start;
use strict;
use Carp qw(:DEFAULT cluck);

use constant TRUE  => (0==0);
use constant FALSE => (0==1);

use constant NORMAL  => "normal";
use constant SMALLCAPS => "smallcaps";
use constant EXPERT  => "expert";
use constant MEDIUM  => "medium";
use constant BOLD    => "bold";
use constant UPRIGHT => "upright";
use constant ITALICS => "italics";
use constant SLANTED => "slanted";
use constant UPRIGHTITALICS => "uprightitalics";
use constant NORMALCAPS  => "normalcaps";
use constant ALLCAPS     => "allcaps";
use constant CONDENSED   => "condensed";
use constant EXTENDED    => "extended";

use constant TTF => "ttf";
use constant AFM => "afm";

our @caps = (NORMALCAPS, SMALLCAPS); # RAJOUTER ALLCAPS
our @shape = (UPRIGHT, SLANTED, ITALICS, UPRIGHTITALICS);
our @width = (NORMAL, CONDENSED, EXTENDED);
our @series = (MEDIUM, BOLD);

#@caps=(NORMALCAPS); @shape=(UPRIGHT); @width=(NORMAL); @series=(MEDIUM);

our @test_files = qw/test-toto-1 test-toto-2 test-toto-3/;

use Getopt::Long;

our $ECENC;
our $texmf;
our $configps;
our $pdftexcfg;
our %optctl = ();

sub start {
  GetOptions(\%optctl,
	     "name=s",
	     "roman=s", "italic=s", "bold=s", "bolditalic=s",
	     "symbols", "initials",
	     "condensed=s", "extended=s", "slant=s", "texte=s", "epais=s",
	     "texmf=s",
	     "configps=s", "pdftexcfg=s",
	    );

  $ECENC = (`kpsewhich ec.enc` =~ m/^\s*$/ms) ? "EC.enc" : "ec.enc";
  my $uname = `uname`;
  chomp($uname);

  $texmf = $optctl{texmf};
  $texmf = "$ENV{HOME}/gnu/$uname/lib/texmf_FONTS" unless $texmf;

  $configps = $optctl{configps};
  $configps = "$texmf/dvips/config/config.ps" unless $configps;

  $pdftexcfg = $optctl{pdftexcfg};
  $pdftexcfg = "$texmf/pdftex/config/pdftex.cfg" unless $pdftexcfg;

  Log::debug(1, "TEXMF=$texmf");
  Log::debug(1, "config.ps=$configps");
  Log::debug(1, "pdftex.cfg=$pdftexcfg");
  Log::debug(1, "ec.enc=$ECENC");

  Log::mkdir "$texmf";
  Log::mkdir "$texmf/tex";
  Log::mkdir "$texmf/tex/generic";
  Log::mkdir "$texmf/fonts";
  Log::mkdir "$texmf/fonts/tfm";
  Log::mkdir "$texmf/fonts/type1";
  Log::mkdir "$texmf/fonts/truetype";
  Log::mkdir "$texmf/fonts/vf";
  Log::mkdir "$texmf/fonts/tfm";
  Log::mkdir "$texmf/fonts/afm";
}

start();
package Font;
use strict;
use Carp qw(:DEFAULT cluck);

use constant TRUE  => (0==0);
use constant FALSE => (0==1);

use constant NORMAL  => "normal";
use constant SMALLCAPS => "smallcaps";
use constant EXPERT  => "expert";
use constant MEDIUM  => "medium";
use constant BOLD    => "bold";
use constant UPRIGHT => "upright";
use constant ITALICS => "italics";
use constant SLANTED => "slanted";
use constant UPRIGHTITALICS => "uprightitalics";
use constant NORMALCAPS  => "normalcaps";
use constant ALLCAPS     => "allcaps";
use constant CONDENSED   => "condensed";
use constant EXTENDED    => "extended";

use constant TTF => "ttf";
use constant AFM => "afm";

our @caps = (NORMALCAPS, SMALLCAPS); # RAJOUTER ALLCAPS
our @shape = (UPRIGHT, SLANTED, ITALICS, UPRIGHTITALICS);
our @width = (NORMAL, CONDENSED, EXTENDED);
our @series = (MEDIUM, BOLD);

#@caps=(NORMALCAPS); @shape=(UPRIGHT); @width=(NORMAL); @series=(MEDIUM);

our @test_files = qw/test-toto-1 test-toto-2 test-toto-3/;


sub new {
  my $proto = shift;
  my $class = ref($proto) || $proto;
  my $name = shift;
  my $type = shift;
  my $self  = { data => {
			 "normal/medium/upright" => undef,
			 "normal/medium/italics" => undef,
			 "normal/bold/upright" => undef,
			 "normal/bold/italics" => undef,
			 "smallcaps/medium/upright" => undef,
			 "smallcaps/medium/italics" => undef,
			 "smallcaps/bold/upright" => undef,
			 "smallcaps/bold/italics" => undef,
			 "expert/medium/upright" => undef,
			 "expert/medium/italics" => undef,
			 "expert/bold/upright" => undef,
			 "expert/bold/italics" => undef,
			},
		name => $name,
		type => $type,
	      };
  bless ($self, $class);
  return $self;
}

sub _check_arg {
  my ($text, $arg, @list) = @_;
  foreach(@list){ return if $arg eq $_ }
  cluck "$text should be one of @list, but I got `$arg'";
}

sub set {
  my $self = shift;
  my ($fontset, $series, $shape, $file) = @_;
  _check_arg("fontset", $fontset, NORMAL, SMALLCAPS, EXPERT);
  _check_arg("series", $series, BOLD, MEDIUM);
  _check_arg("shape", $shape, UPRIGHT, ITALICS);
  cluck "BEWARE: $fontset/$series/$shape already exists"
    if defined $self->{data}->{"$fontset/$series/$shape"};
  $self->{data}->{"$fontset/$series/$shape"} = $file;
}

sub get {
  my $self = shift;
  my ($fontset, $series, $shape) = @_;
  _check_arg("fontset", $fontset, NORMAL, SMALLCAPS, EXPERT);
  _check_arg("series", $series, BOLD, MEDIUM);
  _check_arg("shape", $shape, UPRIGHT, ITALICS);
  confess "bug" unless exists $self->{data}->{"$fontset/$series/$shape"};
  $self->{data}->{"$fontset/$series/$shape"};
}

sub has {
  my $self = shift;
  return defined $self->get(@_);
}

sub files {
  my $self = shift;
  my @result = ();
  foreach my $k (keys %{$self->{data}} ){
    push @result, $self->{data}->{$k} if defined $self->{data}->{$k};
  }
  return @result;
}

sub name{
  my $self = shift;
  return $self->{name};
}

sub type{
  my $self = shift;
  return $self->{type};
}

sub set_slant {
  my $self = shift;
  $self->{slant} = shift;
}

sub slant {
  my $self = shift;
  return $self->{slant} || .33;
}

sub process {
  my $self = shift;
  $self->start_fd();
  foreach my $caps (@caps){
    foreach my $series (@series){
      foreach my $shape (@shape){
	foreach my $width (@width){

	  $self->make($caps, $series, $shape, $width);

	}
      }
    }
  }
  $self->make_sty();
  $self->make_test_files();
  $self->install();
}

sub make {
  my $self = shift;
  my ($caps, $series, $shape, $width) = @_;
  my $name = $self->name;
  _check_arg("caps", $caps, NORMALCAPS, SMALLCAPS, ALLCAPS);
  _check_arg("series", $series, BOLD, MEDIUM);
  _check_arg("shape", $shape, UPRIGHT, ITALICS, SLANTED, UPRIGHTITALICS);
  _check_arg("width", $width, NORMAL, EXTENDED, CONDENSED);

  # Regardons s'il faut pencher la fonte
  my $slant = 0;
  $slant =  $self->slant if $shape eq SLANTED;
  $slant = -$self->slant if $shape eq UPRIGHTITALICS;

  # Regardons s'il faut condenser ou étirer la fonte
  my $extend = 1;
  $extend = 2 if $width eq EXTENDED;
  $extend = .5 if $width eq CONDENSED;

  # Quelle est la fonte de départ ?
  my $from_shape = $shape;
  $from_shape = UPRIGHT if $shape eq SLANTED;
  $from_shape = ITALICS if $shape eq UPRIGHTITALICS;
  my $from_series = $series;
  my $from_fontset = NORMAL;
  $from_fontset = SMALLCAPS if $caps eq SMALLCAPS;

  # Faut-il de fausses petites capitales ?
  my $fake_small_caps = FALSE;
  if( not $self->has($from_fontset, $from_series, $from_shape)
      and ($from_fontset eq SMALLCAPS) ){
    $fake_small_caps = TRUE;
    $from_fontset = NORMAL;
  }

  # Faut-il du faux gras ?
  my $fake_bold = FALSE;
  if( not $self->has($from_fontset, $from_series, $from_shape)
      and ($from_series eq BOLD) ){
    $fake_bold = TRUE;
    $from_series = MEDIUM;
  }

  # Dispose-t-on de la fonte requise ?
  if( not $self->has($from_fontset, $from_series, $from_shape) ){
    warn "WARNING: no $from_fontset/$from_series/$from_shape: skipping $caps/$series/$shape/$width";
    $self->substitution_fd($series, $shape, $caps, $width);
    return;
  }

  # On lance afmtotfm/ttftotfm
  my $type = $self->type;
  my $first = $self->get($from_fontset, $from_series, $from_shape);
  my $raw = "$type-$name-$series-$shape=$caps-$width-cork=raw--10";
  my $second = "$type-$name-$series-$shape=$caps-$width-cork=incomplete--10";
  $self->to_tfm($first, $raw, $second, $fake_small_caps, $extend, $slant);
  # A FAIRE: idem avec expert si nécessaire

  # On lance fontinst
  my $third = "$type-$name-$series-$shape=$caps-$width-cork--10";
  my @options = ($second);
  #push @options, $expert; # A FAIRE
  push @options, "fake_bold" if $fake_bold;
  push @options, qw/dotlessj latin no_unfakable_greek/;
  $self->fontinst($third, @options);

  # On rajoute une ligne au fichier fd
  $self->append_fd($series, $shape, $caps, $width, $third);
}

sub to_tfm {
  my $self = shift;
  my ($first, $raw, $second, $fake_small_caps, $extend, $slant) = @_;
  $first =~ s/\.(afm|ttf)$//;
  my $options = "";
  $options .= " -e $extend" unless $extend == 1;
  $options .= " -s $slant" unless $slant == 0;
  $options .= ($fake_small_caps) ? " -V" : " -v";
  if( $self->type eq AFM ){
    my $font = "$first.pfb";
    my $metrics = "$first.afm";
    Log::system "afm2tfm $metrics -T $Start::ECENC $options $second $raw | perl -p -i -e 's/\$/ <$font/' >> psfonts.map";
  } else {
    my $font = "$first.ttf";
    Log::system "ttf2tfm $font -T T1-WGL4.enc $options $second $raw | tail -1 >> ttfonts.map";
  }
  Log::system "vptovf $second";
  Log::system "tftopl $second > $second.pl";
  Log::system "perl -p -i -e 's/(EC|T1)ENCODING/EXTENDED TEX FONT ENCODING - LATIN/' $second.pl";
}


sub fontinst {
  my $self = shift;
  my ($target, @options) = @_;
  my $options = join(',', @options);
  my $family = $self->name;
  Log::write("$target.fontinst.tex",
	"\\input fontinst.sty\n",
	"\\installfonts\n",
	"\\installfont{$target}\n",
	"  {$options}\n",
	"  {T1}{T1}{toto}{m}{n}{10}\n",
	"\\endinstallfonts\n",
	"\\bye\n",
       );
#  Log::latex "$target.fontinst.tex";
  Log::system "latex $target.fontinst.tex";
  Log::system "vptovf $target";
}

sub start_fd {
  my $self = shift;
  my $name = $self->name;
  my $file = "t1" . $name . ".fd";
  Log::write("$file",
	"\\ProvidesFile{$file}\n",
	"\\DeclareFontFamily{T1}{$name}{}\n",
       );
}

sub append_fd {
  my $self = shift;
  my ($series, $shape, $caps, $width, $third) = @_;
  _check_arg("caps", $caps, NORMALCAPS, SMALLCAPS, ALLCAPS);
  _check_arg("series", $series, BOLD, MEDIUM);
  _check_arg("shape", $shape, UPRIGHT, ITALICS, SLANTED, UPRIGHTITALICS);
  _check_arg("width", $width, NORMAL, EXTENDED, CONDENSED);
  my ($shortseries, $shortshape) = _short($caps, $series, $shape, $width);
  my $name = $self->name;
  my $file = "t1" . $name . ".fd";
  Log::append($file,
	      "\\DeclareFontShape{T1}{$name}{$shortseries}{$shortshape}{<-> $third}{}\n",
	     );
}

sub substitution_fd {
  my $self = shift;
  my ($series, $shape, $caps, $width) = @_;
  _check_arg("caps", $caps, NORMALCAPS, SMALLCAPS, ALLCAPS);
  _check_arg("series", $series, BOLD, MEDIUM);
  _check_arg("shape", $shape, UPRIGHT, ITALICS, SLANTED, UPRIGHTITALICS);
  _check_arg("width", $width, NORMAL, EXTENDED, CONDENSED);
  my ($shortseries, $shortshape) = _short($caps, $series, $shape, $width);
  my $name = $self->name;
  my $file = "t1" . $name . ".fd";
  my ($newseries, $newshape) = ($series, $shape);
  if($series eq BOLD){ $newseries = MEDIUM; }
  elsif($shape eq ITALICS){ $newshape = SLANTED; }
  else{ return; }
  my ($shortnewseries, $shortnewshape) = _short($caps, $newseries, $newshape, $width);
  Log::append($file, "\\DeclareFontShape{T1}{$name}{$shortseries}{$shortshape}{<->ssub*$name/$shortnewseries/$shortnewshape}{}\n");
}

sub _short {
  my ($caps, $series, $shape, $width) = @_;
  _check_arg("caps", $caps, NORMALCAPS, SMALLCAPS, ALLCAPS);
  _check_arg("series", $series, BOLD, MEDIUM);
  _check_arg("shape", $shape, UPRIGHT, ITALICS, SLANTED, UPRIGHTITALICS);
  _check_arg("width", $width, NORMAL, EXTENDED, CONDENSED);
  my $shortseries = "m";
  my $shortshape = "n";
  $shortseries = ( $series eq BOLD ) ? "b" : "m";
  $shortseries .= "x" if $width eq EXTENDED;
  $shortseries .= "c" if $width eq CONDENSED;
  $shortseries =~ s/m([xc])/$1/;
  if( $caps eq NORMALCAPS ){
    if( $shape eq ITALICS ){
      $shortshape = "it" 
    } elsif( $shape eq SLANTED ){
      $shortshape = "sl" 
    } elsif( $shape eq UPRIGHTITALICS ){
      $shortshape = "ui"
    }
  } elsif( $caps eq SMALLCAPS ){
    if( $shape eq ITALICS ){
      $shortshape = "scit" 
    } elsif( $shape eq SLANTED ){
      $shortshape = "scsl" 
    } elsif( $shape eq UPRIGHTITALICS ){
      $shortshape = "scui"
    } else {
      $shortshape = "sc";
    }
  } else {
    confess "bug: \$caps should be one of &NORMAL, &SMALLCAPS, not $caps\n";
  }
  return ($shortseries, $shortshape);
}

sub make_test_files {
  my $self = shift;
  my $name = $self->name;
  foreach my $f (@test_files){
    my $new = $f;
    $new =~ s/toto/$name/g ;
    Log::remplace("toto", $name, "$f.tex");
    Log::system("latex -interaction=nonstopmode $new");
#    Log::system("dvips -o $new.ps $new.dvi");
  }
}

sub make_sty {
  my $self = shift;
  my $name = $self->name;
  Log::remplace("toto", $name, "font-toto.sty");
}

sub _get_fontname_from_ttf {
  my ($file) = @_;
  if($file =~ m/\.ttf$/){
    open(A, "ttf2afm $file|") || die "Cannot run ttf2afm on $file: $!";
  } else {
    open(A, $file) || die "Cannot opne $file for reading: $!";
  }
  my $result = "";
  while(<A>){
    chomp;
    $result = $_ if s/^FontName\s*//;
  }
  close A;
  return $result;
}

sub install {
  my $self = shift;
  my $family = $self->name;
  my $type = $self->type;
  Log::system("cp *.tfm $texmf/fonts/tfm/");
  Log::system("cp *.afm $texmf/fonts/afm/");
  Log::system("cp *.ttf $texmf/fonts/truetype/");
  Log::system("cp *.pfb $texmf/fonts/type1/");
  Log::system("cp *.vf  $texmf/fonts/vf/");
  Log::system("cp font-$family.sty *.fd $texmf/tex/generic/");

  if( $type eq TTF ){
    ## A REECRIRE PLUS PROPREMENT... (CA NE MARCHE PAS ???)
    print STDERR "Converting ttfonts.map to pdftex.map\n";
    open(TTFONTS, "ttfonts.map") || die "Cannot open ttfonts.map for reading: $!";
    open(PDFTEXMAP, ">pdftex.map") || die "Cannot open pdftex.map for writing: $!";
    while(<TTFONTS>){
      if( m/^([^\s]*)\s+([^\s]*).*\s+Encoding\=([^\s]*)/ ){
	my ($name, $file, $enc) = ($1, $2, $3);
	my $fontname = _get_fontname_from_ttf($file);
	print PDFTEXMAP "$name $fontname \" T1Encoding ReEncodeFont \"  <T1-WGL4.enc <$file\n";
      } elsif( m/^([^\s]*)\s+([^\s]*)\s+Slant\=([^\s]*)\s+Extend\=([^\s]*)\s+Encoding\=([^\s]*)/ ){
	my ($name, $file, $s, $e, $enc) = ($1, $2, $3, $4, $5);
	my $fontname = _get_fontname_from_ttf($file);
	print PDFTEXMAP "$name $fontname \" $s SlantFont  $e ExtendFont T1Encoding ReEncodeFont \"  <T1-WGL4.enc <$file\n";
      }
    }
    close TTFONTS;
    close PDFTEXMAP;

    Log::system "cp ttfonts.map $texmf/fonts/truetype/$family.map";
    Log::system "rm $texmf/fonts/truetype/ttfonts.map";
    Log::system "cat $texmf/fonts/truetype/*.map >$texmf/fonts/truetype/ttfonts.map";
  } else {
    Log::system "cp psfonts.map $texmf/dvips/config/$family.map";
    Log::append($configps, "\np +$family.map\n");
    Log::system "cp psfonts.map $texmf/pdftex/config/$family.pdftex.map";
  }

  if( defined $optctl{name} ){
    warn "WARNING: that font can not be used with pdftex";
  } else {
    Log::system "cp pdftex.map $texmf/pdftex/config/$family.pdftex.map";
    Log::append($pdftexcfg, "\nmap +$family.pdftex.map\n");
  }

}
package main;
use strict;
use Carp qw(:DEFAULT cluck);

use constant TRUE  => (0==0);
use constant FALSE => (0==1);

use constant NORMAL  => "normal";
use constant SMALLCAPS => "smallcaps";
use constant EXPERT  => "expert";
use constant MEDIUM  => "medium";
use constant BOLD    => "bold";
use constant UPRIGHT => "upright";
use constant ITALICS => "italics";
use constant SLANTED => "slanted";
use constant UPRIGHTITALICS => "uprightitalics";
use constant NORMALCAPS  => "normalcaps";
use constant ALLCAPS     => "allcaps";
use constant CONDENSED   => "condensed";
use constant EXTENDED    => "extended";

use constant TTF => "ttf";
use constant AFM => "afm";

our @caps = (NORMALCAPS, SMALLCAPS); # RAJOUTER ALLCAPS
our @shape = (UPRIGHT, SLANTED, ITALICS, UPRIGHTITALICS);
our @width = (NORMAL, CONDENSED, EXTENDED);
our @series = (MEDIUM, BOLD);

#@caps=(NORMALCAPS); @shape=(UPRIGHT); @width=(NORMAL); @series=(MEDIUM);

our @test_files = qw/test-toto-1 test-toto-2 test-toto-3/;


##
## Variables globales
##
my %fonts;

##
## 1. Recherche des fichiers AFM/TTF dans le répertoire courrant
##

if( defined $optctl{name} ){
  Log::debug(1, "Not looking in the current directory");
  my $family = $optctl{name};
  my $type = TTF;
  $fonts{$family} = new Font($family, $type);
  $fonts{$family}->set(NORMAL, MEDIUM, UPRIGHT, $optctl{roman});
  $fonts{$family}->set(NORMAL, MEDIUM, ITALICS, $optctl{italic});
  $fonts{$family}->set(NORMAL, BOLD,   UPRIGHT, $optctl{bold});
  $fonts{$family}->set(NORMAL, BOLD,   ITALICS, $optctl{bolditalic});
} else {

  Log::debug(1, "Looking for *.afm files in the current directory");
  opendir(DIR,'.') || die "Cannot open current directory: $!";
  foreach my $file (readdir DIR){
    my ($type, $name, $fullname, $family, $italic_angle, $expert, $smallcaps);
    $type = AFM if $file =~ m/afm$/;
    $type = TTF if $file =~ m/ttf$/;
    next unless defined $type;
    Log::debug(2, "Found file: $file");

    # Lecture du fichier AFM
    if($type eq AFM){
      open(A, "$file") || die "Cannot open $file for reading: $!";
    } else {
      open(A, "ttf2afm $file|") 
	|| die "Cannot open `ttf2afm $file|' for reading: $!";
    }
    while(<A>){
      if( m/^FontName\s+(.*)/ ){ 
	$name = $1;
      }
      if( m/^FullName\s+(.*)/ ){ 
	$fullname = $1;
      }
      if( m/^ItalicAngle\s+(.*)/ ){
	$italic_angle = $1;
	$italic_angle = $italic_angle /180*3.1415926535897932384626433832795029;
      }
    }
    close(A);

    # Si la fonte n'a pas de nom, on passe
    unless( defined $name ){
      warn "WARNING: font $file has no name";
      next;
    }

    # Nom de la famille
    $family = $fullname;
#   $family =~ s/Regular//;
#   $family =~ s/Sans//;
#   $family =~ s/Condensed//;
    $family =~ s/Italic//;
    $family =~ s/SemiBold//i;
    $family =~ s/DemiBold//i;
    $family =~ s/Heavy//i;
    $family =~ s/Bold//;
    $family =~ s/Roman//;
#   $family =~ s/SmCaps//; ####### A FAIRE
    $family =~ s/Expert//;
    $family =~ s/[-_]$//g;
    $family =~ y/A-Z/a-z/;
    $family =~ s/[^a-z]//g;

    # fontset: Normal/Expert/SmallCaps
    my $fontset = NORMAL;
    $fontset = EXPERT    if $fullname =~ m/Expert/;
#   $fontset = SMALLCAPS if $fullname =~ m/SmCaps/;

    # series: medium/bold
    my $series = MEDIUM;
    $series = BOLD if $fullname =~ m/Bold|Heavy/;

    # shape: upright/italics
    my $shape = UPRIGHT;
    $shape = ITALICS if $fullname =~ m/Italic/;

    Log::debug(2, "  fullname: $fullname");
    Log::debug(2, "  family:   $family");
    Log::debug(2, "  name:     $name");
    Log::debug(2, "  fontset:  $fontset");
    Log::debug(2, "  series:   $series");
    Log::debug(2, "  shape:    $shape");

    # On stocke cette information
    $fonts{$family} = new Font($family, $type) unless defined $fonts{$family};
    $fonts{$family}->set($fontset, $series, $shape, $file);
    if( ($shape eq ITALICS) and (defined $italic_angle) ){
      $fonts{$family}->set_slant(sin($italic_angle)/cos($italic_angle));
    }
  }
}

##
## 2. Pour chaque famille, on crée un répertoire dans lequel
##    on copie tous les fichiers nécessaires.
##

foreach my $family (keys %fonts){
  Log::debug(1, "\nProcessing family $family");
  ##### A FAIRE : si la famille ne contient que du gras ???
  ##### (ou alors dans le fichier *fd ?)
  my $pwd = `pwd`;
  chomp $pwd;
  Log::mkdir "tmp_$family";
  foreach my $f ( $fonts{$family}->files ){
    Log::system "cp $f tmp_$family";
    $f =~ s/\.afm$/\.pfb/;
    Log::system "cp $f tmp_$family";
  }
  Log::chdir "tmp_$family";
  Init::write_a_few_files();
  $fonts{$family}->process;
  Log::chdir $pwd;
}

