! Program to convert a View source file into a TeX source ! RMM 16/5/82 ! Modded by JHB Sep 84 ! Transfer from Layout to Tex in progress Jan 1989 !!%include "inc:util.imp" !-- %external%predicate%spec EXISTS(%string(255)file) {apm} %system%string(8)%fn%spec DATE {apm} %system%string(5)%fn%spec TIME !-- %begin %const %integer TT = 0; ! terminal I/O stream %const %integer source = 1 %const %integer destination = 1 %const %integer stream error = 9; ! event signalled on trouble %string (255) input file,output file,a,b %integer lines = 0 %owninteger blank=0 ;!Count of how many consecutive blank lines we've had %owninteger sectionnos=0 ;!Flag to catch text before the first section. ;!We insert special section "Preamble". %owninteger ttmode=0 %string (255) current line ! section stack %const %integer max depth = 10 %integer %array sect no (1 : max depth); ! section numbers %integer TOS = 0; ! top of section stack ! ! SET DEFAULT ! %constinteger nonfatal=0, fatal=1 %routine readline(%string (*) %name s) %byte c s="" %cycle; readsymbol(c); %exit %if c<' '; s=s.tostring(c); %repeat %end %routine printline(%string (255) s) printstring(s); newline %end %routine error(%string (255) text, %integer what) printline(text) %stop %if what = fatal %end %routine set default(%string (*) %name file, %string (7) extension) %if exists(file.extension) %then file = file.extension %end ! ! PRINT MODDED ! Quotes special characters and converts runs of spaces to HSPACE. ! Note trailing spaces are discarded as a side-effect ! Spaces at start of line will usually indicate some specific formatting ! so force a line break. ! %routine print modded (%string (255) line) %integer n,c,lastc, spcs %predicate all white(%string (*) %name s) %integer i %true %if s="" %for i=1,1,length(s) %cycle %false %if charno(s, i) # ' ' %repeat %true %end printstring(line) %and %return %if ttmode#0 %if all white(line) %then blank=blank+1 %and %return printline("\section{Preamble}") %and sectionnos=1 %and %c blank=1 %if sectionnos=0 spcs=0 %for n = 1, 1, length (line) %cycle c = charno(line, n) %if c # ' ' %and spcs#0 %start %if spcs <= 2 %start space %else %if spcs=n-1 %start ;!Line is blank from start printstring("\\ ") %if blank=0 printstring("{\hspace*{") %else printstring(" {\hspace{") %finish print(spcs/15,0,1); printstring(" in}} ") %finish spcs = 0 %finish %if c = '$' %or c = '&' %or c = '%' %or c = '#' %or %c c = '_' %or c = '{' %or c = '}' %start printsymbol('\') print symbol (c) %elseif c = '^' printstring("$\hat{ }${}") %elseif c = '<' printstring("$<$") %elseif c = '\' printstring("$\backslash$") %elseif c = '>' printstring("$>$") %elseif c = ' ' %and ttmode=0 spcs=spcs+1 %else printsymbol(c) %finish %repeat blank=0 %end; ! of print modded ! +----------+ ! | | ! | GET LINE | ! | | ! +----------+ %routine get line lines = lines + 1 read line (current line) %end; ! of get line ! +------------+ ! | | ! | INITIALISE | ! | | ! +------------+ %routine initialise %string (255) param,left,right,title,author,title line %integer xx,yy %on stream error %start select output (TT) error("Fails: ".event_message, fatal) %finish input file = cli param output file = input file %unless input file -> input file.("/").output file %if output file -> output file.(".").b %start; %finish output file = output file.".tex" output file = input file %if output file = "" input file = "view:".input file %unless exists(input file) open input (source, input file) select input (source) set default (output file, ".tex") printline("Converting ".input file." to ".output file) open output (destination, output file) select output (destination) ! some preliminary TeX options get line %until current line # ""; !title line !This should be a comment !{mmmmmmm} but it might be ! !mmmmmmmm xx = 1 xx=xx+1 %if charno(current line,1) = '!' xx=xx+1 %if charno(current line,2) = '{' yy = length(current line) yy=yy-1 %if charno(current line, length(current line)) = '}' title line = substring(current line,xx, yy) title=title line %and author = "APM Manual pages" %unless %c title line -> title.("/").author printline("\documentstyle[a4,12pt]{article}") printline("\begin{document}") printline("\author{".author."}") printline("\title{".title."}") printline("\maketitle") printline("\parskip .1 in") printline("\setcounter{secnumdepth}{10}") printline("\parindent 0in") ! initialise stack sect no (1) = 0 %end; ! of intialise ! +--------------+ ! | | ! | PROCESS LINE | ! | | ! +--------------+ %routine process line %byte %name ch %string (255) s ! ! CHECKS ! %predicate checks (%string (15) c) %true %if sub string (current line, 1, length (c) + 1) = "!" . c %false %end; ! of checks ! ! MAIN CODE OF PROCESS LINE ! %if current line="" %start newline; blank=1 %return %finish ch == char no (current line, 1) %if ch = '!' %start ! may be a command line ch == char no (current line, 2) %begin %integer n %switch ctype (0 : '~') -> ctype (ch) ctype ('<'): ! start of section ch == char no (current line, 3) %if ch = '>' %then %c error("Fails: Subsiduary files not implemented", fatal) TOS = TOS + 1; ! a new section %if TOS = max depth %then %c error("Fails: Nesting too deep", fatal) sect no (TOS) = sect no (TOS) + 1 sect no (TOS + 1) = 0 sectionnos=1 %if TOS = 1 %start print string ("\section{") %elseif TOS = 2 printstring("\subsection{") %else printstring("\subsubsection{") %finish print modded (sub string (current line, 3, length (current line))) printstring("}"); newline blank=1 %return ctype ('>'): ! end of section %if TOS = 0 %then %c error("Fails: Unbalanced brackets", fatal) TOS = TOS - 1; ! pop section stack newline %return ctype ('T'): ! TITLE -> fall out %unless checks ("TITLE") %if lines > 1 %then %c error("Fails: TITLE out of context", fatal) print string ("\section{") sectionnos=1 print modded (sub string (current line, 8, length (current line))) printstring("}"); newline blank=1 %return ctype ('{'): ! Comment s = sub string(current line, 3, length(current line)-1) %if charno(s,1) = '\' %start ;!Embedded TeX Command %if s = "\tt" %then printstring("\small") %if s = "\rm" %then printstring("\end{verbatim}") print string(s); space %if s = "\tt" %then printstring("\begin{verbatim}") %if s = "\tt" %then ttmode=1 %if s = "\rm" %then ttmode=0 %if s = "\rm" %then printstring(" \normalsize ") %finish %return ctype ('P'): ! PAGE -> fall out %unless checks ("PAGE") ! newline; ! maybe %return ctype ('S'): ! STOP %if checks ("STOP") %start printstring("\vspace(.75in} ".input file." printed on ".date." at ".time) printline("\newpage") printline("\tableofcontents") newline; print string ("\end{document}") newline %stop %else %if checks ("SKIP") error("Fails: SKIP not implemented", fatal) %finish ! -> fall out fall out: ctype (*): ! anything else print modded (sub string (current line, 2, length (current line))) newline %end %else print modded (current line) newline %finish %end; ! of process line ! +------------+ ! | | ! | EVENT TRAP | ! | | ! +------------+ %on stream error %start %if event_sub = 3 %start select output (TT) print string ("Fails: ") print string (event_message) newline %else printstring("\vspace{.75in} ".input file." printed on ".date." at ".time); newline newline printline("\newpage") printline("\tableofcontents") print string ("\end{document}"); newline %finish %stop %finish ! +-----------+ ! | | ! | MAIN CODE | ! | | ! +-----------+ initialise %cycle get line process line %repeat %end %end %of %file