/* MakeTeXFontSet.rexx  */

   Version = '1.0'
   Author  = ' Ulrich Wisser';

/*
   Date   : 13-Jul-92

   Please send new features and bugreports to

   Author : Ulrich Wisser
            Heerstr. 125
            53111 Bonn
            Germany

   WARNING!!!

   This script will call METAFONT 7 times per font and driver and
   another 22 times per font for ShowDVI.
   Assuming that METAFONT will only need 30 minutes per call one font
   will take 3.5 hours to create for one driver and 11 hours for
   ShowDVI.

                               THIS MEANS:
           TO CREATE ONE FONT FOR ONE PRINTER AND ShowDVI WILL TAKE
               AT LEAST 14.5 HOURS (FOR SURE IT WILL BE MORE!)



                   USE THIS SCRIPT ONLY WHEN NECESSARY!

  NEVER SET CALLMF TO MakeTeXFontSet.rexx because it does't understand how to
  create single fonts (nor does it understand the parameters).

                             !!!!!!!!!!!!!!!!!!!


   HOW THIS ALL WORKS!

   First install MakeBatch.rexx and MakeTeXFont.rexx as described in their
   installation guide. When you "familiar" with these scripts and you really
   want to create a full fontset call MakeTexFontSet.rexx. It is easy to
   use. The only optional argument are a list of fonts to create.
   You will be asked everything by the script. The fonts for ShowDVI are
   handeled seperatly (see SHOWDVI section).


   SIZES

   For all modes (resolutions) the following magsteps are created:
      magstep 0
      magstep 0.5
      magstep 1
      magstep 2
      magstep 3
      magstep 4
      magstep 5

   These are the "normal" sizes which are defined by TeX's \magstep command.
   The resolutions should be found in any correct installed TeX enviroment.


    SHOWDVI

        The following table shows the DPI sizes of the magsteps:

                 |        ShowDVI Resolution        |
         magstep |   44 |   83 |   91 |  100 |  120 |
        ---------------------------------------------
           0     |   44 |   83 |   91 |  100 |  120 |
           0.5   |   48 |   91 |  100 |  110 |  131 |
           1     |   53 |  100 |  109 |  120 |  144 |
           2     |   63 |  120 |  131 |  144 |  173 |
           3     |   76 |  143 |  157 |  173 |  207 |
           4     |   91 |  172 |  189 |  207 |  249 |
           5     |  109 |  207 |  226 |  249 |  299 |

         Some entries have the same DPI size so they will not be
         calculated twice.

         The following table shows which DPI sizes will be really
         created:

                 |        ShowDVI Resolution        |
         magstep |   44 |   83 |   91 |  100 |  120 |
        ---------------------------------------------
           0     |   44 |   83 |   91 |  100 |  120 |
           0.5   |   48 |      |      |  110 |  131 |
           1     |   53 |      |  109 |      |  144 |
           2     |   63 |      |      |      |  173 |
           3     |   76 |  143 |  157 |      |  207 |
           4     |      |  172 |  189 |      |  249 |
           5     |      |      |  226 |      |  299 |



   USER CONFIGURATION

   This configuration should statisfy your "normal" needs. If you
   need any other magsteps (or magnification) follow this instruction.

   If you have any other modes for it just append another array entry.
   If you want additional magsteps you must change the array magmult.
   ATTENTION this will need changes to array SDVI.
   This additionell magsteps will be generated for all other modes as well.

   magmult holds all magstep information:

   magmult.0        number of entries in array magmult
   magmult.i.str    holds the magstep
   magmult.i.num    the relating number 1.2^(magmult.i.str)

   SDVI             holds all information relating to ShowDVI
   SDVI.pkdir       dir to copy pk to (needs trailing '/')
   SDVI.ModesAnz    number of modes for ShowDVI
   SDVI.i           holds all information relating to one mode
   SDVI.i.name      name of the mode (used by METAFONT)
   SDVI.i.xdpi      horizontal resolution
   SDVI.i.ydpi      vertical resolution
   SDVI.i.Mag       holds all information relating to magsteps for i-th mode
   SDVI.i.Mag.Anz   number of magsteps to create
   SDVI.i.Mag.j     index to magmult (e.g. SDVI.i.Mag.j = 1 means magstep 0)

*/

NUMERIC DIGITS 12       /* Needed to calculte correct DPI number */

magmult.0      = 7     /* number of saved magsteps */
magmult.num.1  = 1.0
magmult.str.1  = "0"
magmult.num.2  = 1.09544511501
magmult.str.2  = "0.5"
magmult.num.3  = 1.2
magmult.str.3  = "1"
magmult.num.4  = 1.44
magmult.str.4  = "2"
magmult.num.5  = 1.728
magmult.str.5  = "3"
magmult.num.6  = 2.0736
magmult.str.6  = "4"
magmult.num.7  = 2.48832
magmult.str.7  = "5"

SDVI.pkdir     = 'MF:SDVI/';
SDVI.ModeAnz   =   5;

SDVI.1.name    = 'FourFour';
SDVI.1.xdpi    =  44;
SDVI.1.ydpi    =  44;
SDVI.1.Mag.Anz =   5;
SDVI.1.Mag.1   =   1; /* index to magmult */
SDVI.1.Mag.2   =   2;
SDVI.1.Mag.3   =   3;
SDVI.1.Mag.4   =   4;
SDVI.1.Mag.5   =   5;

SDVI.2.name    = 'EightThree';
SDVI.2.xdpi    =  83;
SDVI.2.ydpi    =  83;
SDVI.2.Mag.Anz =   3;
SDVI.2.Mag.1   =   1;
SDVI.2.Mag.2   =   5;
SDVI.2.Mag.3   =   6;


SDVI.3.name    = 'NineOne';
SDVI.3.xdpi    =  91;
SDVI.3.ydpi    =  91;
SDVI.3.Mag.Anz =   5;
SDVI.3.Mag.1   =   1;
SDVI.3.Mag.2   =   3;
SDVI.3.Mag.3   =   5;
SDVI.3.Mag.4   =   6;
SDVI.3.Mag.5   =   7;

SDVI.4.name    = 'OneZeroZero';
SDVI.4.xdpi    = 100;
SDVI.4.ydpi    = 100;
SDVI.4.Mag.Anz =   2;
SDVI.4.Mag.1   =   1;
SDVI.4.Mag.2   =   2;

SDVI.5.name    = 'OneTwoZero';
SDVI.5.xdpi    = 120;
SDVI.5.ydpi    = 120;
SDVI.5.Mag.Anz =   7;
SDVI.5.Mag.1   =   1;
SDVI.5.Mag.2   =   2;
SDVI.5.Mag.3   =   3;
SDVI.5.Mag.4   =   4;
SDVI.5.Mag.5   =   5;
SDVI.5.Mag.6   =   6;
SDVI.5.Mag.7   =   7;

/* TRACE RESULTS */

SIGNAL ON BREAK_C;
SIGNAL ON BREAK_D;

modefilename = "mf:config/modes"
batchname    = "mf:MakeTeXFont.sh";

SAY;
SAY "MakeTeXFont.rexx Version "Version" by "Author".";
SAY;

IF ~exists(batchname) THEN DO
  IF ~OPEN(batchfile,batchname,'W') THEN DO
    SAY "MakeBatch: Could not create "batchname" !";
    EXIT 10
  END
  ELSE DO
    CALL WRITELN(batchfile,";# Batchfile for font generation");
    IF CLOSE(batchfile) THEN DO
      'protect 'batchname' ADD s';
      SAY "MakeBatch: Batchfile "batchname" created.";
    END
    ELSE DO
      SAY "MakeBatch: Error during creation of "batchname" !";
      EXIT 10;
    END
  END
END

MakeFontScript = 'MF:rexx/MakeTeXFont.rexx';
OPTIONS PROMPT 'Should I call 'MakeFontScript' (Y/n) ? ';
DO UNTIL yn='Y'|yn='N'
  PARSE UPPER PULL yn;
  IF yn = '' THEN yn = 'Y';
END;
IF yn = "N" THEN DO
  OPTIONS PROMPT "Please enter scriptname to use or RETURN to cancel:";
  PARSE PULL MakeFontScript;
END;
DROP yn;
IF MakeFontScript = '' THEN DO
  SAY "Sorry, no script for fontcreation.";
  EXIT;
END;
IF UPPER(RIGHT(MakeFontScript, 5)) = '.REXX' THEN
  MakeFontScript = LEFT(MakeFontScript, Length(MakeFontScript)-5);

PARSE ARG Fontline
Fonts.Anz = WORDS(Fontline)
DO i=1 TO Fonts.Anz
  Fonts.i = WORD(Fontline, i);
END; /* DO i */
IF Fonts.Anz = 0 THEN DO
  SAY "You didn't supply a fontname as argument!";
  SAY
  OPTIONS PROMPT 'DO you want to enter fontnames (Y/n) ? '
  DO UNTIL yn='Y'|yn='N'
    PARSE UPPER PULL yn;
    IF yn='' THEN yn = 'Y';
  END;
END /* IF Fonts.Anz = 0 */
ELSE DO
  SAY "I found the following fonts to create: ";
  DO i = 1 TO Fonts.Anz
    SAY '                          'Fonts.i;
  END;
  SAY
  OPTIONS PROMPT 'DO you want to enter some more fontnames (y/N) ? '
  DO UNTIL yn='Y'|yn='N'
    PARSE UPPER PULL yn;
    IF yn='' THEN yn = 'N';
  END;
END; /* ELSE */

IF yn = 'Y' THEN DO
  SAY 'ENTER for no more fonts!';
  inp = 'BlaBla';
  DO UNTIL inp = ''
    OPTIONS PROMPT 'Please enter 'Fonts.Anz+1'. font : ';
    PARSE PULL inp;
    IF inp ~= '' THEN DO
      Fonts.Anz = Fonts.Anz + 1;
      i         = Fonts.Anz;
      Fonts.i   = inp;
    END;
  END;
END; /* IF yn */

IF Fonts.Anz = 0 THEN DO
  SAY 'Sorry, no FONTS ==> NOTHING TO DO';
  EXIT;
END;

DO i=1 TO Fonts.Anz
  IF UPPER(RIGHT(Fonts.i, 3)) = '.MF' THEN
    Fonts.i = LEFT(Fonts.i, LENGTH(Fonts.i)-3);
END;

DPISTR = '';
DO i=1 TO SDVI.ModeAnz
  DPISTR=  DPISTR' 'SDVI.i.xdpi'x'SDVI.i.ydpi;
  IF i < SDVI.ModeAnz THEN DPISTR = DPISTR',';
END;
SAY 'Default ShowDVI resolutions are DPI'DPISTR'.';
DROP DPISTR;
OPTIONS PROMPT 'Make a full set of ShowDVI fonts (y/N) ? ';
DO UNTIL yn='Y'|yn='N'
  PARSE UPPER PULL yn;
  IF yn='' THEN yn = 'N';
END;
IF yn = 'N' THEN
  SDVI.ModeAnz = 0;
ELSE DO
  OPTIONS PROMPT "Use '"SDVI.pkdir"' (Y/n) ?"
  DO UNTIL yn='Y'|yn='N'
    PARSE UPPER PULL yn;
    IF yn='' THEN yn = 'Y';
  END;
  IF yn = 'N' THEN DO
    OPTIONS PROMPT 'Please enter new pk-dir with absolute path (enter to cancel):'
    ende = 0;
    DO UNTIL ende
      PARSE PULL SDVI.pkdir
      IF SDVI.pkdir = '' THEN SIGNAL BREAK_C;
      IF POS(':', SDVI.pkdir) = 0 THEN
        SAY "Sorry, absolute path must be given e.g. 'TeX:pk/'";
      ELSE ende = 1;
    END;
    IF (RIGHT(SDVI.pkdir, 1) ~= ':') & (RIGHT(SDVI.pkdir,1 ) ~= '/') THEN
      SDVI.pkdir = SDVI.pkdir'/';
    DROP ende;
  END;
END;

ModesAnz = 0;

IF ~open('modefile', modefilename, 'read') THEN DO
  SAY "Can't find file "modefilename"!";
  EXIT 5;
END;
DO UNTIL eof('modefile')
  line = readln('modefile');
  line = strip(translate(line, ' ', '   '));
  IF POS(';', line) > 0 THEN line = LEFT(line, POS(';', line)-1);
  mode = word(line, 1);
  xres = word(line, 2);
  yres = word(line, 3);
  isSDVI = 0;
  DO i=1 TO SDVI.ModeAnz
    IF mode = SDVI.i.name THEN isSDVI = 1;
  END;
  IF ~isSDVI             THEN
  IF mode ~= ''          THEN
  IF DATATYPE(xres, 'W') THEN
  IF DATATYPE(yres, 'W') THEN DO
    OPTIONS PROMPT 'Create FontSet with mode 'mode' DPI 'xres'x'yres' (y/N) ? ';
    DO UNTIL yn = 'Y'|yn='N'
      PARSE UPPER PULL yn;
      IF yn = '' THEN yn = 'N';
    END;
    IF yn = "Y" THEN DO
      ModesAnz = ModesAnz + 1;
      modes.ModesAnz.name = mode;
      modes.ModesAnz.xdpi = xres;
      modes.ModesAnz.ydpi = yres;
      modes.ModesAnz.pkdir= 'MF:'mode'/';
      OPTIONS PROMPT 'Use 'modes.ModesAnz.pkdir' as pk-dir (Y/n) ?'
      DO UNTIL yn = 'Y'|yn='N'
        PARSE UPPER PULL yn;
        IF yn = '' THEN yn = 'Y';
      END;
      IF yn = 'N' THEN DO
        OPTIONS PROMPT 'Please enter new pk-dir with absolute path (enter to cancel):'
        ende = 0;
        DO UNTIL ende
          PARSE PULL modes.ModesAnz.pkdir
          IF modes.ModesAnz.pkdir = '' THEN SIGNAL BREAK_C;
          IF POS(':', modes.ModesAnz.pkdir) = 0 THEN
            SAY "Sorry, absolute path must be given e.g. 'TeX:pk/'";
          ELSE ende = 1;
        END;
        IF RIGHT(modes.ModesAnz.pkdir,1 ) ~= ':' & RIGHT(modes.ModesAnz.pkdir, 1) ~= '/' THEN
          modes.ModesAnz.pkdir = modes.ModesAnz.pkdir'/';
        DROP ende;
      END;
    END; /* IF yn        */
  END;   /* IF mode ...  */
END;     /* DO UNTIL eof */
IF ~close('modefile') THEN DO
  SAY "Can't close mode-file!";
END;
DROP yn;

IF ModesAnz = 0 THEN DO
  IF SDVI.ModeAnz = 0 THEN DO
    SAY "You dind't select any mode. Nothing to do!";
    EXIT;
  END;
END;

IF OPEN(batchfile, batchname, 'append') THEN DO
  DO i=1 TO ModesAnz
    DO f=1 TO Fonts.Anz
      DO j=1 TO magmult.0
        dpi = (magmult.num.j * modes.i.xdpi)+0.5;
        IF POS('.', dpi) > 0 THEN dpi = LEFT(dpi, POS('.', dpi)-1);
        WRITELN(batchfile, 'rx 'MakeFontScript Fonts.f dpi modes.i.xdpi modes.i.ydpi 'MakeTeXFontSet' dpi'/'Fonts.f'.'dpi'pk' modes.i.pkdir);
      END; /* DO j */
    END;   /* DO f */
  END;     /* DO i */
  DO i=1 TO SDVI.ModeAnz
    DO f=1 TO Fonts.Anz
      DO j=1 TO SDVI.i.Mag.Anz
        k   = SDVI.i.Mag.j;  /* just a help to index magmult */
        dpi = (magmult.num.k * SDVI.i.xdpi) + 0.5;
        IF POS('.', dpi) > 0 THEN dpi = LEFT(dpi, POS('.', dpi)-1);
        WRITELN(batchfile, 'rx 'MakeFontScript Fonts.f dpi SDVI.i.xdpi SDVI.i.ydpi 'MakeTeXFontSet' dpi'/'Fonts.f'.'dpi'pk' SDVI.pkdir);
      END; /* DO j           */
    END;   /* DO f           */
  END;     /* DO i           */
  CLOSE('batchfile');
END;       /* IF open        */

EXIT; /* normal end reached */

BREAK_C:
BREAK_D:
SAY 'USER REQUESTED BREAK!';
EXIT;

mygetenv: procedure          /* when will ARexx supply GetEnv/SetEnv ? */
   PARSE ARG name
   IF open(TEMPFILE,"ENV:"||name,'r') THEN DO
     gives = readln(TEMPFILE)
     CALL close TEMPFILE
   END
   ELSE gives = ""
   RETURN gives

mysetenv: procedure
   PARSE ARG name,content
   ADDRESS COMMAND "SetEnv" name '"'content'"'
   RETURN 1
