[INHERIT('UTILITYOPS','ARGOPS','FLAGOPS',
'TREEANDLISTOPS','LATEXOPS'), environment('conversion')]

MODULE CONVERSION;

CONST
   maxlists = 8;
   maxheaderlevels = 6;
   maxlongpckstrchars = 75;
TYPE

longpckstr = VARYING[maxlongpckstrchars] of char;

pagesizetype = record
                   length : integer;
                   width  : integer
                end;

paragraphdeftype = record
                       indent : integer;
                       vertskip : integer;
                       testpage : integer
                    end;

numberlisttype = record
                     listlevel   : integer;
                     valuetoset : integer
                  end;

displayelementstype = record
                         leftchar : char;
                         style : styletype;
                         rightchar : char
                       end;

leveltype = record
          value : integer;
          display : styletype
       end;

headerleveltype = array[1..maxheaderlevels] of leveltype;


VAR


inputcontainstexcommands : [GLOBAL] boolean;

totallines, totalchars : [EXTERNAL] integer;

pagesize : [GLOBAL] pagesizetype;

numberpage : [GLOBAL] integer;

numberrunning : [GLOBAL] integer;

displaynumber : [GLOBAL] styletype;

capitalizetext, lowercasetext : [GLOBAL] boolean;

leftmargin : [GLOBAL] integer;

rightmargin : [GLOBAL] integer;

fill : [GLOBAL] boolean;

startnofillagain : [GLOBAL] boolean;

justify : [GLOBAL] boolean;

spacing : [GLOBAL] integer;

indent  : [GLOBAL] integer;

centering : [GLOBAL] boolean;

flushright : [GLOBAL] boolean;

minipageactive : [GLOBAL] boolean;

inmarginpar  : [GLOBAL] boolean;

infootnote : [GLOBAL] boolean;

paragraphdef : [GLOBAL] paragraphdeftype;

numberlist : [GLOBAL] numberlisttype;

displayelements : [GLOBAL] displayelementstype;

numberchapter : [GLOBAL] integer;

displaychapter : [GLOBAL] styletype;

headerlevel : [GLOBAL] headerleveltype;

nestlevel : [GLOBAL] integer;

numberappendix : [GLOBAL] integer;

displayappendix : [GLOBAL] styletype;

writetexcommands : [GLOBAL] boolean;

flagtable : [GLOBAL] flagtabletype;

inliteral : [GLOBAL] boolean;

title, subtitle : [GLOBAL] argarray;

datestring : [GLOBAL] pckstr;

pagestyle : [GLOBAL] pagestyletype;

liststate : [GLOBAL] array[1..maxlists] of liststatetype;

numberofelements : [GLOBAL] array[1..maxlists] of integer;

outputfirstitem : [GLOBAL] array[1..maxlists] of boolean;

listnestlevel : [GLOBAL] integer;

nofillbeforelist : [GLOBAL] boolean;

LOG : [EXTERNAL] text;

underlineactive : [GLOBAL] enhancmentstates;

boldactive : [GLOBAL] enhancmentstates;



[GLOBAL] FUNCTION quotedcharacter( arg : argument ) : char;
var
 s : pckstr;
begin
  s := argliteral( arg, true );
  if length(s) = 1 then
     quotedcharacter := s[1]
  else
     if length(s) = 3 then
       quotedcharacter := s[2]
     else
       quotedcharacter := blank
end;



[HIDDEN] PROCEDURE noconversion; EXTERN;







[GLOBAL] PROCEDURE blankifypckstr( var s : pckstr );
begin
 s.body := blank;
 s.length := 0
end;



[GLOBAL] PROCEDURE initglobalvars;
var
 i : integer;
begin
  pagesize.length := 58;
  pagesize.width := 60;
  numberpage := 1;
  numberrunning := 1;
  displaynumber := decimal;
  capitalizetext := false;
  lowercasetext := false;
  leftmargin := 0;
  rightmargin := 60;
  fill := true;
  startnofillagain := false;
  justify := true;
  centering := false;
  flushright := false;
  minipageactive := false;
  indent := 5;
  spacing := 1;
  paragraphdef.indent := 5;
  paragraphdef.vertskip := 2;
  paragraphdef.testpage := 5;
  numberlist.listlevel := 1;
  numberlist.valuetoset := 0;
  nofillbeforelist := false;
  displayelements.leftchar := blank;
  displayelements.style := decimal;
  displayelements.rightchar := blank;
  numberchapter := 0;
  numberappendix := 0;
  displaychapter := decimal;
  for i := 1 to maxheaderlevels do
  begin
    headerlevel[i].value := 0;
    headerlevel[i].display := decimal
  end;
  nestlevel := 1;
  inliteral := false;
  makenullarray( title );
  makenullarray( subtitle );
  pagestyle := myheadings;
  blankifypckstr( datestring );
  for i := 1 to maxlists do
  begin
     liststate[i] := nostate;
     numberofelements[i] := 0;
     outputfirstitem[i] := false
  end;
  listnestlevel := 0;
  underlineactive := notenhanced;
  boldactive := notenhanced
end;




[GLOBAL] PROCEDURE loglist( list : arglist; index : integer);
var
 l : arglist;
begin
 writeln(log);
 writeln(log,'INDEX >',index:1,' LENGTH >',arglistlength(list):1);
 l := list;
 write(log,'RUNOFF >');
 while l <> nulllist do
 begin
   write(log, argliteral(firstarg(l), false), blank);
   l := nextinlist(l)
 end;
 writeln(log);
 write(log,'TEX >')
end;




[GLOBAL] PROCEDURE dumpthelist( var outfile : text; list : arglist );
begin
  if list <> nulllist then
  begin
     texwritearg(outfile, firstarg(list));
     dumpthelist(outfile, nextinlist(list))
  end
end;




[GLOBAL] PROCEDURE newintvalue( arg : argument; var current : integer;
                        var modified : parameterchangestates;
                        var intextracted : integer );
var
 signed : boolean;
 successful : boolean;
begin
 modified := nochange;
 extractintegerfromargument(arg, successful, intextracted, signed );
 if successful then
 begin
   if signed then
   begin
     modified := altered;
     current := intextracted + current
   end
   else
   begin
     modified := assigned;
     current := intextracted
   end
 end
end;




[GLOBAL] PROCEDURE newcountparameter( arg : argument; var current : integer;
                                       var modified : parameterchangestates;
                                       var countervalueextracted : integer;
                                       var class : countparametertype);
begin
 modified := nochange
end;


[GLOBAL] PROCEDURE newstyleparameter( arg : argument; var current : styletype );
var
  s : styletype;
begin
 s := isastylespecifier( arg );
 if s <> undetermined then
     current := s
end;




[LOCAL] FUNCTION  m( i : integer  ) : integer;
begin
 if i < 2 then
  m := 1
 else
  m := i - 1
end;


[LOCAL] PROCEDURE C( var f : text );
begin
  writeln(f,'}');
  writeln(log,'}')
end;




[GLOBAL] PROCEDURE flagchange( f : dsrflagclasses; arg : argument );
var
 ch : char;
begin
  turnflagon( f );
  ch := quotedcharacter( arg );
  if ch <> blank then
    changeflagchar(f, ch)
end;




[GLOBAL] PROCEDURE puttexcommand( var outfile : text; index : integer;
                          dsrlist : arglist;
                          var writeanothertexcommand : integer );

label
  routineexit;
const
 charwidth = true;
 charheight = false;
var
  arg : argarray;
  i, j, n : integer;
  modified : parameterchangestates;
  extractedvalue, skip, startindex : integer;
  class : countparametertype;
  f : dsrflagclasses;
  q : char;
  startedwithfill : boolean;

begin

if (index < 1) or (index > 130) then goto routineexit;

writeanothertexcommand := indexofunknowntexcommand;
loglist( dsrlist, index );
n := arglistlength( dsrlist );
listtoarray( dsrlist, index, arg, maxargsinarray);
startedwithfill := fill;
stopunderline( outfile );
stopbold( outfile );

{
 n      - number of arguments supplied with the DSR command
 m(n-1) - one less than that number, unless n < 2
 m(n-2) - two less than the number of arguments, unless < 3
 etc

 arg[i] - the ith input dsr argument; e.g. four args could be :

     1    2   3   4
    PAGE SIZE 10, 20                                             }



case index of

  {***** PAGE SIZE *****}
 1 : begin
       newintvalue(arg[n], pagesize.width, modified, extractedvalue);
       newintvalue(arg[m(n)], pagesize.length, modified, extractedvalue);
       adjustlength(outfile, modified, pagesize.width, extractedvalue,charwidth,'textwidth');
       adjustlength(outfile, modified, pagesize.length, extractedvalue,charheight,'textheight')
     end;

  {***** HEADERS OFF *****}
 2 : adjustpagestyle(outfile, plain);

  {***** HEADERS ON ***** }
 3 : adjustpagestyle(outfile, headings);

  {***** HEADERS UPPER ***** }
 4 : noconversion;

  {***** HEADERS LOWER ***** }
 5 : noconversion;

  {***** HEADERS MIXED ***** }
 6 : noconversion;

  {***** ENABLE WRITING OF DATE *****}
 7 : begin
       datestring := '\today';
       if pagestyle = myheadings then
         adjustpagestyle(outfile, myheadings)
       else
         noconversion
     end;

 { ***** DISABLE WRITING OF DATE ***** }
 8 : begin
       blankifypckstr( datestring );
       if pagestyle = myheadings then
         adjustpagestyle(outfile, myheadings )
       else
         noconversion
     end;

 { ***** LAYOUT ***** }
 9 : noconversion;

 { ***** NO NUMBER ***** }
10 : adjustpagestyle(outfile, empty);

 { ***** NUMBER PAGE ***** }
11 : begin
       newcountparameter(arg[n], numberpage, modified, extractedvalue,class);
       adjustcounter(outfile, modified, numberpage, extractedvalue, 'page')
     end;

 { ***** NUMBER RUNNING ***** }
12 : begin
       newintvalue(arg[n], numberrunning, modified, extractedvalue);
       adjustcounter(outfile, modified, numberrunning, extractedvalue,'page')
     end;

 { ***** DISPLAY NUMBER ***** }
13 : begin
       newstyleparameter(arg[n], displaynumber);
       adjuststyle(outfile, displaynumber, 'page')
     end;

 { ***** NO PAGING ***** }
14 : noconversion;

 { ***** PAGING ***** }
15 : noconversion;

 { ***** BEGIN SUBPAGE ***** }
16 : begin
       if not minipageactive then
       begin
         minipageactive := true;
         if not startedwithfill then
         begin
           endnofill( outfile );
           startnofillagain := true
         end;
         writeln(outfile,'\begin{minipage}');
         writeln(    log,'\begin{minipage}');
         if not startedwithfill then
           beginnofill( outfile )
       end
       else
       begin
          writeln(outfile,'% RNOTOTEX - minipage already active');
          writeln(    log,'% RNOTOTEX - minipage already active')
       end
     end;

 { ***** END SUBPAGE ***** }
17 : begin
       if minipageactive then
       begin
         if not fill then
           endnofill( outfile );
         writeln(outfile,'\end{minipage}');
         writeln(    log,'\end{minipage}');
         if startnofillagain then
         begin
           startnofillagain := false;
           beginnofill( outfile )
         end
       end
       else
       begin
          writeln(outfile,'% RNOTOTEX - minipage not active');
          writeln(    log,'% RNOTOTEX - minipage not active')
       end;
       minipageactive := false
     end;

 { ***** NUMBER SUBPAGE ***** }
18 : noconversion;


 { ***** DISPLAY SUBPAGE ***** }
19 : noconversion;

 { ***** FIRST TITLE ***** }
20 : noconversion;

 { ***** TITLE ***** }
21 : begin
        for i := 2 to maxargsinarray do
          title[i-1] := arg[i];
        if pagestyle = myheadings then
          adjustpagestyle(outfile, myheadings)
        else
          noconversion
     end;

 { ***** SUBTITLE ***** }
22 : begin
        for i := 2 to maxargsinarray do
           subtitle[i-1] := arg[i];
        if pagestyle = myheadings then
          adjustpagestyle(outfile, myheadings)
        else
          noconversion
     end;

 { ***** NO SUBTITLE ***** }
 23 : begin
         makenullarray( subtitle );
         if pagestyle = myheadings then
           adjustpagestyle(outfile, myheadings)
         else
           noconversion
      end;

 { ***** NO AUTOSUBTITLE ***** }
 24 : begin
        makenullarray( subtitle );
        if pagestyle = myheadings then
          adjustpagestyle(outfile, plain)
        else
          noconversion
      end;

 { ***** AUTOSUBTITLE ***** }
 25 : adjustpagestyle(outfile, headings);


 { ***** UPPERCASE ***** }
 26 : begin
       capitalizetext := true;
       lowercasetext := false
      end;

 { ***** LOWERCASE ***** }
 27 : begin
       capitalizetext := false;
       lowercasetext := true
      end;

 { ***** LEFT MARGIN ***** }
 28 : begin
         newintvalue( arg[n], leftmargin, modified, extractedvalue);
         noconversion
      end;

 { ***** RIGHT MARGIN ***** }
 29 : begin
         newintvalue( arg[n], rightmargin, modified, extractedvalue);
         noconversion
      end;

 { ***** NO FILL ***** }
 30 : beginnofill( outfile );

 { ***** FILL ***** }
 31 : endnofill( outfile );

 { ***** NO JUSTIFY ***** }
 32 : begin
         writeln(outfile,'\sloppy % - begin no justify');
         writeln(    log,'\sloppy % - begin no justify');
         justify := false
      end;

 { ***** JUSTIFY ***** }
 33 : begin
         writeln(outfile,'\fussy % - turn justification on');
         writeln(    log,'\fussy % - turn justification on');
         justify := true
      end;

 { ***** BREAK ***** }
 34 : begin
        if fill then
        begin
          writeln(outfile,'\hfil\linebreak');
          writeln(    log,'\hfil\linebreak')
        end
        else
        begin
          writeln(outfile,'% RNOTOTEX - forced break');
          writeln(    log,'% RNOTOTEX - forced break')
        end
      end;

 { ***** SPACING ***** }
 35 : begin
         newintvalue(arg[n], spacing, modified, extractedvalue );
         adjustlength(outfile, modified, spacing, extractedvalue, charheight,'baselineskip')
      end;

 { ***** SKIP ***** }
 36 : begin
        if n = 1 then
        begin
           if (spacing > 0) and (spacing < 4) then
           case spacing of
               1 : begin
                     writeln(outfile,'\smallskip');
                     writeln(    log,'\smallskip')
                   end;
               2 : begin
                     writeln(outfile,'\medskip');
                     writeln(    log,'\medskip')
                   end;
               3 : begin
                      writeln(outfile,'\bigskip');
                      writeln(    log,'\bigskip')
                   end
           end
           else
           begin
              writeln(outfile,'\smallskip % - default skip amount');
              writeln(    log,'\smallskip % - default skip amount')
           end
        end
        else
        begin
          skip := 1;
          newintvalue(arg[n], skip, modified, extractedvalue );
          extractedvalue := extractedvalue * spacing;
          write(outfile,'\vspace{');
          write(    log,'\vspace{');
          writecharheight(outfile, extractedvalue);
          c(outfile)
        end
      end;

 { ***** BLANK ***** }
 37 : begin
        if n = 1 then
        begin
          writeln(outfile,'\smallskip');
          writeln(    log,'\smallskip')
        end
        else
        begin
          skip := 1;
          newintvalue(arg[n], skip, modified, extractedvalue );
          write(outfile,'\vspace{');
          write(    log,'\vspace{');
          writecharheight(outfile, extractedvalue);
          c(outfile)
        end
      end;

 { ***** PAGE ***** }
 38 : begin
        writeln(outfile,'\pagebreak[0] \typeout{runoff page break encountered, may be ignored}');
        writeln(    log,'\pagebreak[0]')
      end;

 { ***** TEST PAGE ***** }
 39 : noconversion;

 { ***** CENTRE ***** }
 40 : begin
        if not centering then
        begin
          centering := true;
          if not fill then
          begin
            startnofillagain := true;
            endnofill( outfile )
          end;
          writeln(outfile,'\begin{centering}');
          writeln(    log,'\begin{centering}');
          writeanothertexcommand := 40
        end
        else
        begin
          writeln(outfile,'% RNOTOTEX - centering already active');
          writeln(    log,'% RNOTOTEX - centering already active')
        end
      end;

 { ***** TAB STOPS ***** }
 41 : noconversion;

 { ***** INDENT ***** }
 42 : begin
         indent := 5;
         newintvalue(arg[n], indent, modified, extractedvalue);
         if modified = nochange then
         begin
            write(outfile,'\indent ');
            write(    log,'\indent ')
         end
         else
         begin
           write(outfile,'\hspace*{');
           write(    log,'\hspace*{');
           writecharwidth(outfile, indent);
           write(outfile,'} ');
           writeln(log,'}')
         end
      end;

  { ***** LEFT ***** }
 43 : begin
         indent := 5;
         newintvalue(arg[n], indent, modified, extractedvalue);
         if (modified = nochange) or (n = 1) then
         begin
            write(outfile,'\indent ');
            write(    log,'\indent ')
         end
         else
         begin
           write(outfile,'\hspace*{');
           write(    log,'\hspace*{');
           writecharwidth(outfile, indent);
           write(outfile,'} ');
           writeln(log,'}')
         end
      end;

  { *****  RIGHT ***** }
 44 : begin
         if not flushright then
         begin
           if not fill then
           begin
             startnofillagain := true;
             endnofill( outfile )
           end;
           flushright:= true;
           writeln(outfile,'\begin{flushright}');
           writeln(    log,'\begin{flushright}');
           writeanothertexcommand := 44
         end
         else
         begin
           writeln(outfile,'% RNOTOTEX - flush right already active');
           writeln(    log,'% RNOTOTEX - flush right already active')
         end
      end;

  { ***** NO PERIOD ***** }
 45 : begin
        writeln(outfile,'\frenchspacing');
        writeln(    log,'\frenchspacing')
      end;

  { ***** PERIOD ***** }
 46 : begin
        writeln(outfile,'\nofrenchspacing');
        writeln(    log,'\nofrenchspacing')
      end;

  { ***** NO SPACE ***** }
 47 : noconversion;

  { ***** PARAGRAPH ***** }
 48 : begin
       if n > 1 then
       begin
           newintvalue(arg[2], paragraphdef.indent, modified, extractedvalue);
           newintvalue(arg[3], paragraphdef.vertskip, modified, extractedvalue);
           newintvalue(arg[4], paragraphdef.testpage, modified, extractedvalue)
       end;
       writeln(outfile,'\par');
       writeln(    log,'\par')
      end;

  { ***** SET PARAGRAPH ***** }
 49 : begin
        newintvalue(arg[m(n-2)], paragraphdef.indent, modified, extractedvalue);
        adjustlength(outfile, modified, paragraphdef.indent, extractedvalue,charwidth,'parindent');
        newintvalue(arg[m(n-1)], paragraphdef.vertskip, modified, extractedvalue);
        adjustlength(outfile, modified, paragraphdef.vertskip, extractedvalue,charheight,'parskip');
        newintvalue(arg[m(n)], paragraphdef.testpage, modified, extractedvalue)
      end;

  { ***** AUTOPARAGRAPH ***** }
  50 : noconversion;

  { ***** NO AUTOPARAGRAPH ***** }
  51 : noconversion;

  { ***** AUTOTABLE ***** }
  52 :  noconversion;

  { ***** NO AUTOTABLE ***** }
  53 : noconversion;

  { ***** DISABLE UNDERLINING ***** }
  54 : turnflagoff( underline );

  { ***** ENABLE UNDERLINING ***** }
  55 : turnflagon( underline );

  { ***** NO HYNPHENATION ***** }
  56 : turnflagoff( hyphenate );

  { ***** HYPENATION ***** }
  57 : turnflagon( hyphenate );

  { ***** DISABLE BOLDING ***** }
  58 : turnflagoff( bold );

  { *****  ENABLE BOLDING ***** }
  59 : turnflagon( bold );

  { ***** DISABLE OVERSTRIKE ***** }
  60 : turnflagoff( overstrike );

  { ***** ENABLE OVERSTRIKE ***** }
  61 : turnflagon( overstrike );

  { ***** ENABLE BAR ***** }
  62 : noconversion;

  { ***** BEGIN BAR  ***** }
  63 : noconversion;

  { ***** END BAR ***** }
  64 : noconversion;

  { ***** DISABLE BAR ***** }
  65 : noconversion;

  { ***** FIGURE ***** }
  66 : begin
          skip := 1;
          newintvalue(arg[n], skip, modified, extractedvalue);
          writeln(outfile,'\begin{figure}');
          write(outfile,'\vspace{');
          writeln(    log,'\begin{figure}');
          write(    log,'\vspace{');
          writecharheight(outfile, skip);
          c(outfile);
          writeln(outfile,'\caption{Another Figure}');
          writeln(outfile,'\end{figure}');
          writeln(    log,'\caption{Another Figure}');
          writeln(    log,'\end{figure}')
       end;

   { ***** FIGURE DEFFERED ***** }
  67 : begin
          skip := 1;
          newintvalue(arg[n], skip, modified, extractedvalue);
          writeln(outfile,'\begin{figure}');
          writeln(    log,'\begin{figure}');
          write(outfile,'\vspace{');
          write(    log,'\vspace{');
          writecharheight(outfile, skip);
          c(outfile);
          writeln(outfile,'\caption{Another Figure}');
          writeln(outfile,'\end{figure}');
          writeln(    log,'\caption{Another Figure}');
          writeln(    log,'\end{figure}')
       end;

   { ***** LITERAL ***** }
  68 : begin
          if not inliteral then
          begin
            if not fill then
            begin
              startnofillagain := true;
              endnofill( outfile )
            end;
            inliteral := true;
            writeln(outfile,'\begin{verbatim}');
            writeln(    log,'\begin{verbatim}')
          end
          else
          begin
            writeln(outfile,'% RNOTOTEX - literal already active');
            writeln(    log,'% RNOTOTEX - literal already active')
          end
       end;

   { ***** END LITERAL ***** }
  69 : begin
          if inliteral then
          begin
            writeln(outfile,'\end{verbatim}');
            writeln(    log,'\end{verbatim}');
            inliteral := false;
            if startnofillagain then
            begin
              startnofillagain := false;
              beginnofill( outfile )
            end
          end
          else
          begin
             writeln(outfile,'% RNOTOTEX - end literal not after literal');
             writeln(    log,'% RNOTOTEX - end literal not after literal')
          end
       end;

   { ***** REPEAT ***** }
  70 : begin
         skip := 1;
         newintvalue(arg[2], skip, modified, extractedvalue);
         q := quotedcharacter( arg[3] );
         for i := 1 to skip do
         begin
           texwrite(outfile, q);
           texwrite(    log, q)
         end
       end;

   { ***** LIST ***** }
  71 : begin
         if (not fill) and (listnestlevel = 0) then
         begin
           nofillbeforelist := true;
           endnofill( outfile )
         end;
         listnestlevel := listnestlevel + 1;
         numberofelements[listnestlevel] := 0;
         if n = 3 then
         begin
           q := quotedcharacter( arg[3] );
           writeln(outfile,'\begin{itemize} % list nest ',listnestlevel:1);
           writeln(    log,'\begin{itemize}');
           liststate[listnestlevel] := itemize;
           write(outfile,'\item ');
           outputfirstitem[listnestlevel] := true
         end
         else
         begin
           writeln(outfile,'\begin{enumerate} % list nest ',listnestlevel:1);
           writeln(    log,'\begin{enumerate}');
           liststate[listnestlevel] := enumerate;
           write(outfile,'\item ');
           outputfirstitem[listnestlevel] := true
         end
       end;

    { ***** END LIST ***** }
   72 : begin
          if listnestlevel > 0 then
          begin
            case liststate[listnestlevel] of
               nostate   : writeln(outfile,'% - RNOTOTEX - close on list not open');
               itemize    : writeln(outfile,'\end{itemize} % - list nest ',listnestlevel:1);
               enumerate  : writeln(outfile,'\end{enumerate} % - list nest ',listnestlevel:1)
            end;
            case liststate[listnestlevel] of
               nostate   : writeln(    log,'% - RNOTOTEX - close on list not open');
               itemize    : writeln(    log,'\end{itemize}');
               enumerate  : writeln(    log,'\end{enumerate}')
            end;
            numberofelements[listnestlevel] := 0;
            liststate[listnestlevel] := nostate;
            outputfirstitem[listnestlevel] := false;
            listnestlevel := listnestlevel - 1;
            if (listnestlevel = 1) and (nofillbeforelist) then
            begin
               nofillbeforelist := false;
               beginnofill( outfile )
            end
          end
          else
          begin
             writeln(outfile,'% - RNOTOTEX end list for none started');
             writeln(    log,'% - RNOTOTEX end list for none started')
          end
        end;

    { ***** LIST ELEMENT ***** }
   73 : begin
          if listnestlevel > 0 then
          begin
            if liststate[listnestlevel] = nostate then
            begin
               writeln(outfile,'% - RNOTOTEX - list element for non-existant-list');
               writeln(    log,'% - RNOTOTEX - list element for non-existant-list')
            end
            else
            begin
              if not outputfirstitem[listnestlevel] then
              begin
                write(outfile,'\item ');
                writeln(    log,'\item ')
              end
              else
                outputfirstitem[listnestlevel] := false;
              numberofelements[listnestlevel] := numberofelements[listnestlevel] + 1
            end
          end
          else
          begin
            writeln(outfile,'% - RNOTOTEX - list element for unopened-list');
            writeln(    log,'% - RNOTOTEX - list element for unopened-list')
          end
        end;

    { ***** NUMBER LIST ***** }
   74 : begin
          newintvalue(arg[2], numberlist.listlevel, modified, extractedvalue);
          newintvalue(arg[3], numberlist.valuetoset, modified, extractedvalue);
          if (numberlist.listlevel > 0) and ( numberlist.listlevel < 5) then
            case numberlist.valuetoset of
               1 : adjustcounter(outfile, modified, numberlist.valuetoset,extractedvalue,'enumi');
               2 : adjustcounter(outfile, modified, numberlist.valuetoset,extractedvalue,'enumii');
               3 : adjustcounter(outfile, modified, numberlist.valuetoset,extractedvalue,'enumiii');
               4 : adjustcounter(outfile, modified, numberlist.valuetoset,extractedvalue,'enumiv')
            end
        end;

     { ***** DISPLAY ELEMENTS ***** }
    75 : noconversion;

     { ***** NOTE ***** }
    76 : begin
           if not inmarginpar then
           begin
             writeln(outfile,'\marginpar{\em ');
             writeln(    log,'\marginpar{\em ');
             inmarginpar := true;
             if n > 1 then
             begin
               dumpthelist(outfile, dsrlist);
               dumpthelist(    log, dsrlist);
               inmarginpar := false;
               c(outfile)
             end
           end
           else
           begin
              writeln(outfile,'% RNOTOTEX - marginpar already active');
              writeln(    log,'% RNOTOTEX - marginpar already active')
           end
         end;

     { ***** END NOTE ***** }
    77 : begin
           if inmarginpar then
           begin
             writeln(outfile,'} % - end of margin par ');
             writeln(    log,'} % - end of margin par ')
           end
           else
           begin
              writeln(outfile,'% RNOTOTEX - marginpar not active');
              writeln(    log,'% RNOTOTEX - marginpar not active')
           end;
           inmarginpar := false
         end;

     { ***** FOOTNOTE ***** }
    78 : begin
           if not infootnote then
           begin
             write(outfile,'\footnote{');
             writeln(    log,'\footnote{');
             infootnote := true
           end
           else
           begin
             writeln(outfile,'% RNOTOTEX - already in footnote');
             writeln(    log,'% RNOTOTEX - already in footnote')
           end
         end;

     { ***** END FOOTNOTE ***** }
    79 : begin
           if infootnote then
           begin
              writeln(outfile,'} % - end of footnote');
              writeln(    log,'} % - end of footnote')
           end
           else
           begin
              writeln(outfile,'% RNOTOTEX - footnote not active');
              writeln(    log,'% RNOTOTEX - footnote not active')
           end;
           infootnote := false
         end;

     { ***** CHAPTER ***** }
    80 : begin
           if not startedwithfill then
              endnofill(outfile);
           write(outfile,'\chapter{');
           write(    log,'\chapter{');
           dumpthelist(outfile, nextinlist(dsrlist));
           dumpthelist(    log, nextinlist(dsrlist));
           c(outfile);
           if not startedwithfill then
             beginnofill(outfile);
         end;

     { ***** NUMBER CHAPTER ***** }
    81 : begin
            newcountparameter(arg[n], numberchapter, modified, extractedvalue, class);
            adjustcounter(outfile, modified, numberchapter, extractedvalue,'chapter')
         end;

     { ***** DISPLAY CHAPTER ***** }
    82 : begin
           newstyleparameter(arg[n], displaychapter);
           adjuststyle(outfile, displaychapter, 'chapter')
         end;

      { ***** HEADER LEVEL ***** }
     83 : begin
            newintvalue(arg[2], nestlevel, modified, extractedvalue);
            if modified <> nochange then
               startindex := 3
            else
            begin
              newintvalue(arg[3], nestlevel, modified, extractedvalue);
              startindex := 4
            end;
            if modified <> nochange then
            begin
               if (nestlevel > 0) and (nestlevel < 7) then
               begin
                 case nestlevel of
                   1 : write(outfile,'\section{');
                   2 : write(outfile,'\subsection{');
                   3 : write(outfile,'\subsubsection{');
                   4 : write(outfile,'\paragraph{');
                   5 : write(outfile,'\subparagraph{');
                   6 : write(outfile,'\P ')
                 end;
                 case nestlevel of
                   1 : write(    log,'\section{');
                   2 : write(    log,'\subsection{');
                   3 : write(    log,'\subsubsection{');
                   4 : write(    log,'\paragraph{');
                   5 : write(    log,'\subparagraph{');
                   6 : write(    log,'\P ')
                 end;
                 for i := startindex to n do
                 begin
                   texwritearg(outfile, arg[i] );
                   texwritearg(    log, arg[i] )
                 end;
                 if nestlevel < 6 then
                   c(outfile);
                 headerlevel[nestlevel].value := headerlevel[nestlevel].value + 1
               end
            end
          end;

      { ***** NUMBER LEVEL ***** }
     84 : begin
            startindex := -1;
            if  n = 7 then startindex := 2;
            if  n = 8 then startindex := 3;
            if startindex <> -1 then
            begin
              for i := startindex to (startindex + 5) do
              begin
                j := i - startindex + 1;
                newintvalue(arg[i], headerlevel[j].value, modified,extractedvalue);
                 case j of
                   1 : adjustcounter(outfile, modified, headerlevel[1].value,extractedvalue,'section');
                   2 : adjustcounter(outfile, modified, headerlevel[2].value,extractedvalue,'subsection');
                   3 : adjustcounter(outfile, modified, headerlevel[3].value,extractedvalue,'subsubsection');
                   4 : adjustcounter(outfile, modified, headerlevel[4].value,extractedvalue,'paragraph');
                   5 : adjustcounter(outfile, modified, headerlevel[5].value,extractedvalue,'subparagraph');
                   6 : noconversion
                 end
              end
            end
          end;

       { ***** STYLE HEADERS ***** }
      85 : noconversion;

       { ***** DISPLAY LEVELS ***** }
      86 : begin
            startindex := -1;
            if  n = 7 then startindex := 2;
            if  n = 8 then startindex := 3;
            if startindex <> -1 then
            begin
              for i := startindex to (startindex + 5) do
              begin
                j := i - startindex + 1;
                newstyleparameter(arg[i], headerlevel[j].display);
                 case j of
                   1 : adjuststyle(outfile, headerlevel[1].display, 'section');
                   2 : adjuststyle(outfile, headerlevel[2].display, 'subsection');
                   3 : adjuststyle(outfile, headerlevel[3].display, 'subsubsection');
                   4 : adjuststyle(outfile, headerlevel[4].display, 'paragraph');
                   5 : adjuststyle(outfile, headerlevel[5].display ,'subparagraph');
                   6 : noconversion
                 end
              end
            end
           end;

      { ***** APPENDIX ***** }
     87 : begin
            write(outfile,'\chapter{APPENDIX ');
            write(    log,'\chapter{APPENDIX ');
            if n >= 2 then
            begin
              write(outfile,': ');
              write(    log,': ');
              dumpthelist(outfile, nextinlist(dsrlist));
              dumpthelist(    log, nextinlist(dsrlist))
            end;
            c(outfile)
          end;

      { ***** NUMBER APPENDIX ***** }
     88 : begin
            newcountparameter(arg[n], numberappendix, modified, extractedvalue,class);
            adjustcounter(outfile, modified, numberappendix, extractedvalue, 'chapter')
          end;

      { ***** DISPLAY APPENDIX ***** }
     89 : begin
            newstyleparameter(arg[n], displayappendix);
            adjuststyle(outfile, displayappendix, 'chapter')
          end;

      { ***** STANDARD ***** }
     90 : noconversion;

      { ***** COMMENT ***** }
     91 : begin
             write(outfile,'% ');
             dumpthelist(outfile, nextinlist(dsrlist));
             write(    log,'% ');
             dumpthelist(    log, nextinlist(dsrlist))
          end;

      { ***** REQUIRE ***** }
     92 : begin
            write(outfile,'%%%%%% REQUIRE WAS HERE %%%%% \input {');
            dumpthelist(outfile, nextinlist(dsrlist));
            write(    log,'\input {');
            dumpthelist(    log, nextinlist(dsrlist));
            c(outfile)
          end;

      { ***** CONTROL CHARACTERS ***** }
     93 : noconversion;

      { ***** NO CONTROL CHARACTERS ***** }
     94 : noconversion;

      { ***** IF ***** }
     95 : noconversion;

      { ***** ELSE ***** }
     96 : noconversion;

      { ***** END IF ***** }
     97 : noconversion;

      { ***** IFNOT ***** }
     98 : noconversion;

      { ***** VARIABLE ***** }
     99 : noconversion;

      { ***** SET DATE ***** }
    100 : noconversion;

      { ***** SET TIME ***** }
    101 : noconversion;

      { ***** FLAGS ALL ***** }
    102 : begin
            for f := control to substitute do
               turnflagon( f )
          end;

      { ***** NO FLAGS ALL ***** }
    103 : begin
            for f := control to substitute do
               turnflagoff( f );
            turnflagon( control )
          end;

      { ***** NO FLAGS CONTROL ***** }
    104 : turnflagoff( control );

      { ***** FLAGS CONTROL ***** }
    105 : flagchange(control, arg[n]);

      { ***** NO FLAGS UPPERCASE ***** }
    106 : turnflagoff( uppercase );

      { ***** FLAGS UPPERCASE ***** }
    107 : flagchange( uppercase, arg[n]);

      { ***** NO FLAGS LOWERCASE ***** }
    108 : turnflagoff( lowercase );

      { ***** FLAGS LOWERCASE ***** }
    109 : flagchange( lowercase, arg[n]);

      { ***** NO FLAGS QUOTE ***** }
    110 : turnflagoff( quote );

      { ***** FLAGS QUOTE ***** }
    111 : flagchange( quote, arg[n] );

      { ***** NO FLAGS SPACE ***** }
    112 : turnflagoff( space );

      { ***** FLAGS SPACE ***** }
    113 : flagchange( space, arg[n] );

      { ***** NO FLAGS UNDERLINE ***** }
    114 : turnflagoff( underline );

      { ***** FLAGS UNDERLINE ***** }
    115 : flagchange( underline, arg[n] );

      { ***** NO FLAGS BOLD ***** }
    116 : turnflagoff( bold );

      { ***** FLAGS BOLD ***** }
    117 : flagchange( bold, arg[n] );

      { ***** NO FLAGS OVERSTRIKE ***** }
    118 : turnflagoff( overstrike );

      { ***** FLAGS OVERSTRIKE ***** }
    119 : flagchange( overstrike, arg[n] );

      { ***** NO FLAGS HYPHENATE ***** }
    120 : turnflagoff( hyphenate );

      { ***** FLAGS HYPHENATE ***** }
    121 : flagchange( hyphenate, arg[n] );

      { ***** NO FLAGS CAPITALIZE ***** }
    122 : turnflagoff( capitalize );

      { ***** FLAGS CAPITALIZE ***** }
    123 : flagchange( capitalize, arg[n] );

      { ***** NO FLAGS END FOOTNOTE ***** }
    124 : turnflagoff( endfootnote );

      { ***** FLAGS END FOOTNOTE ***** }
    125 : flagchange( endfootnote, arg[n] );

      { ***** NO FLAGS COMMENT ***** }
    126 : turnflagoff( comment );

      { ***** FLAGS COMMENT ***** }
    127 : flagchange( comment, arg[n] );

      { ***** NO FLAGS SUBSTITUTE ***** }
    128 : turnflagoff( substitute );

      { ***** FLAGS SUBSTITUTE ***** }
    129 : flagchange( substitute, arg[n] );

      { ***** INDEX ***** }
    130 : begin
            write(outfile,'\index{');
            dumpthelist(outfile, nextinlist(dsrlist));
            write(    log,'\index{');
            dumpthelist(    log, nextinlist(dsrlist));
            c(outfile)
          end

end; {case of tex index extracted}


routineexit : nullstatement
end;



[GLOBAL] PROCEDURE putsecondarytexcommand(var outfile : text;
                                 var nextcommand : integer );
begin

 if nextcommand = 40 {centering}      then
 begin
     if centering then
     begin
       centering := false;
       writeln(outfile,'\end{centering}');
       if startnofillagain then
       begin
         startnofillagain := false;
         beginnofill( outfile )
       end
     end
     else
     begin
       writeln(outfile,'% RNOTOTEX - end centering when centering not-active');
       writeln(    log,'% RNOTOTEX - end centering when centering not-active')
     end
 end;
 if nextcommand = 44 {rightjustify}  then
 begin
     if flushright then
     begin
       flushright := false;
       writeln(outfile,'\end{flushright}');
       if startnofillagain then
       begin
         startnofillagain := false;
         beginnofill( outfile )
       end
     end
     else
     begin
       writeln(outfile,'% RNOTOTEX - end flushright when not active');
       writeln(    log,'% RNOTOTEX - end flushright when not active')
     end
 end;

 nextcommand := indexofunknowntexcommand

end;





END.