summaryrefslogtreecommitdiff
path: root/systems/msdos/jemtex2/jem2tex.pas
diff options
context:
space:
mode:
Diffstat (limited to 'systems/msdos/jemtex2/jem2tex.pas')
-rw-r--r--systems/msdos/jemtex2/jem2tex.pas1209
1 files changed, 1209 insertions, 0 deletions
diff --git a/systems/msdos/jemtex2/jem2tex.pas b/systems/msdos/jemtex2/jem2tex.pas
new file mode 100644
index 0000000000..78d84ba295
--- /dev/null
+++ b/systems/msdos/jemtex2/jem2tex.pas
@@ -0,0 +1,1209 @@
+{$A-,B-,D-,E-,F-,I+,L-,N-,O-,R-,S-,V-}
+{Compile with Turbo-Pascal 5.0}
+Program Jem2TeX(Input,Output);
+{
+ This program translates a .JEM file into a .TeX file
+
+ Author: Francois Jalbert
+ '
+ Date: November 1990
+
+ Version: 1.0
+
+ Date: January 1991
+
+ Version: 1.01
+
+ Modifications: - Added \hskip0pt plus0.1em between all Japanese symbols which
+ improved dramatically line breaks and inter-sentence spacing
+ since [La]TeX could only add glue between whole Japanese
+ sentences.
+ - Extra space after punctuation is now an option since it is
+ not desirable with MuTeX when the text is to go under the
+ staff.
+ - Font names now use only small letters to be compatible with
+ the fontlib program supplied with emTeX.
+ - Command line parameters now supported.
+ - Run-time parameters now supported.
+ - Updated and improved run-time messages.
+
+ Date: April 1991
+
+ Version: 2.00
+
+ Modifications: - Added four kanjis.
+ - If desired, only standard JIS '83 characters are allowed.
+ - If desired, a % is added at each Japanese end of line.
+ - Three file name extensions .JEM .JPN .JAP now supported.
+ - Default extension is .JEM and the program has been renamed.
+ - Three run-time parameter flags now supported.
+ - Japanese comments not translated anymore for reference.
+ - Hyphenation and glue handled separately for better control.
+ - More clever algorithm for Japanese hyphenation.
+ - Space after some punctuation now obtained with \eeee.
+ - Small space around some punctuation introduced with \eee.
+ - Tiny space between Japanese characters with \ee.
+ - Space between Japanese and Roman with \eeee and \eee.
+ - Symbols separated only by [La]TeX comments are now
+ recognized as consecutive.
+ - MS-kanji (Shift-JIS) now supported.
+
+ Error Levels: 0 - Normal termination.
+ 1 - Error.
+}
+Const
+ {Highest Bitmap number in JIS24}
+ BitmapMax=7806;
+ {Highest font number}
+ FontMax=60; {Floor of 7806 Div 128}
+ {Highest size number}
+ SizeMax=7; {magsteps are 0, 0.5, 1, 2, 3, 4, 5}
+ {File name extensions in priority order}
+ Extension1:String[4]='.jem';
+ Extension2:String[4]='.jpn';
+ Extension3:String[4]='.jap';
+ {Run-time flag of all the same length}
+ RunFlag1:String[7]='JEM2TEX';
+ RunFlag2:String[7]='JPN2TEX';
+ RunFlag3:String[7]='JAP2TEX';
+ {Parameter flag}
+ Flag1='/'; {DOS style}
+ Flag2='-'; {UNIX style}
+ {Parameter keywords in approximate decreasing length order}
+ Space1:String[10]='EXTRASPACE';
+ Space2:String[5]='EXTRA';
+ Space3:String[5]='SPACE';
+ NoSpace1:String[12]='NOEXTRASPACE';
+ NoSpace2:String[7]='NOEXTRA';
+ NoSpace3:String[7]='NOSPACE';
+ Percent1:String[7]='COMMENT';
+ Percent2:String[7]='PERCENT';
+ Percent3:String[3]='EOL';
+ NoPercent1:String[9]='NOCOMMENT';
+ NoPercent2:String[9]='NOPERCENT';
+ NoPercent3:String[5]='NOEOL';
+ EUC1:String[3]='EUC';
+ NoEUC1:String[7]='MSKANJI';
+ NoEUC2:String[8]='SHIFTJIS';
+ Extended1:String[8]='EXTENDED';
+ Standard1:String[8]='STANDARD';
+ LaTeX1:String[5]='LATEX';
+ TeX1:String[5]='MUTEX';
+ TeX2:String[3]='TEX';
+ One1:String[4]='1000';
+ Two1:String[4]='1095';
+ Three1:String[4]='1200';
+ Four1:String[4]='1440';
+ Five1:String[4]='1728';
+ Six1:String[4]='2074';
+ Seven1:String[4]='2488';
+ One2:String[3]='0.0';
+ Two2:String[3]='0.5';
+ Three2:String[3]='1.0';
+ Four2:String[3]='2.0';
+ Five2:String[3]='3.0';
+ Six2:String[3]='4.0';
+ Seven2:String[3]='5.0';
+ One3:String[1]='0';
+ Three3:String[1]='1';
+ Four3:String[1]='2';
+ Five3:String[1]='3';
+ Six3:String[1]='4';
+ Seven3:String[1]='5';
+
+Type
+ InFileType=File Of Byte;
+ OutFileType=Text;
+ BitmapRange=1..BitmapMax;
+ FontRange=0..FontMax;
+ FontType=Array [FontRange] Of Boolean;
+ SizeRange=1..SizeMax;
+ FontsType=Array [SizeRange] Of FontType;
+ {Run time parameters}
+ RunTimeType=Record
+ FileName,Extension:String;
+ ExtraSpace,Percent,LaTeX,EUC,Extended:Boolean;
+ Size:SizeRange;
+ End;
+ {Japanese punctuation information}
+ PunctuationType=Record
+ {Indicates .,!? present}
+ OldMajorEOL,NewMajorEOL:Boolean;
+ {Indicates :; present}
+ OldMinorEOL,NewMinorEOL:Boolean;
+ {Indicates `"([< and other openings present}
+ OldOpening,NewOpening:Boolean;
+ {Indicates '")]> and other closings present}
+ OldClosing,NewClosing:Boolean;
+ {Indicates Japanese center dot present}
+ OldCenterDot,NewCenterDot:Boolean;
+ {Indicates Hiragana, Katakana, or Kanji present}
+ OldJapanese,NewJapanese:Boolean
+ End;
+ {Scanning Information}
+ ScanningType=Record
+ {Current pass terminated}
+ Done:Boolean;
+ {Indicates the current pass must produce output}
+ Echo:Boolean;
+ {Indicates the current line is a comment}
+ Comment:Boolean;
+ {Indicates current Bitmap immediately followed previous one}
+ Immediate:Boolean;
+ {Indicates the last Roman character was a letter or digit}
+ WasLetter:Boolean;
+ {Used for glue after a bitmap and before a roman}
+ RomanMajorEOL,RomanMinorEOL,RomanOpening:Boolean;
+ {Non-comment Bitmap found}
+ Found:Boolean;
+ {Processing the first character on the line which could be %}
+ First:Boolean;
+ {Comment line which may contain Bitmaps}
+ CommentLine:String;
+ {Current JIS24 Bitmap number}
+ Bitmap:BitmapRange;
+ {Roman or first part of Bitmap read}
+ Data1:Byte
+ End;
+
+Var
+ {Input and Output file names}
+ InFile:InFileType;
+ OutFile:OutFileType;
+ {Run time parameters}
+ RunTime:RunTimeType;
+ {JemTeX fonts used}
+ Fonts:FontsType;
+
+{------------------------------ EchoParameters -------------------------------}
+
+Procedure EchoParameters(Var EchoFile:Text; Var RunTime:RunTimeType);
+{Echoes the current parameters in EchoFile}
+Begin
+With RunTime Do
+ Begin
+ Write(EchoFile,'File='+FileName);
+ If ExtraSpace Then Write(EchoFile,' Space')
+ Else Write(EchoFile,' No Space');
+ If Percent Then Write(EchoFile,' Added %')
+ Else Write(EchoFile,' No Added %');
+ If LaTeX Then Write(EchoFile,' LaTeX')
+ Else Write(EchoFile,' TeX');
+ If EUC Then Write(EchoFile,' EUC')
+ Else Write(EchoFile,' MS-kanji');
+ If Extended Then Write(EchoFile,' Extended')
+ Else Write(EchoFile,' Standard');
+ Write(EchoFile,' Font Size=');
+ Case Size Of
+ 1:Write(EchoFile,'1000');
+ 2:Write(EchoFile,'1095');
+ 3:Write(EchoFile,'1200');
+ 4:Write(EchoFile,'1440');
+ 5:Write(EchoFile,'1728');
+ 6:Write(EchoFile,'2074');
+ 7:Write(EchoFile,'2488')
+ End;
+ Writeln(EchoFile,'.')
+ End
+End;
+
+{------------------------------- GetParameters -------------------------------}
+
+Procedure SimpleQuery(Title,ChoiceA,ChoiceB:String; Var Answer:Boolean);
+Var
+ JChar:Char;
+ Valid:Boolean;
+Begin
+Repeat
+ Valid:=True;
+ Writeln(Title+':');
+ Writeln(' a) '+ChoiceA);
+ Writeln(' b) '+ChoiceB);
+ Write('Your choice? ');
+ Readln(JChar);
+ JChar:=UpCase(JChar);
+ If JChar='A' Then Answer:=True
+ Else
+ If JChar='B' Then Answer:=False
+ Else
+ Begin Valid:=False; Write(Chr(7)) End
+Until Valid;
+Writeln
+End;
+
+Procedure SizeQuery(Var Size:SizeRange);
+Var
+ JChar:Char;
+ Valid:Boolean;
+Begin
+Repeat
+ Valid:=True;
+ Writeln('Japanese Font Size:');
+ Writeln(' a) 1000 magstep(0.0)');
+ Writeln(' b) 1095 magstep(0.5)');
+ Writeln(' c) 1200 magstep(1.0)');
+ Writeln(' d) 1440 magstep(2.0)');
+ Writeln(' e) 1728 magstep(3.0)');
+ Writeln(' f) 2074 magstep(4.5)');
+ Writeln(' g) 2488 magstep(5.0)');
+ Write('Your choice? ');
+ Readln(JChar);
+ JChar:=UpCase(JChar);
+ If ('A'<=JChar) And (JChar<='G') Then
+ Size:=Ord(JChar)-Ord('A')+1
+ Else
+ Begin Valid:=False; Write(Chr(7)) End
+Until Valid;
+Writeln
+End;
+
+Procedure Manual(Var RunTime:RunTimeType);
+{Get parameters from user}
+Begin
+With RunTime Do
+ Begin
+ Write('Japanese file name? ');
+ Readln(FileName);
+ Writeln;
+ SimpleQuery('Space around Japanese punctuation','Space','No space',ExtraSpace);
+ SimpleQuery('Added % at Japanese end of lines','Added %','No added %',Percent);
+ SimpleQuery('LaTeX or TeX (MuTeX) output','LaTeX','TeX',LaTeX);
+ SimpleQuery('EUC or MS-kanji (Shift-JIS) encoding','EUC','MS-kanji',EUC);
+SimpleQuery('Extended JIS ''83 Bitmaps allowed','Extended','Standard',Extended);
+ SizeQuery(Size)
+ End
+End;
+
+Procedure Automate(Var RunTime:RunTimeType);
+{Get parameters from command line}
+Var
+ ParamIndex,Index:Integer;
+ Param:String;
+Begin
+With RunTime Do
+ Begin
+ {Defaults}
+ FileName:='japanese';
+ ExtraSpace:=True;
+ Percent:=True;
+ LaTeX:=True;
+ EUC:=True;
+ Extended:=True;
+ Size:=4;
+ {Scan command line parameters}
+ For ParamIndex:=1 To ParamCount Do
+ Begin
+ Param:=ParamStr(ParamIndex);
+ If (Param[1]=Flag1) Or (Param[1]=Flag2) Then
+ {Not a filename}
+ Begin
+ {Delete 1 char at the 1st position}
+ Delete(Param,1,1);
+ {Convert to upper case}
+ For Index:=1 To Length(Param) Do Param[Index]:=UpCase(Param[Index]);
+ {Scan known keywords}
+ If (Param=Space1) Or (Param=Space2) Or (Param=Space3)Then ExtraSpace:=True
+ Else
+ If (Param=NoSpace1) Or (Param=NoSpace2) Or (Param=NoSpace3) Then
+ ExtraSpace:=False
+ Else
+ If (Param=Percent1) Or (Param=Percent2) Or (Param=Percent3) Then
+ Percent:=True
+ Else
+ If (Param=NoPercent1) Or (Param=NoPercent2) Or (Param=NoPercent3) Then
+ Percent:=False
+ Else
+ If Param=EUC1 Then EUC:=True
+ Else
+ If (Param=NoEUC1) Or (Param=NoEUC2) Then EUC:=False
+ Else
+ If Param=Extended1 Then Extended:=True
+ Else
+ If Param=Standard1 Then Extended:=False
+ Else
+ If Param=LaTeX1 Then LaTeX:=True
+ Else
+ If (Param=TeX1) Or (Param=TeX2) Then LaTeX:=False
+ Else
+ If (Param=One1) Or (Param=One2) Or (Param=One3) Then Size:=1
+ Else
+ If (Param=Two1) Or (Param=Two2) Then Size:=2
+ Else
+ If (Param=Three1) Or (Param=Three2) Or (Param=Three3) Then Size:=3
+ Else
+ If (Param=Four1) Or (Param=Four2) Or (Param=Four3) Then Size:=4
+ Else
+ If (Param=Five1) Or (Param=Five2) Or (Param=Five3) Then Size:=5
+ Else
+ If (Param=Six1) Or (Param=Six2) Or (Param=Six3) Then Size:=6
+ Else
+ If (Param=Seven1) Or (Param=Seven2) Or (Param=Seven3) Then Size:=7
+ Else
+ {Unknown keyword}
+ Begin
+ Writeln(Chr(7)+'Invalid command line parameter: '+Param+'...');
+ Halt(1)
+ End
+ End
+ Else
+ {Must be a filename, we'll try to open it later}
+ FileName:=Param
+ End
+ End
+End;
+
+Procedure GetParameters(Var RunTime:RunTimeType);
+{Get parameters from user or command line}
+{Current parameter status is echoed on the console}
+Begin
+If ParamCount=0 Then Manual(RunTime)
+Else Automate(RunTime);
+EchoParameters(Output,RunTime)
+End;
+
+{-------------------------------- OpenFile -----------------------------------}
+
+Function TryExtension(Var InFile:InFileType; Var RunTime:RunTimeType;
+ TriedExtension:String):Boolean;
+{Tries to open FileName using TriedExtension}
+Begin
+With RunTime Do
+ Begin
+ Extension:=TriedExtension;
+ Assign(InFile,FileName+TriedExtension);
+ {$I-}Reset(InFile);{$I+}
+ {IOResult must be immediately used once only}
+ TryExtension:=(IOResult=0)
+ End
+End;
+
+Procedure OpenFile(Var InFile:InFileType; Var RunTime:RunTimeType);
+{Tries to open FileName using all available extensions}
+Begin
+If TryExtension(InFile,RunTime,Extension1) Then Write(Extension1)
+Else
+ If TryExtension(InFile,RunTime,Extension2) Then Write(Extension2)
+ Else
+ If TryExtension(InFile,RunTime,Extension3) Then Write(Extension3)
+ Else
+ Begin
+ Writeln('.');
+ Writeln(Chr(7)+'File not found'+'...');
+ Halt(1)
+ End
+End;
+
+{-------------------------------- GetBitmap ----------------------------------}
+
+Procedure PerformScan(Var CommentLine:String; Var RunTime:RunTimeType;
+ Echo:Boolean; Var OutFile:OutFileType);
+{Scans the comment line for run-time JEM2TEX parameters}
+{Any Bitmap or unknown parameter stops the scan}
+{Current parameter status is echoed in the .TeX file as a [La]TeX comment}
+Var Index:Integer;
+Begin
+{Delete 1 char at the 1st position which is %}
+Delete(CommentLine,1,1);
+{Convert to upper case}
+For Index:=1 To Length(CommentLine) Do
+ CommentLine[Index]:=UpCase(CommentLine[Index]);
+{Add space at the line end to characterize premature termination}
+{Add sentinel at the line end to stop forthcoming loops}
+CommentLine:=CommentLine+' %';
+{Delete leading blanks}
+If CommentLine[1]=' ' Then
+ Repeat Delete(CommentLine,1,1)
+ Until CommentLine[1]<>' ';
+{Look for run-time flag at the start of line}
+If ( RunFlag1=Copy(CommentLine,1,Length(RunFlag1)) ) Or
+ ( RunFlag2=Copy(CommentLine,1,Length(RunFlag1)) ) Or
+ ( RunFlag3=Copy(CommentLine,1,Length(RunFlag1)) )
+Then
+ Begin
+ {Remove run-time flag}
+ Delete(CommentLine,1,Length(RunFlag1));
+ {Scan until sentinel reached}
+ Repeat
+ {Delete leading blanks}
+ If CommentLine[1]=' ' Then
+ Repeat Delete(CommentLine,1,1)
+ Until CommentLine[1]<>' ';
+ If (CommentLine[1]=Flag1) Or (CommentLine[1]=Flag2) Then
+ {Valid run-time parameter flag}
+ Begin
+ {Delete 1 char at the 1st position which is flag}
+ Delete(CommentLine,1,1);
+ {Scan in decreasing length order}
+ With RunTime Do
+ Begin
+ If Space1=Copy(CommentLine,1,Length(Space1)) Then
+ Begin Delete(CommentLine,1,Length(Space1)); ExtraSpace:=True End
+ Else
+ If Space2=Copy(CommentLine,1,Length(Space2)) Then
+ Begin Delete(CommentLine,1,Length(Space2)); ExtraSpace:=True End
+ Else
+ If Space3=Copy(CommentLine,1,Length(Space3)) Then
+ Begin Delete(CommentLine,1,Length(Space3)); ExtraSpace:=True End
+ Else
+ If NoSpace1=Copy(CommentLine,1,Length(NoSpace1)) Then
+ Begin Delete(CommentLine,1,Length(NoSpace1)); ExtraSpace:=False End
+ Else
+ If NoSpace2=Copy(CommentLine,1,Length(NoSpace2)) Then
+ Begin Delete(CommentLine,1,Length(NoSpace2)); ExtraSpace:=False End
+ Else
+ If NoSpace3=Copy(CommentLine,1,Length(NoSpace3)) Then
+ Begin Delete(CommentLine,1,Length(NoSpace3)); ExtraSpace:=False End
+ Else
+ If Percent1=Copy(CommentLine,1,Length(Percent1)) Then
+ Begin Delete(CommentLine,1,Length(Percent1)); Percent:=True End
+ Else
+ If Percent2=Copy(CommentLine,1,Length(Percent2)) Then
+ Begin Delete(CommentLine,1,Length(Percent2)); Percent:=True End
+ Else
+ If Percent3=Copy(CommentLine,1,Length(Percent3)) Then
+ Begin Delete(CommentLine,1,Length(Percent3)); Percent:=True End
+ Else
+ If NoPercent1=Copy(CommentLine,1,Length(NoPercent1)) Then
+ Begin Delete(CommentLine,1,Length(NoPercent1)); Percent:=False End
+ Else
+ If NoPercent2=Copy(CommentLine,1,Length(NoPercent2)) Then
+ Begin Delete(CommentLine,1,Length(NoPercent2)); Percent:=False End
+ Else
+ If NoPercent3=Copy(CommentLine,1,Length(NoPercent3)) Then
+ Begin Delete(CommentLine,1,Length(NoPercent3)); Percent:=False End
+ Else
+ If EUC1=Copy(CommentLine,1,Length(EUC1)) Then
+ Begin Delete(CommentLine,1,Length(EUC1)); EUC:=True End
+ Else
+ If NoEUC1=Copy(CommentLine,1,Length(NoEUC1)) Then
+ Begin Delete(CommentLine,1,Length(NoEUC1)); EUC:=False End
+ Else
+ If NoEUC2=Copy(CommentLine,1,Length(NoEUC2)) Then
+ Begin Delete(CommentLine,1,Length(NoEUC2)); EUC:=False End
+ Else
+ If Extended1=Copy(CommentLine,1,Length(Extended1)) Then
+ Begin Delete(CommentLine,1,Length(Extended1)); Extended:=True End
+ Else
+ If Standard1=Copy(CommentLine,1,Length(Standard1)) Then
+ Begin Delete(CommentLine,1,Length(Standard1)); Extended:=False End
+ Else
+ If LaTeX1=Copy(CommentLine,1,Length(LaTeX1)) Then
+ Begin Delete(CommentLine,1,Length(LaTeX1)); LaTeX:=True End
+ Else
+ If TeX1=Copy(CommentLine,1,Length(TeX1)) Then
+ Begin Delete(CommentLine,1,Length(TeX1)); LaTeX:=False End
+ Else
+ If TeX2=Copy(CommentLine,1,Length(TeX2)) Then
+ Begin Delete(CommentLine,1,Length(TeX2)); LaTeX:=False End
+ Else
+ If One1=Copy(CommentLine,1,Length(One1)) Then
+ Begin Delete(CommentLine,1,Length(One1)); Size:=1 End
+ Else
+ If Two1=Copy(CommentLine,1,Length(Two1)) Then
+ Begin Delete(CommentLine,1,Length(Two1)); Size:=2 End
+ Else
+ If Three1=Copy(CommentLine,1,Length(Three1)) Then
+ Begin Delete(CommentLine,1,Length(Three1)); Size:=3 End
+ Else
+ If Four1=Copy(CommentLine,1,Length(Four1)) Then
+ Begin Delete(CommentLine,1,Length(Four1)); Size:=4 End
+ Else
+ If Five1=Copy(CommentLine,1,Length(Five1)) Then
+ Begin Delete(CommentLine,1,Length(Five1)); Size:=5 End
+ Else
+ If Six1=Copy(CommentLine,1,Length(Six1)) Then
+ Begin Delete(CommentLine,1,Length(Six1)); Size:=6 End
+ Else
+ If Seven1=Copy(CommentLine,1,Length(Seven1)) Then
+ Begin Delete(CommentLine,1,Length(Seven1)); Size:=7 End
+ Else
+ If One2=Copy(CommentLine,1,Length(One2)) Then
+ Begin Delete(CommentLine,1,Length(One2)); Size:=1 End
+ Else
+ If Two2=Copy(CommentLine,1,Length(Two2)) Then
+ Begin Delete(CommentLine,1,Length(Two2)); Size:=2 End
+ Else
+ If Three2=Copy(CommentLine,1,Length(Three2)) Then
+ Begin Delete(CommentLine,1,Length(Three2)); Size:=3 End
+ Else
+ If Four2=Copy(CommentLine,1,Length(Four2)) Then
+ Begin Delete(CommentLine,1,Length(Four2)); Size:=4 End
+ Else
+ If Five2=Copy(CommentLine,1,Length(Five2)) Then
+ Begin Delete(CommentLine,1,Length(Five2)); Size:=5 End
+ Else
+ If Six2=Copy(CommentLine,1,Length(Six2)) Then
+ Begin Delete(CommentLine,1,Length(Six2)); Size:=6 End
+ Else
+ If Seven2=Copy(CommentLine,1,Length(Seven2)) Then
+ Begin Delete(CommentLine,1,Length(Seven2)); Size:=7 End
+ Else
+ If One3=Copy(CommentLine,1,Length(One3)) Then
+ Begin Delete(CommentLine,1,Length(One3)); Size:=1 End
+ Else
+ If Three3=Copy(CommentLine,1,Length(Three3)) Then
+ Begin Delete(CommentLine,1,Length(Three3)); Size:=3 End
+ Else
+ If Four3=Copy(CommentLine,1,Length(Four3)) Then
+ Begin Delete(CommentLine,1,Length(Four3)); Size:=4 End
+ Else
+ If Five3=Copy(CommentLine,1,Length(Five3)) Then
+ Begin Delete(CommentLine,1,Length(Five3)); Size:=5 End
+ Else
+ If Six3=Copy(CommentLine,1,Length(Six3)) Then
+ Begin Delete(CommentLine,1,Length(Six3)); Size:=6 End
+ Else
+ If Seven3=Copy(CommentLine,1,Length(Seven3)) Then
+ Begin Delete(CommentLine,1,Length(Seven3)); Size:=7 End
+ Else
+ {Unknown run-time parameter}
+ {Terminate prematurely current scan}
+ CommentLine:='%'
+ End;
+ {Echo status if allowed}
+ If Echo And (CommentLine<>'%') Then
+ Begin
+ Write(OutFile,'%');
+ EchoParameters(OutFile,RunTime)
+ End
+ End
+ Else
+ {Unknown run-time parameter flag}
+ {Terminate prematurely current scan}
+ CommentLine:='%'
+ Until Length(CommentLine)=1
+ End
+End;
+
+Procedure LineBreak(Var OutFile:OutFileType; ExtraSpace:Boolean;
+ Var Scanning:ScanningType);
+{The continuous chain of Bitmaps has just been interrupted by a line break}
+{We know the next Roman character is equivalent to a space, i.e. not a letter}
+{A \eeee may be inserted if the previous Bitmap was a .,!?}
+{A \eee may be inserted if the previous Bitmap was a :; center dot )]'"}
+{If glue inserted, make sure to leave a totally blank line as present before}
+Begin
+With Scanning Do
+ Begin
+ Immediate:=False;
+ If Echo And ExtraSpace Then
+ If RomanMajorEOL Then Writeln(OutFile,'\eeee')
+ Else
+ If RomanMinorEOL Then Writeln(OutFile,'\eee')
+ End
+End;
+
+Procedure RomanBreak(Var OutFile:OutFileType; ExtraSpace:Boolean;
+ Var Scanning:ScanningType);
+{The continuous chain of Bitmaps has just been interrupted by a Roman}
+{The next Roman character may be a letter so a \eee is possible}
+{A \eeee may be inserted if the previous Bitmap was a .,!?}
+{A \eee may be inserted if the previous Bitmap was a :; center dot )]'"}
+{Curly brackets are used in \eee and \eeee when the next Roman is a letter}
+Begin
+With Scanning Do
+ Begin
+ Immediate:=False;
+ If Echo And ExtraSpace Then
+ If RomanMajorEOL Then
+ If WasLetter Then Write(OutFile,'\eeee{}')
+ Else Write(OutFile,'\eeee')
+ Else
+ If RomanMinorEOL Then
+ If WasLetter Then Write(OutFile,'\eee{}')
+ Else Write(OutFile,'\eee')
+ Else
+ If WasLetter And Not RomanOpening Then Write(OutFile,'\eee{}')
+ End
+End;
+
+Procedure GotUNIX(Var OutFile:OutFileType; Var Scanning:ScanningType;
+ Var RunTime:RunTimeType);
+{Handles UNIX EOL}
+{May add glue after the previous Bitmap and before this Roman}
+Begin
+With Scanning,RunTime Do
+ Begin
+ If Immediate Then
+ If First Then LineBreak(OutFile,ExtraSpace,Scanning)
+ Else
+ If Not Comment Then
+ If Percent Then
+ If Echo Then Write(OutFile,'%')
+ Else
+ Else
+ LineBreak(OutFile,ExtraSpace,Scanning);
+ If Echo Then Writeln(OutFile);
+ If Comment Then
+ If Not First Then PerformScan(CommentLine,RunTime,Echo,OutFile)
+ Else
+ Else
+ WasLetter:=False;
+ First:=True;
+ Comment:=True;
+ CommentLine:=''
+ End
+End;
+
+Procedure GotDOS(Var OutFile:OutFileType; Var Scanning:ScanningType;
+ Var RunTime:RunTimeType; Var InFile:InFileType);
+{Handles DOS EOL}
+{May add glue after the previous Bitmap and before this Roman}
+{An error only stops the current pass to help the user determine its cause}
+Var Data2:Byte;
+Begin
+With Scanning Do
+ Begin
+ GotUNIX(OutFile,Scanning,RunTime);
+ {Line Feed must follow immediately}
+ If EOF(InFile) Then Done:=True
+ Else
+ Begin
+ Read(InFile,Data2);
+ If Data2<>$0A Then Done:=True
+ End;
+ If Done Then
+ Begin
+ Writeln('.');
+ Write(Chr(7)+'Abnormal DOS end of line..')
+ End
+ End
+End;
+
+Procedure ValidateBitmap(Bitmap:BitmapRange);
+{Prints a warning when an extended or an empty Bitmap is used}
+Var Invalid:Boolean;
+Begin
+Invalid:=False;
+If (109<=Bitmap) And (Bitmap<=119) Then Invalid:=True
+Else
+If (128<=Bitmap) And (Bitmap<=135) Then Invalid:=True
+Else
+If (143<=Bitmap) And (Bitmap<=153) Then Invalid:=True
+Else
+If (169<=Bitmap) And (Bitmap<=175) Then Invalid:=True
+Else
+If (184<=Bitmap) And (Bitmap<=203) Then Invalid:=True
+Else
+If (214<=Bitmap) And (Bitmap<=220) Then Invalid:=True
+Else
+If (247<=Bitmap) And (Bitmap<=252) Then Invalid:=True
+Else
+If (279<=Bitmap) And (Bitmap<=282) Then Invalid:=True
+Else
+If Bitmap=366 Then Invalid:=True
+Else
+If (463<=Bitmap) And (Bitmap<=470) Then Invalid:=True
+Else
+If (495<=Bitmap) And (Bitmap<=502) Then Invalid:=True
+Else
+If (527<=Bitmap) And (Bitmap<=564) Then Invalid:=True
+Else
+If (598<=Bitmap) And (Bitmap<=612) Then Invalid:=True
+Else
+If (646<=Bitmap) And (Bitmap<=658) Then Invalid:=True
+Else
+If (691<=Bitmap) And (Bitmap<=1410) Then Invalid:=True
+Else
+If (4376<=Bitmap) And (Bitmap<=4418) Then Invalid:=True;
+If Invalid Then
+ Begin
+ Writeln('.');
+ Write('Warning! The non-standard JIS ''83 Bitmap ',Bitmap,' encountered')
+ End
+End;
+
+Procedure GotBitmap(Var OutFile:OutFileType; EUC,Extended:Boolean;
+ Var InFile:InFileType; Var Scanning:ScanningType);
+{Handles Bitmap}
+{An error only stops the current pass to help the user determine its cause}
+{If desired, non-standard Bitmaps are pointed out in the first pass}
+Var Data2:Byte;
+Begin
+With Scanning Do
+ Begin
+ If First Then
+ {First character on line}
+ Begin
+ First:=False;
+ Comment:=False
+ End;
+ If EOF(InFile) Then
+ Begin
+ Done:=True;
+ Writeln('.');
+ If EUC Then Write(Chr(7)+'Incomplete EUC character pair..')
+ Else Write(Chr(7)+'Incomplete MS-kanji character pair..')
+ End
+ Else
+ Begin
+ Read(InFile,Data2);
+ If EUC Then
+ If ($A0<Data2) And (Data2<$FF) Then
+ Bitmap:=94*(Data1-$A1)+(Data2-$A1)+1
+ Else
+ Begin
+ Done:=True;
+ Writeln('.');
+ Write(Chr(7)+'Invalid EUC character pair..')
+ End
+ Else
+ If ( ($40<=Data2) And (Data2<=$7E) ) Or
+ ( ($80<=Data2) And (Data2<=$FC) )
+ Then
+ Begin
+ If (Data1>=$E0) Then Bitmap:=1+188*(Data1-$C1)
+ Else Bitmap:=1+188*(Data1-$81);
+ If (Data2>=$80) Then Bitmap:=Bitmap+(Data2-$41)
+ Else Bitmap:=Bitmap+(Data2-$40)
+ End
+ Else
+ Begin
+ Done:=True;
+ Writeln('.');
+ Write(Chr(7)+'Invalid MS-kanji character pair..')
+ End;
+ If Not Done Then
+ {Bitmaps in comment skipped}
+ If Comment Then
+ Begin
+ CommentLine:=CommentLine+Chr(Data1)+Chr(Data2);
+ If Echo Then Write(OutFile,Chr(Data1)+Chr(Data2))
+ End
+ Else
+ If (1<=Bitmap) And (Bitmap<=BitmapMax) Then
+ Begin
+ Found:=True;
+ {Point out non-standard Bitmaps in first pass}
+ If Not Echo And Not Extended Then ValidateBitmap(Bitmap)
+ End
+ Else
+ Begin
+ Done:=True;
+ Writeln('.');
+ Write(Chr(7)+'Bitmap ',Bitmap,' does not exist..')
+ End
+ End
+ End
+End;
+
+Procedure GotRoman(Var OutFile:OutFileType; ExtraSpace:Boolean;
+ Var Scanning:ScanningType);
+{Handles roman}
+{May add glue after the previous Bitmap and before this Roman}
+Begin
+With Scanning Do
+ Begin
+ If First Then
+ {First character on line}
+ Begin
+ First:=False;
+ If Chr(Data1)<>'%' Then Comment:=False
+ End;
+ If Comment Then CommentLine:=CommentLine+Chr(Data1)
+ Else
+ Begin
+ {Determine if this roman is a letter or a number}
+ WasLetter:=( ('A'<=UpCase(Chr(Data1))) And (UpCase(Chr(Data1))<='Z') ) Or
+ ( ('0'<=Chr(Data1)) And (Chr(Data1)<='9') );
+ If Immediate Then RomanBreak(OutFile,ExtraSpace,Scanning)
+ End;
+ If Echo Then Write(OutFile,Chr(Data1))
+ End
+End;
+
+Procedure GetBitmap(Var InFile:InFileType; Var OutFile:OutFileType;
+ Var Scanning:ScanningType; Var RunTime:RunTimeType);
+{Scans input file and stops when a Bitmap is met}
+{An error only stops the current pass to help the user determine its cause}
+{Accepts UNIX LF or DOS CR/LF as end of line indicator in input file}
+{Updates JemTeX parameters with run-time parameters}
+{Comment indicates the line is a comment line and does not break continuity}
+{Immediate indicates the current Bitmap immediately followed previous Bitmap}
+{If the next character encountered is Roman, glue may be inserted}
+{If desired, will add % at Japanese end of lines to preserve continuity}
+Begin
+With Scanning,RunTime Do
+ Begin
+ {No Bitmap found initially}
+ Found:=False;
+ {Assume the next character is a Bitmap}
+ WasLetter:=False;
+ Immediate:=True;
+ {Some non-comment Bitmap was met before or it's the first call to GetBitmap}
+ CommentLine:='';
+ {Comment holds; it's the first call ever to GetBitmap; it's first character}
+ {Comment fails; some non-comment Bitmap was met before; it isnt 1st character}
+ First:=Comment;
+ Repeat
+ {Check if file just finished}
+ If EOF(InFile) Then Done:=True
+ Else
+ {More file coming}
+ Begin
+ Read(InFile,Data1);
+ If Data1=$0A Then GotUNIX(OutFile,Scanning,RunTime)
+ Else
+ If Data1=$0D Then GotDOS(OutFile,Scanning,RunTime,InFile)
+ Else
+ If EUC Then
+ If ($A0<Data1) And (Data1<$FF) Then
+ GotBitmap(OutFile,EUC,Extended,InFile,Scanning)
+ Else
+ GotRoman(OutFile,ExtraSpace,Scanning)
+ Else
+ If ( ($81<=Data1) And (Data1<=$9F) ) Or
+ ( ($E0<=Data1) And (Data1<=$EA) )
+ Then
+ GotBitmap(OutFile,EUC,Extended,InFile,Scanning)
+ Else
+ GotRoman(OutFile,ExtraSpace,Scanning)
+ End
+ Until Done Or Found
+ End
+End;
+
+{---------------------------------- GetFont ----------------------------------}
+
+Procedure GetFont(Var InFile:InFileType; Var Fonts:FontsType;
+ Var InitialRunTime:RunTimeType);
+{Finds the Japanese fonts needed}
+Var
+ {Run time parameters}
+ RunTime:RunTimeType;
+ {Current font number}
+ FontPtr:FontRange;
+ SizePtr:SizeRange;
+ {Scanning information}
+ Scanning:ScanningType;
+ {Dummy since no output in first pass}
+ DummyOutFile:OutFileType;
+Begin
+RunTime:=InitialRunTime;
+{No Japanese font needed so far}
+For SizePtr:=1 To SizeMax Do
+ For FontPtr:=0 To FontMax Do
+ Fonts[SizePtr,FontPtr]:=False;
+With Scanning Do
+ Begin
+ {Not reached EOF yet}
+ Done:=False;
+ {No echo in first pass}
+ Echo:=False;
+ {Dummy since no output in first pass}
+ Immediate:=False;
+ WasLetter:=False;
+ RomanMajorEOL:=False;
+ RomanMinorEOL:=False;
+ RomanOpening:=False;
+ {Tell indirectly to GetBitmap that this is the first time it is called}
+ Comment:=True;
+ Repeat
+ {Get the next Bitmap skipping over [La]TeX comments}
+ GetBitmap(InFile,DummyOutFile,Scanning,RunTime);
+ If Not Done Then Fonts[RunTime.Size,Bitmap Div 128]:=True
+ Until Done
+ End;
+{Last state of LaTeX prevails for the second pass}
+InitialRunTime.LaTeX:=RunTime.LaTeX
+End;
+
+{----------------------------------- Header ----------------------------------}
+
+Procedure Header(Var OutFile:OutFileType; Var Fonts:FontsType; LaTeX:Boolean);
+{Writes [La]TeX header}
+{Fonts declared global for speed, even if never actually modified here}
+Var
+ FontPtr:FontRange;
+ SizePtr:SizeRange;
+ C0,C1,C2:Char;
+ Scale:Integer;
+Begin
+Writeln(OutFile,'\tracingstats=1');
+For SizePtr:=1 To SizeMax Do
+ Begin
+ C0:=Chr( Ord('a')+SizePtr-1 );
+ Case SizePtr Of
+ 1:Scale:=1000;
+ 2:Scale:=1095;
+ 3:Scale:=1200;
+ 4:Scale:=1440;
+ 5:Scale:=1728;
+ 6:Scale:=2074;
+ 7:Scale:=2488
+ End;
+ For FontPtr:=0 To FontMax Do
+ If Fonts[SizePtr,FontPtr] Then
+ Begin
+ C1:=Chr( Ord('a')+(FontPtr Div 8) );
+ C2:=Chr( Ord('a')+(FontPtr Mod 8) );
+ If LaTeX Then
+ Writeln(OutFile,'\newfont{\k'+C0+C1+C2+'}{kanji'+C1+C2+' scaled ',
+ Scale,'}')
+ Else
+ Writeln(OutFile,'\font\k'+C0+C1+C2+'=kanji'+C1+C2+' scaled ',Scale)
+ End
+ End;
+If LaTeX Then
+ Begin
+ Writeln(OutFile,'\newcommand{\kk}[2]{{#1\symbol{#2}}}');
+ Writeln(OutFile,'\newcommand{\hh}{\discretionary{}{}{}}');
+ Writeln(OutFile,'\newcommand{\ee}{\nobreak\hskip0pt plus.1em\relax}');
+ Writeln(OutFile,'\newcommand{\eee}{\nobreak\hskip.3em plus.1em\relax}');
+ Writeln(OutFile,'\newcommand{\eeee}{\nobreak\hskip.9em plus.1em minus.1em}')
+ End
+Else
+ Begin
+ Writeln(OutFile,'\def\kk#1#2{{#1\char#2}}');
+ Writeln(OutFile,'\def\hh{\discretionary{}{}{}}');
+ Writeln(OutFile,'\def\ee{\nobreak\hskip0pt plus.1em\relax}');
+ Writeln(OutFile,'\def\eee{\nobreak\hskip.3em plus.1em\relax}');
+ Writeln(OutFile,'\def\eeee{\nobreak\hskip.9em plus.1em minus.1em}')
+ End;
+Writeln(OutFile)
+End;
+
+{---------------------------------- Convert ----------------------------------}
+
+Procedure BitmapType(Bitmap:BitmapRange; Var Punctuation:PunctuationType);
+{Finds characteristics of current Bitmap}
+Begin
+With Punctuation Do
+ Begin
+ OldMajorEOL:=NewMajorEOL;
+ OldMinorEOL:=NewMinorEOL;
+ OldOpening:=NewOpening;
+ OldClosing:=NewClosing;
+ OldCenterDot:=NewCenterDot;
+ OldJapanese:=NewJapanese;
+ NewMajorEOL:=False;
+ NewMinorEOL:=False;
+ NewOpening:=False;
+ NewClosing:=False;
+ NewCenterDot:=False;
+ NewJapanese:=False;
+ {Full width .,!?}
+ If (2<=Bitmap) And (Bitmap<=5) Then NewMajorEOL:=True
+ Else
+ If (Bitmap=9) Or (Bitmap=10) Then NewMajorEOL:=True
+ Else
+ {Half width .,!?}
+ If (Bitmap=691) Or (Bitmap=720) Then NewMajorEOL:=True
+ Else
+ {Full width :;}
+ If (Bitmap=7) Or (Bitmap=8) Then NewMinorEOL:=True
+ Else
+ {Half width :;}
+ If (Bitmap=692) Or (Bitmap=693) Then NewMinorEOL:=True
+ Else
+ {Full width `"([< and other openings}
+ If (38<=Bitmap) And (Bitmap<=58) And Not Odd(Bitmap) Then NewOpening:=True
+ Else
+ {Half width `"([< and other openings}
+ If (696<=Bitmap)And(Bitmap<=716) And Not Odd(Bitmap) Then NewOpening:=True
+ Else
+ {Full width '")]> and other closings}
+ If (39<=Bitmap) And (Bitmap<=59) And Odd(Bitmap) Then NewClosing:=True
+ Else
+ {Half width '")]> and other closings}
+ If (697<=Bitmap) And (Bitmap<=717) And Odd(Bitmap) Then NewClosing:=True
+ Else
+ {Full width Japanese center dot}
+ If (Bitmap=6) Then NewCenterDot:=True
+ Else
+ {Half width Japanese center dot}
+ If (Bitmap=469) Then NewCenterDot:=True
+ Else
+ {Full width Hiragana}
+ If (283<=Bitmap) And (Bitmap<=365) Then NewJapanese:=True
+ Else
+ {Full width Katakana}
+ If (377<=Bitmap) And (Bitmap<=462) Then NewJapanese:=True
+ Else
+ {Full width Kanji level 1}
+ If (1411<=Bitmap) And (Bitmap<=4375) Then NewJapanese:=True
+ Else
+ {Full width Kanji level 2}
+ If (4419<=Bitmap) And (Bitmap<=7806) Then NewJapanese:=True
+ Else
+ {Script Hiragana}
+ If (753<=Bitmap) And (Bitmap<=835) Then NewJapanese:=True
+ Else
+ {Script Katakana}
+ If (847<=Bitmap) And (Bitmap<=932) Then NewJapanese:=True
+ End
+End;
+
+Procedure Hyphenate(Var OutFile:OutFileType; Var Punctuation:PunctuationType);
+{Adds hyphenation between consecutive Bitmaps}
+Begin
+With Punctuation Do
+ {No hyphenation between two odd symbols}
+ If OldJapanese Or NewJapanese Then
+ {No hyphenation before some symbols}
+ If Not NewMajorEOL And Not NewMinorEOL And Not NewCenterDot And
+ Not NewClosing
+ Then
+ {No hyphenation after some symbols}
+ If Not OldOpening Then Write(OutFile,'\hh')
+End;
+
+Procedure Glue(Var OutFile:OutFileType; Var Punctuation:PunctuationType;
+ ExtraSpace:Boolean);
+{Adds glue between consecutive Bitmaps}
+Var GlueAdded:Boolean;
+Begin
+With Punctuation Do
+ Begin
+ GlueAdded:=False;
+ If ExtraSpace Then
+ Begin
+ {Trying to add big glue}
+ If OldMajorEOL Then
+ {No big glue between identical symbols}
+ If Not NewMajorEOL Then
+ {No big glue before some symbols}
+ If Not NewClosing Then
+ Begin
+ GlueAdded:=True;
+ Write(OutFile,'\eeee')
+ End;
+ If Not GlueAdded Then
+ {Trying to add medium glue based on old symbol}
+ If OldMinorEOL Or OldCenterDot Or OldClosing Then
+ {No medium glue before some symbols}
+ If Not NewMajorEOL And Not NewMinorEOL And Not NewClosing Then
+ Begin
+ GlueAdded:=True;
+ Write(OutFile,'\eee')
+ End;
+ If Not GlueAdded Then
+ {Trying to add medium glue based on new symbol}
+ If NewCenterDot Or NewOpening Then
+ {No medium glue after some symbols}
+ If Not OldOpening Then
+ Begin
+ GlueAdded:=True;
+ Write(OutFile,'\eee')
+ End
+ End;
+ {Always make sure to add some glue}
+ If Not GlueAdded Then Write(OutFile,'\ee')
+ End
+End;
+
+Procedure Convert(Var InFile:InFileType; Var OutFile:OutFileType;
+ Var RunTime:RunTimeType);
+{Convert .JEM into .TeX by translating Bitmaps and adding hyphenation and glue}
+Var
+ {Japanese punctuation information}
+ Punctuation:PunctuationType;
+ {Scanning information}
+ Scanning:ScanningType;
+ {Current font number}
+ FontPtr:FontRange;
+ C0,C1,C2:Char;
+Begin
+With Punctuation,Scanning,RunTime Do
+ Begin
+ {Not reached EOF yet}
+ Done:=False;
+ {Echo in second pass}
+ Echo:=True;
+ {Nothing done yet}
+ Immediate:=False;
+ WasLetter:=False;
+ {Tell indirectly to GetBitmap that this is the first time it is called}
+ Comment:=True;
+ {Initial japanese punctuation information}
+ NewMajorEOL:=False; NewMinorEOL:=False;
+ NewOpening:=False; NewClosing:=False;
+ NewCenterDot:=False; NewJapanese:=False;
+ Repeat
+ {Set up scanning information in case a roman letter follows immediately}
+ RomanMajorEOL:=NewMajorEOL;
+ RomanMinorEOL:=NewMinorEOL Or NewCenterDot Or NewClosing;
+ RomanOpening:=NewOpening;
+ {Get the next Bitmap skipping over [La]TeX comments}
+ {May add glue between the old Bitmap and an hypothetical Roman}
+ GetBitmap(InFile,OutFile,Scanning,RunTime);
+ If Not Done Then
+ Begin
+ {Find what kind of Bitmap it is}
+ BitmapType(Bitmap,Punctuation);
+ If Immediate Then
+ {Add hyphenation and glue between consecutive Bitmaps}
+ Begin
+ Hyphenate(OutFile,Punctuation);
+ Glue(OutFile,Punctuation,ExtraSpace)
+ End
+ Else
+ {Add glue after the old Roman and before this new Bitmap}
+ If ExtraSpace Then
+ If NewCenterDot Or NewOpening Then Write(OutFile,'\eee')
+ Else
+ If WasLetter Then
+ {No medium glue before some symbols}
+ If Not NewMajorEOL And Not NewMinorEOL And Not NewClosing Then
+ Write(OutFile,'\eee');
+ {Write the Bitmap}
+ C0:=Chr( Ord('a')+Size-1 );
+ FontPtr:=Bitmap Div 128;
+ C1:=Chr( Ord('a')+(FontPtr Div 8) );
+ C2:=Chr( Ord('a')+(FontPtr Mod 8) );
+ Write(OutFile,'\kk{\k'+C0+C1+C2+'}{',Bitmap Mod 128,'}')
+ {The next character may be Roman, GetBitmap will handle the glue then}
+ End
+ Until Done
+ End
+End;
+
+{------------------------------------ Main -----------------------------------}
+
+Begin
+Writeln;
+Writeln('Japanese to [La]TeX Conversion Program.'); {To make Borland happy}
+Writeln('Version 2.00 Copyright F. Jalbert 1991.');
+Writeln;
+
+
+GetParameters(RunTime);
+Writeln;
+Write('Opening Japanese file '+RunTime.FileName);
+OpenFile(InFile,RunTime);
+Writeln('.');
+If RunTime.LaTeX Then Write('Creating LaTeX file '+RunTime.FileName+'.tex')
+Else Write('Creating TeX file '+RunTime.FileName+'.tex');
+Assign(OutFile,RunTime.FileName+'.tex');
+Rewrite(OutFile);
+Writeln('.');
+Writeln;
+
+
+Write('Scanning Japanese file for fonts');
+GetFont(InFile,Fonts,RunTime);
+Reset(InFile);
+Writeln('.');
+If RunTime.LaTeX Then Write('Writing LaTeX header')
+Else Write('Writing TeX header');
+Header(OutFile,Fonts,RunTime.LaTeX);
+Writeln('.');
+Write('Converting Japanese file');
+Convert(InFile,OutFile,RunTime);
+Writeln('.');
+Writeln;
+
+
+Write('Closing Japanese file '+RunTime.FileName+RunTime.Extension);
+Close(InFile);
+Writeln('.');
+If RunTime.LaTeX Then Write('Closing LaTeX file '+RunTime.FileName+'.tex')
+Else Write('Closing TeX file '+RunTime.FileName+'.tex');
+Close(OutFile);
+Writeln('.');
+Writeln;
+
+
+Writeln('Japanese to [La]TeX conversion completed.');
+Writeln
+End.