Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!samsung!munnari.oz.au!metro!news From: glenn@extro.ucc.su.oz.au (Glenn Geers) Newsgroups: alt.sources Subject: wp2latex (2 of 4) Message-ID: <1990Aug8.114959.17178@metro.ucc.su.OZ.AU> Date: 8 Aug 90 11:49:59 GMT Reply-To: glenn@extro.ucc.su.oz.au (Glenn Geers) Organization: University Computing Service, Uni. of Sydney, Australia. Lines: 2003 #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # wp2latex.pas # This archive created: Wed Aug 8 21:44:56 1990 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'wp2latex.pas'" '(49507 characters)' if test -f 'wp2latex.pas' then echo shar: "will not over-write existing file 'wp2latex.pas'" else sed 's/^ X//' << \SHAR_EOF > 'wp2latex.pas' XProgram WordPerfect_to_LaTeX; X X{ Version 1.0 X Date 27-1-1990 X} X X{$R+} { Range check error } X X XUses Crt; { Clearscreen } X XType Bin = file of byte; X XVar X wpd_fn, X strip_fn, X tabel_fn, X latex_fn : String; X X wpd, X tabel : Bin; X strip, X latex : Text; X X num_of_lines_stripfile : Word; X X open_com, X close_com : Array [$0..$10] of String; X X Exitsave : pointer; X X XProcedure Rd_word(Var f:Bin; Var w:Word); X{ Deze procedure leest een woord uit de opgegeven binaire file. } X XVar X b : Byte; X XBegin X Read(f,b); X w:=b; X Read(f,b); X w:=w+256*b XEnd; X X XProcedure Wr_word(Var f:Bin; w:Word); X{ Deze procedure schrijft een woord in de opgegeven binaire file. } X XVar X b : Byte; X XBegin X b:=w mod 256; X Write(f,b); X b:=w div 256; X Write(f,b); XEnd; X X XProcedure Jump_in_file(Var f:Bin; dis:Longint); X{ Deze procedure springt in een binaire file het aantal opgegeven bytes. } X XVar X cur_pos : Longint; X XBegin X cur_pos := Filepos(f); X Seek(f,cur_pos+dis); XEnd; X X X XProcedure Wpd_check; X{ Kontroleert of de opgegeven WP-document wel daadwerkelijk een } X{ WP5.0-document is. } X XVar id1,id2,std1,std2,filetype,dmp1,dmp2,dmp3 : Word; X Startdoc, Pointer : Longint; X b:Byte; X XBegin X Rd_word(wpd,id1); Rd_word(wpd,id2); X Rd_word(wpd,std1); Rd_word(wpd,std2); X Rd_word(wpd,filetype); X Rd_word(wpd,dmp1); Rd_word(wpd,dmp2); Rd_word(wpd,dmp3); X X Startdoc:=std2*65536+std1; X X If (id1=$57ff) and (id2=$4350) and X (filetype=$0A01) {and (dmp1=$0) and (dmp2=$0) and (dmp3=$0)} X X Then Seek(wpd,startdoc) { Het is een WP5.0-document} X Else RunError($0201) { Het is geen WP5.0-document} XEnd; X X X X XProcedure Filenames; X{ Deze procedure handelt het opgeven van de filenamen af. } X XVar X name, X invoer, X wpdef, X latdef, X filename, X ext : String; X l,p : Integer; X XBegin X If ParamCount<1 X Then wpdef:='' X Else wpdef:=Paramstr(1); X X Writeln; X Writeln; X Write('WordPerfect-filename [',wpdef,'] : '); X Readln(invoer); X If invoer='' X Then wpd_fn:=wpdef X Else wpd_fn:=invoer; X X If wpd_fn='' { No filename entered } X Then RunError($200); X X name:=wpd_fn; X l:=Length(name); X p:=Pos('.',name); X if p=0 then p:=l+1; X filename:=copy(name,1,p-1); X X strip_fn:=concat(filename,'.STR'); X tabel_fn:=concat(filename,'.TBL'); X latdef:=concat(filename,'.TEX'); X X Write('LaTeX-filename [',latdef,'] : '); X Readln(invoer); X Writeln; X If invoer='' X Then latex_fn:=latdef X Else latex_fn:=invoer; X X Assign(wpd,wpd_fn); X Assign(strip,strip_fn); X Assign(tabel,tabel_fn); X Assign(latex,latex_fn); X XEnd; X X X{$F+} XProcedure Einde_prog; X{ Deze procedure wordt aan het einde van het programma aangeroepen. } X{ Er wordt gekeken of er zich Run-Time error heeft voor gedaan. } X XVar X save_ErrorAddr : Pointer; X XBegin X Writeln; X X ExitProc:=Exitsave; X save_ErrorAddr := ErrorAddr; X ErrorAddr := nil; X X If save_ErrorAddr <> nil X Then Case Exitcode of X $0002 : Writeln('File not found.'); X $0003 : Writeln('Path not found.'); X $0100 : Writeln('Program Error.'); X $0200 : Writeln('No filename entered !'); X $0201 : Writeln('Not a WordPerfect 5.0 document !'); X X Else ErrorAddr := save_ErrorAddr; X End X X Else Begin X Writeln('Conversion completed.'); X Writeln; X End; X X Writeln; XEnd; X{$F-} X X XProcedure Init_commando; XBegin X Open_com[$0]:='{\LARGE '; X Open_com[$1]:='{\Large '; X Open_com[$2]:='{\large '; X Open_com[$3]:='{\small '; X Open_com[$4]:='{\footnotesize '; X Open_com[$5]:='$^{\rm '; X Open_com[$6]:='$_{\rm '; X Open_com[$7]:=''; X Open_com[$8]:='{\it '; X Open_com[$9]:=''; X Open_com[$A]:=''; X Open_com[$B]:='\underline{\Underline{'; X Open_com[$C]:='{\bf '; X Open_com[$D]:=''; X Open_com[$E]:='\Underline{'; X Open_com[$F]:='{\sc '; X X Close_com[$0]:='}'; X Close_com[$1]:='}'; X Close_com[$2]:='}'; X Close_com[$3]:='}'; X Close_com[$4]:='}'; X Close_com[$5]:='}$'; X Close_com[$6]:='}$'; X Close_com[$7]:=''; X Close_com[$8]:='\/}'; X Close_com[$9]:=''; X Close_com[$A]:=''; X Close_com[$B]:='}}'; X Close_com[$C]:='}'; X Close_com[$D]:=''; X Close_com[$E]:='}'; X Close_com[$F]:='}'; XEnd; X X X{---SLAG1----} X XProcedure Convert_first_strike; X{ Dit is de komplete procedure van de eerste slag met zijn eigen proc.'s. } X XVar X by : Byte; X wo, X regelnum : Word; X X convperc, X i : Integer; X X srtdocpos, X fsize, X fpos, X nextdocpos : longint; X X lat : Array[$20..$7F] of String[25]; X char_set : Array[$80..$FE] of Integer; X char_code : Array[$80..$FE] of Integer; X ext_lat : Array[$80..$FE] of String[25]; X X X leegptr, X openptr : Array [0..1] of Integer; X attr_rij : Array [0..1,0..16] of Byte; X open_attr_rij : Array [0..1] of Boolean; X depth : Integer; X X envir, X line_term : Char; X X char_on_line, X nomore_valid_tabs, X indenting, X indent_end, X ind_text1, X ind_text2 : Boolean; X X ind_leftmargin, X ind_rightmargin : Word; X X num_of_tabs, X latex_tabpos : Integer; X tabpos : Array [1..40] of Word; X right_tab, X align_tab, X center_tab : Boolean; X X WP_sidemargin : Integer; X X X X XProcedure WP_Default; XVar X j : Integer; X XBegin X WP_sidemargin := 1200; X X tabpos[1]:=$02c5; { 1e WP-tab is kantlijn --> } X For j:=2 to 10 X Do tabpos[j]:=tabpos[j-1]+$02c5; { Volgende tabs 1,5 cm } X For j:=11 to 40 { ($02c5 wpu) verder } X Do tabpos[j]:=$FFFF; X X num_of_tabs:=10; XEnd; X X XProcedure Table_Init; XBegin X lat[$20]:=' '; {Space} X lat[$21]:='!'; {!} X lat[$22]:='"'; {"} X lat[$23]:='\#'; {#} X lat[$24]:='\$'; {dollar} X lat[$25]:='\%'; {%} X lat[$26]:='\&'; {&} X lat[$27]:=''''; {'} X lat[$28]:='('; {(} X lat[$29]:=')'; {)} X lat[$2A]:='*'; {*} X lat[$2B]:='+'; {+} X lat[$2C]:=','; {,} X lat[$2D]:='-'; {-} X lat[$2E]:='.'; {.} X lat[$2F]:='/'; {/} X lat[$30]:='0'; {0} X lat[$31]:='1'; {1} X lat[$32]:='2'; {2} X lat[$33]:='3'; {3} X lat[$34]:='4'; {4} X lat[$35]:='5'; {5} X lat[$36]:='6'; {6} X lat[$37]:='7'; {7} X lat[$38]:='8'; {8} X lat[$39]:='9'; {9} X lat[$3A]:=':'; {:} X lat[$3B]:=';'; {;} X lat[$3C]:='$<$'; {<} X lat[$3D]:='='; {=} X lat[$3E]:='$>$'; {>} X lat[$3F]:='?'; {?} X lat[$40]:='@'; {@} X lat[$41]:='A'; {A} X lat[$42]:='B'; {B} X lat[$43]:='C'; {C} X lat[$44]:='D'; {D} X lat[$45]:='E'; {E} X lat[$46]:='F'; {F} X lat[$47]:='G'; {G} X lat[$48]:='H'; {H} X lat[$49]:='I'; {I} X lat[$4A]:='J'; {J} X lat[$4B]:='K'; {K} X lat[$4C]:='L'; {L} X lat[$4D]:='M'; {M} X lat[$4E]:='N'; {N} X lat[$4F]:='O'; {O} X lat[$50]:='P'; {P} X lat[$51]:='Q'; {Q} X lat[$52]:='R'; {R} X lat[$53]:='S'; {S} X lat[$54]:='T'; {T} X lat[$55]:='U'; {U} X lat[$56]:='V'; {V} X lat[$57]:='W'; {W} X lat[$58]:='X'; {X} X lat[$59]:='Y'; {Y} X lat[$5A]:='Z'; {Z} X lat[$5B]:='['; {[} X lat[$5C]:='$\tt\backslash$'; {\} X lat[$5D]:=']'; {]} X lat[$5E]:='\^{'; {^} X lat[$5F]:='\_'; {_} X lat[$60]:='`'; {`} X lat[$61]:='a'; {a} X lat[$62]:='b'; {b} X lat[$63]:='c'; {c} X lat[$64]:='d'; {d} X lat[$65]:='e'; {e} X lat[$66]:='f'; {f} X lat[$67]:='g'; {g} X lat[$68]:='h'; {h} X lat[$69]:='i'; {i} X lat[$6A]:='j'; {j} X lat[$6B]:='k'; {k} X lat[$6C]:='l'; {l} X lat[$6D]:='m'; {m} X lat[$6E]:='n'; {n} X lat[$6F]:='o'; {o} X lat[$70]:='p'; {p} X lat[$71]:='q'; {q} X lat[$72]:='r'; {r} X lat[$73]:='s'; {s} X lat[$74]:='t'; {t} X lat[$75]:='u'; {u} X lat[$76]:='v'; {v} X lat[$77]:='w'; {w} X lat[$78]:='x'; {x} X lat[$79]:='y'; {y} X lat[$7A]:='z'; {z} X lat[$7B]:='\{'; {{} X lat[$7C]:='$|$'; {|} X lat[$7D]:='\}'; { } X lat[$7E]:='\tidle{'; {~} X lat[$7F]:=' '; {Don't exsist} XEnd; X X XProcedure Ext_chr_init; XBegin X char_set[$80]:=$01; char_code[$80]:=$26; ext_lat[$80]:='\c{C}'; X char_set[$81]:=$01; char_code[$81]:=$47; ext_lat[$81]:='\"{u}'; X char_set[$82]:=$01; char_code[$82]:=$29; ext_lat[$82]:='\''{e}'; X char_set[$83]:=$01; char_code[$83]:=$1D; ext_lat[$83]:='\^{a}'; X char_set[$84]:=$01; char_code[$84]:=$1F; ext_lat[$84]:='\"{a}'; X char_set[$85]:=$01; char_code[$85]:=$21; ext_lat[$85]:='\`{a}'; X char_set[$86]:=$01; char_code[$86]:=$23; ext_lat[$86]:='\aa '; X char_set[$87]:=$01; char_code[$87]:=$27; ext_lat[$87]:='\c{c}'; X char_set[$88]:=$01; char_code[$88]:=$2B; ext_lat[$88]:='\^{e}'; X char_set[$89]:=$01; char_code[$89]:=$2D; ext_lat[$89]:='\"{e}'; X char_set[$8A]:=$01; char_code[$8A]:=$2F; ext_lat[$8A]:='\`{e}'; X char_set[$8B]:=$01; char_code[$8B]:=$35; ext_lat[$8B]:='\"{\i}'; X char_set[$8C]:=$01; char_code[$8C]:=$33; ext_lat[$8C]:='\^{\i}'; X char_set[$8D]:=$01; char_code[$8D]:=$37; ext_lat[$8D]:='\`{\i}'; X char_set[$8E]:=$01; char_code[$8E]:=$1E; ext_lat[$8E]:='\"{A}'; X char_set[$8F]:=$01; char_code[$8F]:=$22; ext_lat[$8F]:='\AA '; X char_set[$90]:=$01; char_code[$90]:=$28; ext_lat[$90]:='\''{E}'; X char_set[$91]:=$01; char_code[$91]:=$25; ext_lat[$91]:='\ae '; X char_set[$92]:=$01; char_code[$92]:=$24; ext_lat[$92]:='\AE '; X char_set[$93]:=$01; char_code[$93]:=$3D; ext_lat[$93]:='\^{o}'; X char_set[$94]:=$01; char_code[$94]:=$3F; ext_lat[$94]:='\"{o}'; X char_set[$95]:=$01; char_code[$95]:=$41; ext_lat[$95]:='\`{o}'; X char_set[$96]:=$01; char_code[$96]:=$45; ext_lat[$96]:='\^{u}'; X char_set[$97]:=$01; char_code[$97]:=$49; ext_lat[$97]:='\`{u}'; X char_set[$98]:=$01; char_code[$98]:=$8B; ext_lat[$98]:='\"{y}'; X char_set[$99]:=$01; char_code[$99]:=$3E; ext_lat[$99]:='\"{O}'; X char_set[$9A]:=$01; char_code[$9A]:=$46; ext_lat[$9A]:='\"{U}'; X char_set[$9B]:=$04; char_code[$9B]:=$13; ext_lat[$9B]:='\ '; X char_set[$9C]:=$04; char_code[$9C]:=$0B; ext_lat[$9C]:='\pounds '; X char_set[$9D]:=$04; char_code[$9D]:=$0C; ext_lat[$9D]:='\ '; X char_set[$9E]:=$04; char_code[$9E]:=$0D; ext_lat[$9E]:='\ '; X char_set[$9F]:=$04; char_code[$9F]:=$0E; ext_lat[$9F]:='{\it f}\/'; X char_set[$A0]:=$01; char_code[$A0]:=$1B; ext_lat[$A0]:='\''{a}'; X char_set[$A1]:=$01; char_code[$A1]:=$31; ext_lat[$A1]:='\''{\i}'; X char_set[$A2]:=$01; char_code[$A2]:=$3B; ext_lat[$A2]:='\''{o}'; X char_set[$A3]:=$01; char_code[$A3]:=$43; ext_lat[$A3]:='\''{u}'; X char_set[$A4]:=$01; char_code[$A4]:=$39; ext_lat[$A4]:='\~{n}'; X char_set[$A5]:=$01; char_code[$A5]:=$38; ext_lat[$A5]:='\~{N}'; X char_set[$A6]:=$04; char_code[$A6]:=$0F; ext_lat[$A6]:='\astrike '; X char_set[$A7]:=$04; char_code[$A7]:=$10; ext_lat[$A7]:='\ostrike '; X char_set[$A8]:=$04; char_code[$A8]:=$08; ext_lat[$A8]:='?`'; X char_set[$A9]:=$05; char_code[$A9]:=$10; ext_lat[$A9]:='~'; X char_set[$AA]:=$06; char_code[$AA]:=$14; ext_lat[$AA]:='~'; X char_set[$AB]:=$04; char_code[$AB]:=$11; ext_lat[$AB]:='$\frac{1}{2}$'; X char_set[$AC]:=$04; char_code[$AC]:=$12; ext_lat[$AC]:='$\frac{1}{4}$'; X char_set[$AD]:=$04; char_code[$AD]:=$07; ext_lat[$AD]:='!`'; X char_set[$AE]:=$04; char_code[$AE]:=$09; ext_lat[$AE]:='$\ll$'; X char_set[$AF]:=$04; char_code[$AF]:=$0A; ext_lat[$AF]:='$\gg$'; X char_set[$E0]:=$08; char_code[$E0]:=$01; ext_lat[$E0]:='$\alpha$'; X char_set[$E1]:=$01; char_code[$E1]:=$17; ext_lat[$E1]:='$\beta$'; X char_set[$E2]:=$08; char_code[$E2]:=$06; ext_lat[$E2]:='$\Gamma$'; X char_set[$E3]:=$08; char_code[$E3]:=$21; ext_lat[$E3]:='$\pi$'; X char_set[$E4]:=$08; char_code[$E4]:=$24; ext_lat[$E4]:='$\Sigma$'; X char_set[$E5]:=$08; char_code[$E5]:=$25; ext_lat[$E5]:='$\sigma$'; X char_set[$E6]:=$08; char_code[$E6]:=$19; ext_lat[$E6]:='$\mu$'; X char_set[$E7]:=$08; char_code[$E7]:=$29; ext_lat[$E7]:='$\tau$'; X char_set[$E8]:=$08; char_code[$E8]:=$2C; ext_lat[$E8]:='$\Phi$'; X char_set[$E9]:=$08; char_code[$E9]:=$10; ext_lat[$E9]:='$\theta$'; X char_set[$EA]:=$08; char_code[$EA]:=$32; ext_lat[$EA]:='$\Omega$'; X char_set[$EB]:=$08; char_code[$EB]:=$09; ext_lat[$EB]:='$\delta$'; X char_set[$EC]:=$06; char_code[$EC]:=$13; ext_lat[$EC]:='$\infty$'; X char_set[$ED]:=$08; char_code[$ED]:=$2D; ext_lat[$ED]:='$\emptyset$'; X char_set[$EE]:=$08; char_code[$EE]:=$0B; ext_lat[$EE]:='$\epsilon$'; X char_set[$EF]:=$06; char_code[$EF]:=$10; ext_lat[$EF]:='$\cap$'; X char_set[$F0]:=$06; char_code[$F0]:=$0E; ext_lat[$F0]:='$\equiv$'; X char_set[$F1]:=$06; char_code[$F1]:=$01; ext_lat[$F1]:='$\pm$'; X char_set[$F2]:=$06; char_code[$F2]:=$03; ext_lat[$F2]:='$\geq$'; X char_set[$F3]:=$06; char_code[$F3]:=$02; ext_lat[$F3]:='$\leq$'; X char_set[$F4]:=$07; char_code[$F4]:=$00; ext_lat[$F4]:='~'; X char_set[$F5]:=$07; char_code[$F5]:=$01; ext_lat[$F5]:='~'; X char_set[$F6]:=$06; char_code[$F6]:=$08; ext_lat[$F6]:='$\div$'; X char_set[$F7]:=$06; char_code[$F7]:=$0D; ext_lat[$F7]:='$\approx$'; X char_set[$F8]:=$06; char_code[$F8]:=$24; ext_lat[$F8]:='\degrees '; X char_set[$F9]:=$06; char_code[$F9]:=$1F; ext_lat[$F9]:='~'; X char_set[$FA]:=$06; char_code[$FA]:=$20; ext_lat[$FA]:='~'; X char_set[$FB]:=$07; char_code[$FB]:=$04; ext_lat[$FB]:='$\surd$'; X char_set[$FC]:=$04; char_code[$FC]:=$15; ext_lat[$FC]:='$^{n}$'; X char_set[$FD]:=$04; char_code[$FD]:=$14; ext_lat[$FD]:='$^{2}$'; X char_set[$FE]:=$04; char_code[$FE]:=$02; ext_lat[$FE]:='~'; XEnd; X X XProcedure Make_tabelentry_attr; XVar X b, X num_of_attr : Byte; X j : Integer; X XBegin X num_of_attr := openptr[depth]; X Write(tabel,num_of_attr); X X For j:=1 to num_of_attr X Do Write(tabel,attr_rij[depth,j]); X XEnd; X X X XProcedure Make_tabelentry_tabset; XVar X b : Byte; X j : Integer; X XBegin X b := ord('S'); X Write(tabel,b); X X b:=num_of_tabs; X Write(tabel,b); X X For j:=1 to num_of_tabs X Do Wr_word(tabel,tabpos[j]); XEnd; X X XProcedure Make_tabelentry_rightjustification; XVar X b : Byte; X XBegin X b := Ord('U'); X Write(tabel,b); X X If by=$81 X Then b:=01 { regels WEL uitvullen } X Else b:=00; { regels NIET uitvullen } X Write(tabel,b); XEnd; X X X X XProcedure Make_tabelentry_envir_extra_end; XVar X b : Byte; X XBegin X X Case envir of X 'C' : Begin X b:=ord('C'); X Write(tabel,b); X End; X X 'T' : Begin X b:=ord('T'); X Write(tabel,b); X End; X X 'I' : Begin X b:=ord('I'); X Write(tabel,b); X Wr_word(tabel,ind_leftmargin); X Wr_word(tabel,ind_rightmargin); X X If ind_text2 X Then Begin X b:=01; X Write(tabel,b) X End X Else Begin X b:=00; X Write(tabel,b) X End; X X End; X X End; {Case} X X b := Ord(line_term); X write(tabel,b); X X b:=$FF; X Write(tabel,b); X XEnd; X X XProcedure Reset_attr_rij(d : Integer); XVar X j : Integer; X XBegin X For j:=0 to 16 X Do attr_rij[d,j]:=$00; X leegptr[d]:=1; X openptr[d]:=0; XEnd; X X X XProcedure Open_all_attr; X{ -- Open alle commando's door de Attributen-rij af te lopen -- } X XVar j:Integer; XBegin X For j:=(openptr[depth]+1) to (leegptr[depth]-1) X Do Begin X Write(strip,Open_com[attr_rij[depth,j]]); X openptr[depth]:=openptr[depth]+1; X End; X X open_attr_rij[depth]:=False { Alle attributen staan weer goed } XEnd; X X X XProcedure Close_all_attr; X{ -- Sluit alle commando's door de Attributen-rij af te lopen -- } XVar j:Integer; XBegin X For j:=openptr[depth] Downto 1 X Do Begin X Write(strip,Close_com[attr_rij[depth,j]]); X openptr[depth]:=openptr[depth]-1; X End; X open_attr_rij[depth] := True; XEnd; X X X XProcedure Attr_ON; X{ Deze procedure plaatst een attribuut (lettertype) in de attribuut-rij } X XVar X b : Byte; X XBegin X Read(wpd,b); { lees attribuut-code } X X attr_rij[depth,leegptr[depth]]:=b; { attribuut in attr-rij } X leegptr[depth]:=leegptr[depth]+1; { plaats 1 verder. } X open_attr_rij[depth]:=True; { openstaande attr-rij } X X Read(wpd,b); { lees voorbij afsluitcode } XEnd; X X X XProcedure Attr_OFF; X{ Deze procedure haalt een uit een attribuut (lettertype) uit de } X{ attribuut-rij door middel van een stack principe omdat binnen } X{ LaTeX de later geopende kommando's eerst afgesloten te worden } X XVar X b : Byte; X found : Boolean; X j, X codeptr : Integer; X XBegin X Read(wpd,b); { lees attribuut-code } X X j:=leegptr[depth]; { zoek vanaf top attr-rij } X found:=False; { nog niet gevonden } X X While (j>1) and (Not found) { zoek attr-code in attr-rij } X Do Begin X j:=j-1; X found:=(attr_rij[depth,j]=b) X End; X X If j<=0 Then RunError($0100); { Moet nooit kunnen voorkomen } X codeptr:=j; { plaats van attr-code in rij } X X{ Sluit alle commando's t/m de desbetreffende code als deze nog niet } X{ gesloten zijn. } X X If codeptr<=openptr[depth] X Then Begin X For j:=openptr[depth] downto codeptr X Do Begin X Write(strip,Close_com[attr_rij[depth,j]]); X openptr[depth]:=openptr[depth]-1; X End; X End; X X{ Haal de desbetreffende attribuut uit de rij en werk pointers bij } X X For j:=codeptr to (leegptr[depth]-1) X Do attr_rij[depth,j]:=attr_rij[depth,j+1]; X leegptr[depth]:=leegptr[depth]-1; X X open_attr_rij[depth]:=True; { openstaande attr-rij } X X Read(wpd,b); { lees voorbij afsluitcode } XEnd; X X X XProcedure Center; X{ Deze procedure zorgt voor center environment zolang er nog geen } X{ andere environment is begonnen. } X XBegin X If envir=' ' X Then envir:='C'; { environment = center } X X Jump_in_file(wpd,7); { rest van code overslaan } XEnd; X X X XProcedure End_Align; XBegin X If align_tab X Then Begin X Close_all_attr; X Write(strip,'\'''); X align_tab := False; X Open_all_attr; X End; X X If right_tab X Then Begin X Close_all_attr; X Write(strip,'\'''); X right_tab := False; X Open_all_attr; X End; X X If center_tab X Then Begin X Close_all_attr; X Write(strip,'}'); X center_tab := False; X Open_all_attr; X End; XEnd; X X X XProcedure Tab; XVar X j : integer; X wpu : word; X tabnum, X new_tabs : Integer; X XBegin X If (envir<>'I') and Not Nomore_valid_tabs { Noggeen indent --> normaal tab } X Then Begin X If by=$48 X Then right_tab := True; X X If by=$40 X Then align_tab := True; X X If by=$C8 X Then center_tab := True; X X Jump_in_file(wpd,2); X X Rd_word(wpd,wpu); { Lees abs.-indent [wpu] } X wpu := wpu - WP_sidemargin; { Correctie ivm WP kantlijn } X X tabnum:=0; X For j:=1 to num_of_tabs { Bepaal welke tabpos } X Do If wpu>=tabpos[j] X Then tabnum:=j; X X new_tabs := tabnum - latex_tabpos; X X If new_tabs>0 X Then Begin X Close_all_attr; X X For j:=1 to new_tabs X Do Write(strip,'\>'); X X If center_tab X Then Write(strip,'\ctab{'); X X Open_all_attr; X End; X X latex_tabpos:=tabnum; X X Jump_in_file(wpd,3); X X envir:='T'; { Er zit een tab in deze regel } X End X X Else Jump_in_file(wpd,7); X XEnd; X X X XProcedure Flush_right_tab; XBegin X If envir<>'I' X Then Begin X Close_all_attr; X Write(strip,'\`'); X Open_all_attr; X X Nomore_valid_tabs := True; X X envir:='T'; X End; X X Jump_in_file(wpd,7); XEnd; X X X XProcedure Indent; XVar X dif, X abs : Word; X b : Byte; X XBegin X If envir<>'T' X Then Begin {Al een tabcommando gezet dus er mag geen insp } X Envir:='I'; X indenting:=True; X X If Not ind_text2 X Then Begin X Read(wpd,b); X b:=b And $01; X X Rd_word(wpd,dif); X Rd_word(wpd,abs); { Eigenlijk Old current column } X Rd_word(wpd,abs); X X ind_leftmargin:=abs-WP_sidemargin; X X If b=1 X Then ind_rightmargin:=ind_rightmargin+dif; X {Margins bepaald lees voorby rest van functie-codes } X Jump_in_file(wpd,3); X X If Not ind_text1 X Then Begin X If char_on_line X Then Begin X Write(strip,'}'); X ind_text1:=True; X End; X End; X End X Else Jump_in_file(wpd,10); X End X Else Jump_in_file(wpd,10); XEnd; X X XProcedure End_of_indent; XBegin X indent_end := True; X Jump_in_file(wpd,5); XEnd; X X X XProcedure Tabset; XVar X j : Integer; X w : Word; X b : Byte; X XBegin X Jump_in_file(wpd,102); { Ga naar TAB-info } X X num_of_tabs:=0; X X For j:=1 to 40 X Do Begin X Rd_word(wpd,w); X If (w>WP_sidemargin) and (w<>$FFFF) X Then Begin X num_of_tabs:=num_of_tabs+1; X tabpos[num_of_tabs] := w - WP_sidemargin; X End; X End; X X Jump_in_file(wpd,24); X X Make_tabelentry_tabset; XEnd; X X X XProcedure Page_number_position; XVar X position_code : Byte; X XBegin X Jump_in_file(wpd,5); {Skip length of code; always 10} X { + old information } X Read(wpd,position_code); X X Write(strip,'\pagenumpos'); X Case position_code of X $01 : Write(strip,'{\pntl}'); X $02 : Write(strip,'{\pntc}'); X $03 : Write(strip,'{\pntr}'); X $05 : Write(strip,'{\pnbl}'); X $06 : Write(strip,'{\pnbc}'); X $07 : Write(strip,'{\pnbr}'); X Else Write(strip,'{\pnno}'); X End; X X Jump_in_file(wpd,6); XEnd; X X X XProcedure Character; XVar X ch : String; X X j : Integer; X chr_code, X chr_set, X b : Byte; X found : Boolean; X X XBegin X If open_attr_rij[depth] X Then Open_all_attr; X X Case by of X $20..$7F : { Normal_char } X Begin X ch := lat[by]; X End; X X $A9 : { Special_char } X Begin X If by=$A9 X Then ch:='-' X Else ch:='\ '; X End; X X $C0 : { Extended_char } X Begin X j:=127; X found:=false; X X Read(wpd,chr_code); X Read(wpd,chr_set); X X While (j<254) and not found X Do Begin X j:=j+1; X If (chr_code=char_code[j]) and (chr_set=char_set[j]) X Then found:=True; X End; X X If found X Then ch:=ext_lat[j] X Else ch:='\ '; X X Read(wpd,b); X End; X X End; X X Write(strip,ch); X XEnd; X X X XProcedure Return_Page; XVar X j :Integer; X ond : Boolean; X XBegin X X Case by of X $0A,$8C : line_term := 'R'; { Hard return } X $0D : line_term := 'r'; { Soft return } X $0C : line_term := 'P'; { Hard page } X $0B : line_term := 'p'; { Soft page } X End; X X Writeln(strip); X X Make_Tabelentry_envir_extra_end; X X If indent_end X Then Begin X envir:=' '; X indenting:=False; X ind_text1:=False; X ind_text2:=False; X ind_leftmargin:=0; X ind_rightmargin:=0; X X indent_end:=False; X End X X Else If envir<>'I' X Then envir:=' '; X X char_on_line:=False; X nomore_valid_tabs := False; X X regelnum:=regelnum+1; X X Make_tabelentry_attr; X X latex_tabpos:=0; XEnd; X X XProcedure Nop80; XBegin X { Om dat het een 1-byte funktie is hoeft er niks overgeslagen } X { te worden. } XEnd; X X X XProcedure NopC0; XBegin X If by=$C0 Then Jump_in_file(wpd,3); X If by=$C1 Then Jump_in_file(wpd,8); X If by=$C2 Then Jump_in_file(wpd,10); X If by=$C3 Then Jump_in_file(wpd,2); X If by=$C4 Then Jump_in_file(wpd,2); X If by=$C5 Then Jump_in_file(wpd,4); X If by=$C6 Then Jump_in_file(wpd,5); X If by=$C7 Then Jump_in_file(wpd,6); XEnd; X X X XProcedure NopD0(already_read_subfunc_code : Boolean); XVar X b : Byte; X w : Word; X XBegin X If Not already_read_subfunc_code X Then Read(wpd,b); { Lees subfunctioncode } X X Rd_word(wpd,w); { Lees lengte 'die nog volgt ' } X Seek(wpd,filepos(wpd)+w); XEnd; X X X XProcedure Overstrike; X XVar X first_char_os : Boolean; X X char_width_os, X len_of_code : Word; X end_of_code : LongInt; X XBegin X Rd_word(wpd,len_of_code); { Lees lengte } X end_of_code := filepos(wpd) + len_of_code - 4; X X Rd_word(wpd,char_width_os); X X first_char_os := True; X X While FilePos(wpd) < end_of_code X Do Begin X Read(wpd,by); X X Case by of X $20..$7F, X $A9,$C0 : If first_char_os X Then Begin X Character; X first_char_os := False; X End X Else Begin X Write(strip,'\llap{'); X Character; X Write(strip,'}'); X End; X X $00..$BF : Nop80; X $C0..$CF : NopC0; X $D0..$FE : NopD0(False); X End; X X End; X X Jump_in_file(wpd,4); X XEnd; X X X XProcedure Footnote; XVar X flags, X num_of_pages : Byte; X X fn_num, X len_of_code : Word; X end_of_code : LongInt; X XBegin X Rd_word(wpd,len_of_code); { Lees lengte } X end_of_code := filepos(wpd) + len_of_code - 4; X X Read(wpd,flags); X X Rd_word(wpd,fn_num); X X{ Skip all the shit } X X Read(wpd,num_of_pages); X Jump_in_file(wpd,2*(num_of_pages+1)+9); X X Close_all_attr; X X depth := 1; X Reset_attr_rij(depth); X X Write(strip,'\footnote[',fn_num:1,']{'); X X While FilePos(wpd) < end_of_code X Do Begin X Read(wpd,by); X X Case by of X $20..$7F, X $A9,$C0 : Character; X X $0A,$0C : Write(strip,'\\ '); X X $0B,$0D : Write(strip,' '); X X $C3 : Attr_ON; X X $C4 : Attr_OFF; X X $00..$BF : Nop80; X $C0..$CF : NopC0; X $D0..$FE : NopD0(False); X End; X X End; X X Close_all_attr; { Echt nodig ? } X Write(strip,'}'); X X Jump_in_file(wpd,4); X X depth := 0; X Open_all_attr; X XEnd; X X X XProcedure Header_Footer; XVar X subfunc, X occurance : Byte; X len_of_code : Word; X end_of_code : LongInt; X X hf_left, X hf_center, X hf_right : Boolean; X X j : Integer; X XBegin X Read(wpd,subfunc); X Rd_word(wpd,len_of_code); X X If len_of_code > 22 X Then Begin X end_of_code := FilePos(wpd) + len_of_code - 4; X X Jump_in_file(wpd,7); X X Read(wpd,occurance); X X Jump_in_file(wpd,10); X X Close_all_attr; X depth := 1; X X{ Geen schone attr._lei; Kopieer attributen uit Niveau 0; Fout in WP 5.0 ? } X X For j:=0 to 15 X Do attr_rij[1,j] := attr_rij[0,j]; X X leegptr[1]:=leegptr[0]; X openptr[1]:=openptr[0]; X X Case subfunc of X 00,01 : Write(strip,'\headtext'); X 02,03 : Write(strip,'\foottext'); X End; X X Case occurance of X 00 : Write(strip,'{\neverpages}{'); X 01 : Write(strip,'{\allpages}{'); X 02 : Write(strip,'{\oddpages}{'); X 03 : Write(strip,'{\evenpages}{'); X End; X X Open_all_attr; X hf_left := True; { Beginnen met de linkerkant } X hf_center := False; X hf_right := False; X X While FilePos(wpd) < end_of_code X Do Begin X Read(wpd,by); X X Case by of X $20..$7F, X $A9,$C0 : Character; X X X $C1 : Begin X Read(wpd,by); X by := by and $E0; X Jump_in_file(wpd,7); X X If by=$E0 X Then Begin X If hf_left X Then Begin X Close_all_attr; X Write(strip,'}{'); X Open_all_attr; X X hf_left := False; X hf_center := True; X End; X End; X X If by=$60 X Then Begin X If hf_left X Then Begin X Close_all_attr; X Write(strip,'}{}{'); X Open_all_attr; X X hf_left := False; X hf_right := True; X End; X X If hf_center X Then Begin X Close_all_attr; X Write(strip,'}{'); X Open_all_attr; X X hf_center := False; X hf_right := True; X End; X End; X End; X X $C3 : Attr_ON; X X $C4 : Attr_OFF; X X $00..$BF : Nop80; X $C0..$CF : NopC0; X $D0..$FE : NopD0(False); X X End; X End; X X Close_all_attr; { Echt nodig ? } X X Jump_in_file(wpd,4); X X If hf_left Then Write(strip,'}{}{}'); X If hf_center Then Write(strip,'}{}'); X If hf_right Then Write(strip,'}'); X X depth := 0; X Open_all_attr; X X End X X Else Jump_in_file(wpd,len_of_code); X XEnd; X X XBegin X Table_Init; X Ext_chr_init; X X Reset_attr_rij(0); X Reset_attr_rij(1); X depth := 0; X X WP_default; X X latex_tabpos:=0; X right_tab := False; X align_tab := False; X center_tab := False; X X indenting:=False; X indent_end:=False; X ind_text1:=False; X ind_text2:=False; X ind_leftmargin:=0; X ind_rightmargin:=0; X X envir:=' '; X X nomore_valid_tabs := False; X X Writeln('First strike :'); X Write('Converting-percentage : '); X X srtdocpos:=filepos(wpd); X fsize:=FileSize(wpd); X X regelnum := 0; X X Make_tabelentry_attr; { attribuut instelling } X X Make_tabelentry_tabset; { Geef de defaulttabinstelling door } X { aan de 2e slag } X X X X While (FilePos(wpd)$FF X Do Begin X Read(tabel,b); X X Case chr(b) Of X 'C' : envir[n]:='C'; X 'T' : envir[n]:='T'; X 'I' : Begin X envir[n]:='I'; X Rd_word(tabel,ind_leftmargin[n]); X Rd_word(tabel,ind_rightmargin[n]); X Read(tabel,ind_label[n]); X End; X X 'S' : Begin X new_tabset[n]:=True; X Read(tabel,b); X tabent_num_of_tabs[n]:=b; X X For j:=1 to tabent_num_of_tabs[n] X Do Begin X Rd_word(tabel,w); X tabent_tabpos[n,j]:=w; X End; X End; X X 'U' : Begin X new_tabent_rightjust[n]:=True; X Read(tabel,b); X If b=0 X Then tabent_rightjust[n]:=False X Else tabent_rightjust[n]:=True; X End; X X 'R','r','P','p' : line_term[n]:=chr(b); X X End {Case}; X End; X End X X{ Er is geen volgende tabelentry dus ook geen volgende regel } X{ De tabelentry is 'schoon'. } X{ Zodat het document 'schoon' wordt afgesloten. } X XEnd; X X X XProcedure Open_all_attr_BOL; X{ -- Open alle commando's door de Attributen-rij af te lopen -- } XVar X j:Integer; XBegin X For j:=$01 to num_of_attr[cur] X Do Write(latex,Open_com[attr_BOL[cur,j]]); X X attr_closed := False; XEnd; X X XProcedure Close_all_attr_BOL; X{ -- Sluit alle commando's door de Attributen-rij af te lopen -- } XVar X j:Integer; XBegin X For j:=num_of_attr[cur] Downto $01 X Do Write(latex,Close_com[Attr_BOL[cur,j]]); X X attr_closed := True; XEnd; X X X XProcedure Open_all_attr_EOL; X{ -- Open alle commando's door de Attributen-rij af te lopen -- } XVar j:Integer; XBegin X For j:=$01 to num_of_attr[next] X Do Write(latex,Open_com[Attr_BOL[next,j]]); X X attr_closed := False; XEnd; X X X XProcedure Close_all_attr_EOL; X{ -- Sluit alle commando's door de Attributen-rij af te lopen -- } XVar j:Integer; XBegin X For j:=num_of_attr[next] Downto $01 X Do Write(latex,Close_com[Attr_BOL[next,j]]); X X attr_closed := True; XEnd; X X X XProcedure Latex_head; X{ -- Maak het de standard-heading voor een latex-file aan -- } XBegin X Writeln(latex,'\documentstyle[11pt,wp2latex]{report}'); X Writeln(latex,'\begin{document}') XEnd; X X X XProcedure Latex_foot; X{ -- Sluit de latex-file op de juiste wijze af -- } XBegin X Writeln(latex,'\end{document}') XEnd; X X X XProcedure Latex_tabset; XVar X atpr,j : Integer; X l,ol : Real; X XBegin X atpr:=0; { Huiding aantal tabs per regel } X ol:=0; X For j:=1 to num_of_tabs X Do Begin X l:=tabpos[j]/1200 * 2.54; X Write(latex,'\hspace{', l-ol :3:2,'cm}\='); X atpr:=atpr+1; X If atpr>=4 X Then Begin X Writeln(latex,'%'); X atpr:=0; X End; X ol:=l; X End; X Writeln(latex,'\kill'); XEnd; X X X XFunction Change_envir_BOL : Boolean; XVar X hulp : Boolean; X XBegin X hulp := False; X X hulp := ((envir[cur]='C') And Not (envir[pre]='C')) Or hulp; X hulp := ((envir[cur]='T') And Not (envir[pre]='T')) Or hulp; X hulp := ((envir[cur]='I') And Not (envir[pre]='I')) Or hulp; X X change_envir_BOL := hulp; XEnd; X X X XFunction Change_envir_EOL : Boolean; XVar X hulp : Boolean; X XBegin X hulp := False; X X hulp := ((envir[next]='C') Xor (envir[cur]='C')) Or hulp; X hulp := ((envir[next]='T') Xor (envir[cur]='T')) Or hulp; X hulp := ((envir[next]='I') Xor (envir[cur]='I')) Or hulp; X X change_envir_EOL := hulp; XEnd; X X X X XProcedure Open_environment; X XBegin X If change_envir_BOL { andere environment ? } X Then Begin X If Not attr_closed X Then Close_all_attr_BOL; X X Case envir[cur] of X 'C' : Begin X Writeln(latex,'\begin{center}'); X End; X X 'T' : Begin X Writeln(latex,'\begin{tabbing}'); X Latex_tabset; X End; X X 'I' : Begin X Write(latex,'\begin{indenting}'); X Write(latex,'{',ind_leftmargin[cur]/1200*2.54:3:2,'cm}'); X Write(latex,'{',ind_rightmargin[cur]/1200*2.54:3:2,'cm}'); X If ind_label[cur]=1 X Then Begin X Writeln(latex,'%'); X Write(latex,'{'); X End X Else Writeln(latex,'{}'); X End X End; X X End X X Else If new_tabset[cur] and (envir[cur]='T') X Then Latex_tabset; X XEnd; X X X XProcedure Close_environment; X XBegin X X Case envir[cur] of X 'C' : Begin X Writeln(latex,'\end{center}'); X End; X X 'T' : Begin X Writeln(latex,'\end{tabbing}'); X End; X X 'I' : Begin X Writeln(latex,'\end{indenting}'); X End; X End; X X just_envir_closed := True; X XEnd; X X X XProcedure Update_global_information; XVar X j : Integer; X XBegin X If new_tabset[cur] X Then Begin X num_of_tabs:=tabent_num_of_tabs[cur]; X For j:=1 to num_of_tabs X Do tabpos[j]:=tabent_tabpos[cur,j] X End; X X If new_tabent_rightjust[cur] X Then new_rightjust := tabent_rightjust[cur]; X XEnd; X X XProcedure Change_tabelentry; XVar X help : Integer; X XBegin X help:=pre; X pre:=cur; X cur:=next; X next:=help; X Read_tabelentry(next); XEnd; X X XBegin X pre:=0; X cur:=1; X next:=2; X X envir[pre]:=' '; X new_tabset[pre]:=False; X X just_envir_closed:=True; X attr_closed := False; X X rightjust:=True; X new_rightjust:=True; X For i:=0 to 2 X Do Begin X new_tabent_rightjust[i]:=False; X tabent_rightjust[i]:=False; X End; X X Read_tabelentry(cur); X Read_tabelentry(next); X X regelnum:=1; X X Writeln; X Writeln('Second strike :'); X Write('Converting-percentage : '); X X X X Latex_head; X X While (Not Eof(strip)) and (not keypressed) X Do Begin X Update_global_information; X X convperc := round(100*regelnum/num_of_lines_stripfile); X if convperc>100 then convperc:=100; X Write(chr(8),chr(8),chr(8),chr(8),convperc:3,'%'); X X Readln(strip,regel); X X{ Werk eventueel de regel bij d.m.v. een hulp regel. } X X hulp_regel := regel; X len_reg := length(hulp_regel); X X{ Meerdere spaties achter elkaar vervangen door harde spaties. } X X For i:=1 to len_reg-1 X Do If (regel[i]=' ') and (regel[i+1]=' ') X Then hulp_regel[i+1]:='~'; X X{ Zoek naar een illegaal argument en zet hier accolades voor. } X X If ((len_reg>=1) and (hulp_regel[1]='[')) or X ((len_reg>=2) and (hulp_regel[1]=' ') and (hulp_regel[2]='[')) X Then hulp_regel:='{}' + hulp_regel; X X{ De regel is verwerkt. } X X regel := hulp_regel; X len_reg := length(regel); X X If new_rightjust xor rightjust X Then Begin X rightjust := new_rightjust; X If rightjust X Then Writeln(latex,'\justified') X Else Writeln(latex,'\raggedright'); X End; X X Open_environment; X X If len_reg>0 X Then Begin X If attr_closed X Then Open_all_attr_BOL; X X Write(latex,regel); X X just_envir_closed := False; X End; X X Case line_term[cur] of X X 'r','p' : Begin X Writeln(latex); X If Change_envir_EOL X Then Begin X If Not attr_closed X Then Close_all_attr_EOL; X X Close_environment; X End; X End; X X 'R' : Begin X X If envir[cur]='I' X Then Begin X If Not attr_closed X Then Close_all_attr_EOL; X X Writeln(latex); X Close_environment; X envir[cur]:=' '; X End X X Else Begin X underline:=False; X For i:=$01 to $10 X Do underline := underline X Or (Attr_Bol[next,i]=$B) X Or (Attr_bol[next,i]=$E); X X If underline and Not attr_closed X Then Close_all_attr_EOL; X X { Elke Indent-environment moet na een harde Return} X { Afgesloten worden.} X X X If Change_envir_EOL X Then Begin X If just_envir_closed X Then Writeln(latex,'\nwln') X Else Writeln(latex); X X If Not attr_closed X Then Close_all_attr_EOL; X X Close_environment; X End X Else Begin X If just_envir_closed X Then Writeln(latex,'\nwln') X Else Writeln(latex,'\\'); X End; X End; X End; X X 'P' : Begin X If Not attr_closed X Then Close_all_attr_EOL; X X Writeln(latex); X Close_environment; X Writeln(latex,'\newpage'); X envir[cur]:=' '; X End; X X End {Case}; X X X X Change_tabelentry; X X regelnum:=regelnum+1; X End; X X Latex_foot; X Writeln; XEnd; X X X{---HOOFDPROG---} X X XBegin X Exitsave:=Exitproc; { Bewaar de orginele exit-pointer } X Exitproc:=@Einde_prog; { Spring bij Exit naar Proc. Einde_prog } X X Init_commando; X X ClrScr; X Writeln; X Writeln(' Conversionprogram : From Wordperfect 5.0 to LaTeX (WP2latEX)'); X Writeln; X Writeln(' (c) TUE-Eindhoven ---- Made by R.C.Houtepen ---- Date : 24 Jan 1990'); X X Filenames; X X Reset(wpd); X Wpd_check; X X Rewrite(strip); X Rewrite(tabel); X X Writeln('Converting ...'); X Writeln; X X Convert_first_strike; X X Close(wpd); X Close(strip); X Close(tabel); X X Reset(strip); X Reset(tabel); X Rewrite(latex); X X Convert_second_strike; X X Close(strip); X Close(tabel); X Close(latex); X X Erase(strip); X Erase(tabel); X XEnd. SHAR_EOF if test 49507 -ne "`wc -c < 'wp2latex.pas'`" then echo shar: "error transmitting 'wp2latex.pas'" '(should have been 49507 characters)' fi fi exit 0 # End of shell archive -- Glenn Geers | "So when it's over, we're back to people. Department of Theoretical Physics | Just to prove that human touch can have The University of Sydney | no equal." Sydney NSW 2006 Australia | - Basia Trzetrzelewska, 'Prime Time TV'