home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari FTP
/
ATARI_FTP_0693.zip
/
ATARI_FTP_0693
/
Tex
/
td187src.lzh
/
COMPILE.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
43KB
|
1,311 lines
IMPLEMENTATION MODULE Compile ;
(* Erweitert um Beziercurve, JP *)
(* Erweitert um Epic-Kommandos, JP *)
FROM Dialoge IMPORT BusyStart, BusyEnd;
FROM FileIO IMPORT Rewrite, Close, WriteLn;
FROM File IMPORT InsertFile;
FROM CSspecial IMPORT WriteCSspecial;
FROM Types IMPORT TextPosTyp, DrawObjectTyp, ObjectSet,
LatexSpecials,
ObjectPtrTyp, specialformat;
IMPORT CommonData ;
IMPORT Diverses ;
IMPORT GetFile;
IMPORT ObjectUtilities ;
IMPORT MagicStrings;
IMPORT MagicSys;
IMPORT Variablen ;
IMPORT MathLib0 ;
(**
IMPORT Debug;
**)
(* Index 1 und 2 bezeichen immer den Referenzpunkt *)
(* Index 8 zumeist die Liniendicke, Index 9 die Textlänge so vorhanden *)
(* 0 | 3 | 4 | 5 | 6 | 7 | 8 | 9 *)
(* ---------------+--------+-------+---------------+-------+-------+------ *)
(* Picture | XExt | YExt |objekte|unitlen| | | *)
(* Text | | | | |AlignFl| |Textlen*)
(* Line | | | | | | | *)
(* Arrow | | | | | | | *)
(* Circle | Radius | | | | | | *)
(* Disk | Radius | | | | | | *)
(* Oval | Radius | Posit.| | | | | *)
(* Filledbox | XExt | XExt | | | | | *)
(* Ovalbox | XExt | YExt | | | | | *)
(* Framebox | XExt | YExt |Textpos|MBxFlag|AlignFl| |Textlen*)
(* Dashbox | XExt | Yext |Textpos| |AlignFl| |Textlen*)
(* Beziercurve | X2 | Y2 | X3 | Y3 |Points | | *)
(* Bezierellipse | X2 | Y2 | X3 | Y3 |Points | | *)
(* EpicSolidLine | Pts-1 | | | | | |MarkTL *)
(* EpicDottedLine | Pts-1 | | | | | | " *)
(* EpicDashedLine | Pts-1 | | | | | | " *)
(* EpicGrid | Xext | YExt |DeltaX |DeltaY | | | *)
(* Arc | Radius |StartA.|DeltaA.| | | | *)
(* Spline | Pts-1 | | | | | | *)
(* Ellipse | XRadius|YRadius|StartA.|DeltaA.| | | *)
CONST FullCSName = TRUE; (* Beim special-Befehl Pfad mit übergeben *)
CONST Clever = TRUE; (* Doppelpfeile durch einfaches hinzufügen *)
(* einer zweiten Pfeilspitze erzeugen (TRUE) *)
(* oder durch 2 Pfeile darstellen (FALSE)? *)
VAR OutLine, Part,
CSName,
String : ARRAY [0..255] OF CHAR ;
Handle,
i , j : INTEGER ;
Object : ObjectPtrTyp ;
Width : INTEGER ; (* Liniendicke *)
TextOnly : BOOLEAN ;
Flag1 : BOOLEAN ;
Flag2 : BOOLEAN ;
UseCSspecial,
UseEEPiC : BOOLEAN ;
CompileEm : ARRAY specialformat,
DrawObjectTyp OF BOOLEAN;
(**
PROCEDURE AppendChar(c : CHAR; VAR target : ARRAY OF CHAR);
VAR temp : ARRAY [0..1] OF CHAR;
BEGIN
temp[0] := c;
temp[1] := 0C;
MagicStrings.Append(temp, target);
END AppendChar;
**)
(**********************************************************)
PROCEDURE Position ( Pos : INTEGER ; VAR Str : ARRAY OF CHAR ) ;
BEGIN
CASE VAL(TextPosTyp, Pos) OF
LeftTop : MagicStrings.Assign ( '[tl]', Str); |
Left : MagicStrings.Assign ( '[l]', Str); |
LeftBot : MagicStrings.Assign ( '[bl]', Str); |
Top : MagicStrings.Assign ( '[t]', Str); |
Bottom : MagicStrings.Assign ( '[b]', Str); |
RightTop : MagicStrings.Assign ( '[tr]', Str); |
Right : MagicStrings.Assign ( '[r]', Str); |
RightBot : MagicStrings.Assign ( '[br]', Str); |
ELSE
MagicStrings.Assign ( '', Str);
END;
END Position ;
PROCEDURE BasicGetPut(x, y : INTEGER);
BEGIN
OutLine := "\put(,)" ; (* Anfangskoordinaten *)
Variablen.SimpleValueToStr ( y , String ) ;
MagicStrings.Insert ( String , OutLine , 6 ) ;
Variablen.SimpleValueToStr ( x , String ) ;
MagicStrings.Insert ( String , OutLine , 5 ) ;
END BasicGetPut;
PROCEDURE Basic10GetPut(x, y : MagicSys.lINTEGER);
BEGIN
OutLine := "\put(,)" ; (* Anfangskoordinaten *)
Variablen.SimpleValue10ToStr ( y , String ) ;
MagicStrings.Insert ( String , OutLine , 6 ) ;
Variablen.SimpleValue10ToStr ( x , String ) ;
MagicStrings.Insert ( String , OutLine , 5 ) ;
END Basic10GetPut;
PROCEDURE GetPut ( Object : ObjectPtrTyp ) ;
BEGIN
BasicGetPut(Object^.Code[1], Object^.Code[2]);
END GetPut;
PROCEDURE GetText( Object : ObjectPtrTyp;
VAR result : ARRAY OF CHAR) ;
VAR temp : ARRAY [0..255] OF CHAR;
insert : ARRAY [0..19] OF CHAR;
align : INTEGER;
cr : BOOLEAN;
i, j, len : INTEGER;
BEGIN
temp := '';
cr := FALSE;
len := Object^.Code[9];
align := Object^.Code[7];
FOR i := 0 TO len-1 DO
temp [ i ] := Object^.CPtr^ [ i ] ;
END ;
temp [ len ] := 0C ;
FOR i:=0 TO len-2 DO
IF (temp[i]='\') AND (temp[i+1]='\') THEN
cr := TRUE;
END;
END;
IF cr THEN
insert := '';
CASE align OF
0: (* center *) insert := '\shortstack{'; |
1: (* leftalign *) insert := '\shortstack[l]{'; |
2: (* rightalign *) insert := '\shortstack[r]{'; |
ELSE
END;
IF insert[0]<>0C THEN
MagicStrings.Insert(insert, temp, 0);
(* AppendChar ('}', temp);*)
MagicStrings.Append('}', temp);
END;
END;
MagicStrings.Assign ( temp, result);
END GetText;
PROCEDURE ArrowHead(x1, y1, x2, y2 : INTEGER;
start, end : BOOLEAN);
(* LaTeX erlaubt die Steigungspaare von (-4..+4,-4..+4) wobei
die Werte keinen gemeinsamen Teiler haben dürfen *)
VAR mx, my : INTEGER;
dx, dy : INTEGER;
i, j : INTEGER;
a1, e1,
a2, e2 : INTEGER;
slope : ARRAY [-4..+4],[-4..+4] OF LONGREAL;
testslope : LONGREAL;
delta : LONGREAL;
BEGIN
FOR mx := -4 TO 4 DO
FOR my := -4 TO 4 DO
IF mx<>0 THEN
slope[mx,my] := MathLib0.real(my) / MathLib0.real(mx) ;
ELSE
IF mx>=0 THEN
slope[mx,my] := +9999.99
ELSE
slope[mx,my] := -9999.99
END;
END;
END;
END;
(* Also: zunaechst einmal Steigung bestimmen *)
dx := x2 - x1;
dy := y2 - y1;
IF dx<0 THEN
a1 := -4;
e1 := 0;
ELSE
a1 := 0;
e1 := +4;
END;
IF dy<0 THEN
a2 := -4;
e2 := 0;
ELSE
a2 := 0;
e2 := +4;
END;
(* Sonderfälle abfangen *)
IF dx = 0 THEN
mx := 0;
IF dy<0 THEN
my := -1;
ELSE
my := +1;
END;
ELSIF dy = 0 THEN
my := 0;
IF dx<0 THEN
mx := -1;
ELSE
mx := +1;
END;
ELSE
testslope := MathLib0.real(dy) / MathLib0.real(dx);
(* So welcher Wert liegt nahe *)
mx := 0;
my := 0;
delta := 9999.99;
FOR i:=a1 TO e1 DO
FOR j:=a2 TO e2 DO
IF ABS(slope[i,j] - testslope)<delta THEN
delta := ABS(slope[i,j] - testslope);
mx := i;
my := j;
END;
END;
END;
END;
IF NOT ((mx=0) AND (my=0)) THEN
(* So jetzt eventuell Bruch reduzieren *)
IF (mx<>0) AND (my<>0) THEN
WHILE ((mx MOD 2) = 0) AND ((my MOD 2) =0) DO
(* Es können nur Vielfache von 2 sein *)
mx := mx DIV 2;
my := my DIV 2;
END;
END;
END;
IF start THEN
BasicGetPut(x1, y1);
Part := '{\vector(,){0}}';
Variablen.NumberToStr ( -my , String ) ;
MagicStrings.Insert ( String , Part , 10 ) ;
Variablen.NumberToStr ( -mx , String ) ;
MagicStrings.Insert ( String , Part , 9 ) ;
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ;
END;
IF end THEN
BasicGetPut(x2, y2);
Part := '{\vector(,){0}}';
Variablen.NumberToStr ( my , String ) ;
MagicStrings.Insert ( String , Part , 10 ) ;
Variablen.NumberToStr ( mx , String ) ;
MagicStrings.Insert ( String , Part , 9 ) ;
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ;
END;
END ArrowHead;
PROCEDURE DoCircles ( Object : ObjectPtrTyp ) ;
VAR store : ARRAY [0..255] OF CHAR;
start, end, i : INTEGER;
PROCEDURE Radian (angle : INTEGER; VAR str : ARRAY OF CHAR);
VAR rad : LONGREAL;
pre, aft : INTEGER;
tmp : ARRAY [0..19] OF CHAR;
BEGIN
(* TDI: rad := MathLib0.DegToRad(MathLib0.real(angle)); *)
rad := MathLib0.rad(MathLib0.real(angle));
pre := Diverses.round(rad);
rad := rad - MathLib0.real(pre);
aft := Diverses.round(rad * 1000.0);
Variablen.NumberToStr(pre, str);
(* AppendChar('.', str);*)
MagicStrings.Append('.', str);
Variablen.NumberToStr(aft, tmp);
MagicStrings.Append(tmp, str);
END Radian;
BEGIN
(*
PDebug.Into('Circles');
*)
GetPut(Object);
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Ellipse:
IF UseEEPiC THEN
IF Object^.Code[7]<>0 THEN
Part := "{\ellipse*{}{}}";
i := 11;
ELSE
Part := "{\ellipse{}{}}";
i := 10;
END;
IF NOT ((Object^.Code[5]=0) AND (Object^.Code[6]=360)) THEN
(* Ellipsen-Bogen, muessen wir simulieren... *)
WriteLn(Handle, "% eepic doesn't support elliptical arcs, sorry.");
OutLine := '';
ELSE
Variablen.SimpleValueToStr ( 2 * Object^.Code [ 4 ] , String ) ;
MagicStrings.Insert ( String , Part , i+2 ) ;
Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
MagicStrings.Insert ( String , Part , i ) ;
END;
ELSE
WriteLn(Handle, "% LaTeX doesn't support ellipses, sorry.");
OutLine := '';
END; |
Circle:
Part := "{\circle{}}" ;
Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
MagicStrings.Insert ( String , Part , 9 ) ; |
Disk:
Part := "{\circle*{}}" ;
Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
MagicStrings.Insert ( String , Part , 10 ) ; |
Oval:
Part := "{\oval(,)}" ;
Position ( Object^.Code [ 4 ] , String ) ;
IF String[0]<>0C THEN
MagicStrings.Insert ( String , Part, 9);
END;
Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
MagicStrings.Insert ( String , Part , 8 ) ;
MagicStrings.Insert ( String , Part , 7 ) ; |
Arc:
IF UseEEPiC THEN
Part := "{\arc{}{}{}}";
(* Wichtig: Start- und End-Winkel müssen in Bogengrad angegeben
werden. Ausserdem wird entgegen der sonst verwendeten Kon-
vention der Winkel IM Uhrzeigersinn gezeichnet. *)
Radian( (Object^.Code [ 4 ] + Object^.Code[5]) MOD 360 , String ) ;
MagicStrings.Insert ( String , Part , 10) ;
IF (Object^.Code[4] + Object^.Code[5]) >360 THEN
Radian( 360 + Object^.Code [ 4 ] , String ) ;
ELSE
Radian( Object^.Code [ 4 ] , String ) ;
END;
MagicStrings.Insert ( String , Part , 8) ;
Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
MagicStrings.Insert ( String , Part , 6 ) ;
ELSE
store := "% LaTeX doesn't support arcs, so I tried to simulate this one";
WriteLn ( Handle, store ) ;
MagicStrings.Assign ( OutLine, store);
start := Object^.Code [ 4 ];
end := start + Object^.Code [ 5 ];
IF (start MOD 90) > (90 DIV 2) THEN
start := ((start DIV 90)+1) * 90;
ELSE
start := (start DIV 90) * 90;
END;
IF (end MOD 90) > (90 DIV 2) THEN
end := ((end DIV 90)+1) * 90;
ELSE
end := (end DIV 90) * 90;
END;
IF start <> end THEN
i := start;
WHILE (i<end) DO
CASE (i MOD 360) DIV 90 OF
0 : (* 000..090 *) start := ORD(RightTop); |
1 : (* 090..180 *) start := ORD(LeftTop); |
2 : (* 180..270 *) start := ORD(LeftBot); |
3 : (* 270..360 *) start := ORD(RightBot); |
4 : (* 360..090 *) start := ORD(RightTop); |
ELSE
END;
Part := "{\oval(,)}" ;
Position ( start , String ) ;
IF String[0]<>0C THEN
MagicStrings.Insert ( String , Part, 9);
END;
Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
MagicStrings.Insert ( String , Part , 8 ) ;
MagicStrings.Insert ( String , Part , 7 ) ;
INC(i, 90);
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ;
MagicStrings.Assign ( store, OutLine);
END;
END;
OutLine := '';
END; |
END;
IF OutLine[0]<>0C THEN
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ;
END;
(*
PDebug.Leaving('Circles');
*)
END DoCircles;
PROCEDURE DoEpicText ( Object : ObjectPtrTyp ) ;
VAR BeginStr, EndStr, Jput : ARRAY [0..79] OF CHAR;
FirstX, FirstY, i : INTEGER;
PROCEDURE PutStr(x, y : INTEGER);
BEGIN
BasicGetPut(x, y);
MagicStrings.Append( Jput, String );
WriteLn(Handle, OutLine);
END PutStr;
BEGIN
IF (Object^.Code[9]<>0) AND (Object^.CPtr<>NIL) THEN
(* Es ist ein \jput-Environment *)
Jput[0] := '{';
FOR i:=0 TO Object^.Code[9]-1 DO
Jput[i+1] := Object^.CPtr^[i];
END;
Jput[Object^.Code[9]+1] := '}';
Jput[Object^.Code[9]+2] := 0C;
FirstX := Object^.Code[1]; FirstY := Object^.Code[2];
PutStr(FirstX, FirstY);
FOR i:=1 TO Object^.Code[3] DO
PutStr( FirstX + Object^.EPtr^[(i-1)*2 ],
FirstY + Object^.EPtr^[(i-1)*2 + 1]);
END;
END;
END DoEpicText;
PROCEDURE DoEpicArrow ( Object : ObjectPtrTyp ) ;
VAR FirstX, FirstY,
LastX, LastY,
FirstXplus1, FirstYplus1,
LastXminus1, LastYminus1 : INTEGER;
start, ende : BOOLEAN;
BEGIN
IF Object^.Code[5]<>0 THEN
start := Object^.Code[5] MOD 2 = 1;
ende := Object^.Code[5] DIV 2 = 1;
FirstX := Object^.Code[1];
FirstY := Object^.Code[2];
FirstXplus1 := FirstX + Object^.EPtr^[0];
FirstYplus1 := FirstY + Object^.EPtr^[1];
LastX := FirstX + Object^.EPtr^[2 * (Object^.Code[3]-1) ];
LastY := FirstY + Object^.EPtr^[2 * (Object^.Code[3]-1) + 1 ];
IF Object^.Code[3]>1 THEN
LastXminus1 := FirstX + Object^.EPtr^[2 * (Object^.Code[3]-2) ];
LastYminus1 := FirstY + Object^.EPtr^[2 * (Object^.Code[3]-2) + 1 ];
ELSE
LastXminus1 := FirstX;
LastYminus1 := FirstY;
END;
IF start THEN
ArrowHead(FirstX, FirstY, FirstXplus1, FirstYplus1, start, FALSE);
END;
IF ende THEN
ArrowHead(LastXminus1, LastYminus1, LastX, LastY, FALSE, ende);
END;
END;
END DoEpicArrow;
PROCEDURE DoEpic ( Object : ObjectPtrTyp ) ;
VAR BeginStr, EndStr, Jput : ARRAY [0..79] OF CHAR;
FirstX, FirstY, i : INTEGER;
PROCEDURE GetJPut(x, y : INTEGER);
BEGIN
(*
OutLine := '\jput(,)';
Variablen.SimpleValueToStr ( y , String ) ;
MagicStrings.Insert ( String , OutLine , 7 ) ;
Variablen.SimpleValueToStr ( x , String ) ;
MagicStrings.Insert ( String , OutLine , 6 ) ;
MagicStrings.Append ( Jput, OutLine);
*)
BasicGetPut(x, y);
MagicStrings.Insert('j', OutLine, 1);
END GetJPut;
PROCEDURE AddPt(x, y : INTEGER);
BEGIN
(*
IF (MagicStrings.Length(OutLine)>100) THEN
*)
IF (LENGTH(OutLine)>75) THEN
MagicStrings.Append ('% ', OutLine);
WriteLn(Handle, OutLine);
OutLine := ' ';
END;
Part := '(,)';
Variablen.SimpleValueToStr ( y , String ) ;
MagicStrings.Insert ( String , Part , 2 ) ;
Variablen.SimpleValueToStr ( x , String ) ;
MagicStrings.Insert ( String , Part , 1 ) ;
MagicStrings.Append ( Part, OutLine);
END AddPt;
BEGIN
(*
PDebug.Into('EPiC');
*)
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
EpicSolidLine,
EpicDottedLine,
EpicDashedLine : (* JP *)
DoEpicArrow(Object);
IF (Object^.Code[9]<>0) AND (Object^.CPtr<>NIL) THEN
(* Es ist ein \jput-Environment *)
Jput[0] := '{';
FOR i:=0 TO Object^.Code[9]-1 DO
Jput[i+1] := Object^.CPtr^[i];
END;
Jput[Object^.Code[9]+1] := '}';
Jput[Object^.Code[9]+2] := 0C;
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
EpicSolidLine :
BeginStr := '\begin{drawjoin}';
EndStr := '\end{drawjoin}'; |
EpicDottedLine :
(* fester Dot-Gap *)
BeginStr := '\begin{dottedjoin}{2}';
EndStr := '\end{dottedjoin}'; |
EpicDashedLine : (* JP *)
(* feste Dash-Länge *)
BeginStr := '\begin{dashjoin}{2}';
EndStr := '\end{dashjoin}'; |
ELSE
END;
WriteLn(Handle, BeginStr);
FirstX := Object^.Code[1]; FirstY := Object^.Code[2];
GetJPut(FirstX, FirstY);
WriteLn(Handle, OutLine);
FOR i:=1 TO Object^.Code[3] DO
GetJPut( FirstX + Object^.EPtr^[(i-1)*2 ],
FirstY + Object^.EPtr^[(i-1)*2 + 1]);
WriteLn(Handle, OutLine);
END;
WriteLn(Handle, EndStr);
ELSE
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Spline :
OutLine := '\spline'; |
EpicSolidLine :
OutLine := '\drawline'; |
EpicDottedLine :
(* fester Dot-Gap *)
OutLine := '\dottedline{2}';|
EpicDashedLine : (* JP *)
(* feste Dash-Länge *)
OutLine := '\dashline{2}';|
ELSE
END;
FirstX := Object^.Code[1]; FirstY := Object^.Code[2];
AddPt(FirstX, FirstY);
FOR i:=1 TO Object^.Code[3] DO
AddPt( FirstX + Object^.EPtr^[(i-1)*2 ],
FirstY + Object^.EPtr^[(i-1)*2 + 1]);
END;
WriteLn(Handle, OutLine);
END; |
EpicGrid : (* JP *)
GetPut(Object);
Part := '{\grid(,)(,)}';
Variablen.SimpleValueToStr ( Object^.Code [ 6 ] , String ) ;
MagicStrings.Insert ( String , Part , 11 ) ;
Variablen.SimpleValueToStr ( Object^.Code [ 5 ] , String ) ;
MagicStrings.Insert ( String , Part , 10 ) ;
Variablen.SimpleValueToStr ( Object^.Code [ 4 ] , String ) ;
MagicStrings.Insert ( String , Part , 8 ) ;
Variablen.SimpleValueToStr ( Object^.Code [ 3 ] , String ) ;
MagicStrings.Insert ( String , Part , 7 ) ;
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ; |
ELSE
END;
(*
PDebug.Leaving('EPiC');
*)
END DoEpic;
PROCEDURE DoBezier ( Object : ObjectPtrTyp ) ;
VAR BeziStr : ARRAY [0..127] OF CHAR;
x1, x2, x3, x4,
y1, y2, y3, y4,
px1, px2, px3, px4,
py1, py2, py3, py4 : INTEGER;
PROCEDURE WriteBezier (x1, y1, x2, y2, x3, y3 : INTEGER);
BEGIN
MagicStrings.Assign ( BeziStr, OutLine);
Part := "(,)" ; (* 1. Stützpunkt *)
Variablen.SimpleValueToStr ( y1 , String ) ;
MagicStrings.Insert ( String , Part , 2 ) ;
Variablen.SimpleValueToStr ( x1 , String ) ;
MagicStrings.Insert ( String , Part , 1 ) ;
MagicStrings.Append ( Part, OutLine);
Part := "(,)" ; (* Kontrollpunkt *)
Variablen.SimpleValueToStr ( y2, String ) ;
MagicStrings.Insert ( String , Part , 2 ) ;
Variablen.SimpleValueToStr ( x2, String ) ;
MagicStrings.Insert ( String , Part , 1 ) ;
MagicStrings.Append ( Part, OutLine);
Part := "(,)" ; (* 2. Stützpunkt *)
Variablen.SimpleValueToStr ( y3, String ) ;
MagicStrings.Insert ( String , Part , 2 ) ;
Variablen.SimpleValueToStr ( x3, String ) ;
MagicStrings.Insert ( String , Part , 1 ) ;
MagicStrings.Append ( Part, OutLine);
(* Und schlie₧lich ausgeben *)
WriteLn ( Handle, OutLine);
END WriteBezier;
BEGIN
(*
PDebug.Into('Bezier');
*)
(* Zahl der Punkte in Object^.Code[7] festgelegt *)
BeziStr := "\bezier{}" ;
Variablen.NumberToStr(Object^.Code[7], Part);
MagicStrings.Insert(Part, BeziStr, 8);
MagicStrings.Assign ( BeziStr, OutLine);
(* Jetzt noch die drei Koordinaten einfüllen *)
(* Nach Vereinbarung in Bezier sind dies die *)
(* Werte (1,2), (3,4) und (5,6). Die letzten *)
(* beiden Wertepaare sind Relativkoordinaten *)
(* zu (1,2) ! *)
(* In (7) steht die Zahl der Punkte *)
IF VAL(DrawObjectTyp, Object^.Code [0]) = Beziercurve THEN
WriteBezier(Object^.Code [ 1 ] , Object^.Code [ 2 ] ,
Object^.Code [ 1 ] + Object^.Code [ 3 ] ,
Object^.Code [ 2 ] + Object^.Code [ 4 ] ,
Object^.Code [ 1 ] + Object^.Code [ 5 ] ,
Object^.Code [ 2 ] + Object^.Code [ 6 ] );
ELSE
(* Bezierellipse, etwas komplizierter *)
(* Gegeben sind drei Punkte der umgebenden Raute *)
(* Der vierte Punkt lä₧t sich dann berechnen, damit *)
(* sind dann die vier Kontrollpkte gegeben. Die an- *)
(* deren Punkte sind dann die Seitenmitten. Insge- *)
(* samt kriegen wir also vier Bezierkurven. *)
x1 := Object^.Code[1]; y1 := Object^.Code[2];
x2 := Object^.Code[3] + x1; y2 := Object^.Code[4] + y1;
x3 := Object^.Code[5] + x1; y3 := Object^.Code[6] + y1;
x4 := x2 + (x1 - x2) + (x3 - x2);
y4 := y2 + (y1 - y2) + (y3 - y2);
px1 := (x1 + x2) DIV 2; py1 := (y1 + y2) DIV 2;
px2 := (x1 + x4) DIV 2; py2 := (y1 + y4) DIV 2;
px3 := (x3 + x4) DIV 2; py3 := (y3 + y4) DIV 2;
px4 := (x3 + x2) DIV 2; py4 := (y3 + y2) DIV 2;
WriteBezier(px1, py1, x1, y1, px2, py2);
WriteBezier(px2, py2, x4, y4, px3, py3);
WriteBezier(px3, py3, x3, y3, px4, py4);
WriteBezier(px4, py4, x2, y2, px1, py1);
END;
(*
PDebug.Leaving('Bezier');
*)
END (* of *) DoBezier ;
(* $D+*)
PROCEDURE DoLines ( Object : ObjectPtrTyp; Special : BOOLEAN ) ;
VAR i, j : INTEGER;
x1, y1, x2, y2, x3, y3,
xlen, ylen : MagicSys.lINTEGER;
PROCEDURE MakeLine(IsVector : BOOLEAN;
x, y,
xlen, ylen,
mx, my : INTEGER);
VAR inspos1, inspos2, inspos3 : CARDINAL;
BEGIN
IF IsVector THEN
Part := "{\vector(,){}}" ;
inspos1 := 12;
inspos2 := 10;
inspos3 := 9;
ELSE
Part := "{\line(,){}}" ;
inspos1 := 10;
inspos2 := 8;
inspos3 := 7;
END;
BasicGetPut(x, y);
IF xlen <> 0 THEN
Variablen.SimpleValueToStr ( xlen , String ) ;
ELSE
Variablen.SimpleValueToStr ( ylen , String ) ;
END ;
MagicStrings.Insert ( String , Part , inspos1 ) ;
Variablen.NumberToStr ( my , String ) ;
MagicStrings.Insert ( String , Part , inspos2 ) ;
Variablen.NumberToStr ( mx , String ) ;
MagicStrings.Insert ( String , Part , inspos3 ) ;
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ;
END MakeLine;
(* $D+*)
PROCEDURE MakeLine10(IsVector : BOOLEAN;
x, y,
xlen, ylen : MagicSys.lINTEGER;
mx, my : INTEGER);
VAR inspos1, inspos2, inspos3 : CARDINAL;
BEGIN
IF IsVector THEN
Part := "{\vector(,){}}" ;
inspos1 := 12;
inspos2 := 10;
inspos3 := 9;
ELSE
Part := "{\line(,){}}" ;
inspos1 := 10;
inspos2 := 8;
inspos3 := 7;
END;
Basic10GetPut(x, y);
IF xlen <> 0 THEN
Variablen.SimpleValue10ToStr ( xlen , String ) ;
ELSE
Variablen.SimpleValue10ToStr ( ylen , String ) ;
END ;
MagicStrings.Insert ( String , Part , inspos1 ) ;
Variablen.NumberToStr ( my , String ) ;
MagicStrings.Insert ( String , Part , inspos2 ) ;
Variablen.NumberToStr ( mx , String ) ;
MagicStrings.Insert ( String , Part , inspos3 ) ;
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ;
END MakeLine10;
(* $D-*)
BEGIN
(*
PDebug.Into('DoLines');
*)
GetPut(Object);
IF VAL(DrawObjectTyp, Object^.Code [0]) = Line THEN
IF NOT Special THEN
MakeLine(FALSE, Object^.Code[1], Object^.Code[2],
Object^.Code[3], Object^.Code[4],
Object^.Code[5], Object^.Code[6]);
END;
ELSE
IF Special THEN
IF Object^.Code[5] > 0 THEN
i := +1;
ELSE
i := -1;
END;
IF Object^.Code[6] > 0 THEN
j := +1;
ELSE
j := -1;
END;
ArrowHead(Object^.Code[1] , Object^.Code[2],
Object^.Code[1] + i * Object^.Code[3],
Object^.Code[2] + j * Object^.Code[4],
Object^.Code[7]<>0, TRUE);
ELSE
IF (Object^.Code[7] = 0) THEN
(* einfacher Pfeil *)
MakeLine(TRUE, Object^.Code[1], Object^.Code[2],
Object^.Code[3], Object^.Code[4],
Object^.Code[5], Object^.Code[6]);
ELSE
(* $D+*)
(*$? Clever:
MakeLine(TRUE, Object^.Code[1], Object^.Code[2],
Object^.Code[3], Object^.Code[4],
Object^.Code[5], Object^.Code[6]);
MakeLine(TRUE, Object^.Code[1], Object^.Code[2],
0, 0,
-Object^.Code[5],-Object^.Code[6]);
*)
(*$? NOT Clever:
xlen := LONG(Object^.Code[3]) * 5; (* *10 DIV 2 *)
ylen := LONG(Object^.Code[4]) * 5; (* *10 DIV 2 *)
x1 := LONG(Object^.Code[1]) * 10;
y1 := LONG(Object^.Code[2]) * 10;
IF Object^.Code[5] > 0 THEN
x3 := x1 + xlen;
ELSE
x3 := x1 - xlen;
END;
IF Object^.Code[6] > 0 THEN
y3 := y1 + ylen;
ELSE
y3 := y1 - ylen;
END;
MakeLine10(TRUE, x3, y3, xlen, ylen, +Object^.Code[5],+Object^.Code[6]);
MakeLine10(TRUE, x3, y3, xlen, ylen, -Object^.Code[5],-Object^.Code[6]);
*)
(* $D-*)
END;
END;
END;
(*
PDebug.Leaving('DoLines');
*)
END DoLines;
(* $D-*)
PROCEDURE DoBoxes ( Object : ObjectPtrTyp ) ;
VAR inspos1, inspos2, inspos3, inspos4 : INTEGER;
BEGIN
GetPut(Object);
Part := '';
CASE VAL(DrawObjectTyp, Object^.Code [ 0 ]) OF
Ovalbox:
IF NOT TextOnly THEN
Part := "{\oval(,)}" ;
inspos1 := 8;
inspos2 := 7;
END;|
Filledbox:
IF NOT TextOnly THEN
Part := '{\rule{\unitlength}{\unitlength}}';
inspos1 := 20;
inspos2 := 7;
END;|
ELSE
IF TextOnly OR (Object^.Code [ 6 ] = 1) THEN
Part := "{\makebox(,){}}" ;
inspos4 := 13;
inspos1 := 11;
inspos2 := 10;
ELSE
IF VAL(DrawObjectTyp, Object^.Code [0]) =
Framebox THEN
inspos2 := 11;
inspos1 := 12;
inspos4 := 14;
Part := "{\framebox(,){}}" ;
(** Angeblich geht es so besser...^^^
IF Object^.Code[9]=0 THEN (* kein Text *)
Part := "{\framebox(,)}" ;
ELSE
Part := "{\framebox(,){}}" ;
END;
**)
ELSE
(* Strichlänge fest : 2 mm *)
Part := "{\dashbox{2}(,){}}" ;
inspos4 := 16;
inspos1 := 14;
inspos2 := 13;
END;
END;
IF Object^.CPtr <> NIL THEN
GetText(Object, String);
MagicStrings.Insert ( String , Part , inspos4 ) ;
IF VAL(TextPosTyp, Object^.Code [ 5 ]) <>
Center THEN
Position ( Object^.Code [ 5 ] , String ) ;
IF String[0]<>0C THEN
MagicStrings.Insert ( String , Part , inspos4-1 ) ;
END ;
END ;
ELSE
IF TextOnly THEN
Part := '';
END;
END ;
END ;
IF Part[0]<>0C THEN
Variablen.SimpleValueToStr ( Object^.Code [ 4 ] , String ) ;
MagicStrings.Insert ( String , Part , inspos1 ) ;
Variablen.SimpleValueToStr ( Object^.Code [ 3 ] , String ) ;
MagicStrings.Insert ( String , Part , inspos2 ) ;
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ;
END;
END DoBoxes;
(**
PROCEDURE CheckEpicBezier ( FirstObject : ObjectPtrTyp;
VAR EpicCommands,
BezierCommands : BOOLEAN );
VAR Eres, Bres : BOOLEAN;
Object : ObjectPtrTyp;
BEGIN
Eres := FALSE;
Bres := FALSE;
Object := FirstObject ;
WHILE Object <> NIL DO
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Picture : IF Object^.Children<>NIL THEN
EpicCommands := Eres;
BezierCommands := Bres;
CheckEpicBezier(Object^.Children,
Eres, Bres);
Eres := Eres OR EpicCommands;
Bres := Bres OR BezierCommands;
END; |
Beziercurve,
Bezierellipse : Bres := TRUE; |
EpicSolidLine,
EpicDottedLine,
EpicGrid,
EpicDashedLine : Eres := TRUE; |
ELSE
END;
Object := Object^.Next;
END;
EpicCommands := Eres;
BezierCommands := Bres;
END CheckEpicBezier;
**)
PROCEDURE CompilePic(StartObj : ObjectPtrTyp;
XExt, YExt : INTEGER;
REF PreText,
PostText : ARRAY OF CHAR);
(* wird bei jedem Picture bzw. Subpicture aufgerufen, *)
(* evtl. auch rekursiv *)
VAR Object : ObjectPtrTyp;
TempStr: ARRAY [0..129] OF CHAR;
i : INTEGER;
lines : BOOLEAN;
BEGIN
TempStr := "\begin{picture}(,)" ;
Variablen.SimpleValueToStr ( YExt , String ) ;
MagicStrings.Insert ( String , TempStr , 17 ) ;
Variablen.SimpleValueToStr ( XExt , String ) ;
MagicStrings.Insert ( String , TempStr , 16 ) ;
MagicStrings.Assign ( PreText, OutLine);
MagicStrings.Append ( TempStr, OutLine);
WriteLn ( Handle, OutLine ) ;
IF Flag1 THEN
Flag1 := FALSE;
OutLine := '\put(0,0){\picfont\symbol{';
Variablen.NumberToStr (CommonData.MetaPAscii, TempStr);
MagicStrings.Append(TempStr, OutLine ) ;
MagicStrings.Append('}}', OutLine ) ;
WriteLn(Handle, OutLine);
END;
IF Flag2 THEN
Flag2 := FALSE;
OutLine := '\put(0,0){\special{CS!i ';
MagicStrings.Assign(CSName, TempStr);
(*$? FullCSName :
i := 0;
WHILE TempStr[i]<>0C DO
IF TempStr[i]='\' THEN TempStr[i] := '/'; END;
INC(i);
END;
*)
(*$? NOT FullCSName : GetFile.ReplacePath(TempStr, ''); *)
MagicStrings.Append(TempStr, OutLine ) ;
MagicStrings.Append('}}', OutLine ) ;
WriteLn(Handle, OutLine);
END;
Object := StartObj;
WHILE Object <> NIL DO
IF VAL(DrawObjectTyp, Object^.Code [0])<>
Picture THEN
IF ( Object^.Code [ 8 ] <> Width ) AND
( Object^.Code [ 8 ] <> 0 ) THEN
CASE Object^.Code [ 8 ] OF
1,2 : Width := 1;
WriteLn ( Handle, "\thinlines") ; |
3,4 : Width := 3;
WriteLn ( Handle, "\thicklines") ; |
5,6 : Width := 7;
WriteLn ( Handle, "\Thicklines") ; |
ELSE
Width := 1 ;
WriteLn ( Handle, "\thinlines") ;
END ;
END ;
END ;
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Picture :
GetPut(Object);
MagicStrings.Assign(OutLine, TempStr);
(* AppendChar('{', TempStr);*)
MagicStrings.Append('{', TempStr);
CompilePic(Object^.Children,
Object^.Code[3], Object^.Code[4],
TempStr, "}"); |
Beziercurve,
Bezierellipse :
IF NOT (TextOnly OR UseCSspecial) THEN
DoBezier( Object );
END; |
EpicSolidLine,
EpicDottedLine,
EpicDashedLine :
IF NOT (TextOnly OR UseCSspecial) THEN
DoEpic(Object);
ELSE
IF TextOnly THEN
DoEpicText(Object);
END;
IF UseCSspecial THEN
DoEpicArrow(Object);
END;
END; |
EpicGrid :
IF NOT (TextOnly OR UseCSspecial) THEN
DoEpic(Object);
END; |
Spline :
IF NOT (TextOnly OR UseCSspecial) THEN
IF UseEEPiC THEN
DoEpic(Object);
ELSE
WriteLn(Handle,
"% LaTeX doesn't support splines, sorry.");
END;
END; |
Text :
GetPut( Object );
Part := "{}" ;
GetText(Object, TempStr);
MagicStrings.Insert ( TempStr , Part , 1 ) ;
MagicStrings.Append ( Part , OutLine ) ;
WriteLn ( Handle, OutLine ) ;|
Line :
IF NOT (TextOnly OR UseCSspecial) THEN
DoLines ( Object, FALSE );
END; |
Arrow :
IF NOT (TextOnly OR UseCSspecial) THEN
DoLines ( Object, FALSE );
ELSE
IF UseCSspecial THEN
DoLines ( Object, TRUE);
END;
END; |
Circle, (* Durchmesser! *)
Arc,
Oval,
Ellipse:
IF NOT (TextOnly OR UseCSspecial) THEN
DoCircles ( Object );
END; |
Disk :
IF NOT (TextOnly OR (CommonData.Usespecial=cstrunk2)) THEN
DoCircles ( Object );
END; |
Filledbox,
Ovalbox,
Framebox,
Dashbox :
DoBoxes ( Object ); |
ELSE
END;
Object := Object^.Next ;
END ; (* WHILE *)
OutLine := "\end{picture}" ;
MagicStrings.Append ( PostText, OutLine);
WriteLn ( Handle, OutLine ) ;
END CompilePic;
PROCEDURE Do ( KomplettFile,
NurText : BOOLEAN ) ;
VAR anf , end : INTEGER ;
IncludeEpic,
IncludeEepic,
IncludeBezier : BOOLEAN;
i, j : INTEGER;
vst, nst : ARRAY [0..10] OF CHAR;
Comment : ARRAY [0..1] OF CHAR;
BEGIN
UseEEPiC := CommonData.Usespecial = tpic;
UseCSspecial := (CommonData.Usespecial = cstrunk1) OR
(CommonData.Usespecial = cstrunk2);
TextOnly := NurText;
Flag1 := NurText;
Flag2 := UseCSspecial;
Comment := '%';
IF Variablen.FirstObject^.Next<>NIL THEN
IncludeBezier := ObjectUtilities.ObjectExist(
ObjectSet{
Beziercurve,
Bezierellipse});
IncludeEepic := ObjectUtilities.ObjectExist(
ObjectSet{
Spline,
Ellipse,
Line,
Arc} );
IncludeEpic := ObjectUtilities.ObjectExist(
ObjectSet{
EpicSolidLine,
EpicDottedLine,
EpicDashedLine,
EpicGrid} );
IncludeEpic := IncludeEpic OR (IncludeEepic AND UseEEPiC);
IF NurText THEN
IncludeBezier := FALSE;
IncludeEpic := FALSE;
END;
IF UseCSspecial THEN
IncludeEpic := FALSE;
IncludeBezier := FALSE;
END;
IF CommonData.FileName [ 0 ] = 0C THEN
String := "PICTURE." ;
MagicStrings.Append(CommonData.Extensions[2], String);
ELSE
MagicStrings.Assign ( CommonData.FileName, String);
GetFile.ReplaceExtension(String, CommonData.Extensions[2]);
GetFile.RemovePath(String);
END ;
IF CommonData.LaTeXPath[0]<>0C THEN
MagicStrings.Assign(String, OutLine);
MagicStrings.Assign(CommonData.LaTeXPath, String);
MagicStrings.Append(OutLine, String);
END;
IF GetFile.Check(String) THEN
IF UseCSspecial THEN
MagicStrings.Assign(String, CSName);
GetFile.ReplaceExtension(CSName, CommonData.Extensions[8]);
GetFile.ReplacePath(CSName, CommonData.CSGPath);
BusyStart(CSName, FALSE);
WriteCSspecial(CSName);
BusyEnd;
END;
BusyStart(String, FALSE);
Rewrite(Handle, String);
Object := Variablen.FirstObject ;
IF KomplettFile THEN
i := 0;
IF IncludeEpic OR IncludeBezier THEN
IF NOT IncludeBezier THEN (* nur Epic *)
IF UseEEPiC THEN
InsertFile ( Handle, 'LATEX4.HDR' ); (* nur eepic *)
ELSE
InsertFile ( Handle, 'LATEX3.HDR' ); (* nur epic *)
END;
ELSE
IF NOT IncludeEpic THEN
InsertFile ( Handle, 'LATEX2.HDR' ); (* nur Bezier *)
ELSE
IF UseEEPiC THEN
InsertFile ( Handle, 'LATEX6.HDR' ); (* nur eepic *)
ELSE
InsertFile ( Handle, 'LATEX5.HDR' ); (* nur epic *)
END;
END;
END;
ELSE
InsertFile ( Handle, 'LATEX1.HDR' ); (* pures LaTeX *)
END;
END;
(**
IF KomplettFile THEN
WriteLn ( Handle, '% macropackage=lplain (Use LaTeX to trans- )');
WriteLn ( Handle, '% format=latex (late this document !)');
OutLine := '\documentstyle';
IF IncludeEpic OR IncludeBezier THEN
(* AppendChar ('[',OutLine);*)
MagicStrings.Append('[',OutLine);
IF IncludeBezier THEN
MagicStrings.Append ('bezier',OutLine);
IF IncludeEpic THEN
(* AppendChar (',',OutLine);*)
MagicStrings.Append(',',OutLine);
END;
END;
IF IncludeEpic THEN
MagicStrings.Append ('epic',OutLine);
IF UseEEPiC THEN
MagicStrings.Append (',eepic',OutLine);
END;
END;
(* AppendChar (']',OutLine);*)
MagicStrings.Append(']',OutLine);
END;
MagicStrings.Append ('{article}', OutLine);
WriteLn ( Handle, OutLine ) ;
END;
WriteLn ( Handle, Comment) ; (* Namen mit ausgeben *)
OutLine := "% " ;
MagicStrings.Append ( String , OutLine ) ;
WriteLn ( Handle, OutLine ) ;
IF KomplettFile THEN
WriteLn ( Handle, '% Mainfile for graphic-inclusion (created by TeX-Draw, JP-91)');
END;
**)
WriteLn(Handle, Comment);
IF IncludeBezier THEN
WriteLn ( Handle, "% You need 'bezier.sty'");
END;
IF IncludeEpic THEN
WriteLn ( Handle, "% You need 'epic.sty'");
IF UseEEPiC THEN
WriteLn ( Handle, "% You need 'eepic.sty'");
END;
END;
WriteLn ( Handle, Comment) ;
IF NurText THEN
OutLine := '\font\picfont = ';
IF CommonData.FileName [ 0 ] = 0C THEN
String := "picture" ;
ELSE
MagicStrings.Assign ( CommonData.FileName, String);
GetFile.RemovePath(String);
GetFile.ReplaceExtension(String, "");
IF String[0]<>0C THEN
(*
IF String[MagicStrings.Length(String)-1]='.' THEN
*)
IF String[LENGTH(String)-1]='.' THEN
(*
String[MagicStrings.Length(String)-1] := 0C;
*)
String[LENGTH(String)-1] := 0C;
END;
END;
END ;
MagicStrings.Append(String, OutLine);
WriteLn(Handle, OutLine);
END;
OutLine := "\setlength{\unitlength}{";
Variablen.FactorToStr(Part);
MagicStrings.Append ( Part, OutLine);
Variablen.UnitToStr(Part);
MagicStrings.Append ( Part, OutLine);
(* AppendChar ( '}', OutLine);*)
MagicStrings.Append( '}', OutLine);
WriteLn ( Handle, OutLine ) ;
IF NOT (UseEEPiC AND IncludeEpic) THEN
(* Eigene Definition von \Thicklines *)
WriteLn(Handle, '\makeatletter');
WriteLn(Handle, '\def\Thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw');
WriteLn(Handle, '\@wholewidth4\fontdimen8\tenln \@halfwidth .5\@wholewidth}');
WriteLn(Handle, '\makeatother');
END;
Width := 1 ; (* entspricht default \thinlines *)
CompilePic(Variablen.FirstObject^.Next,
Variablen.FirstObject^.Code[3],
Variablen.FirstObject^.Code[4],
'', '');
WriteLn ( Handle, Comment) ;
IF KomplettFile THEN
InsertFile ( Handle, 'LATEX.FTR' );
(*
WriteLn ( Handle, '\end{document}');
*)
END;
Close(Handle);
BusyEnd;
END;
END;
END Do ;
PROCEDURE InitSpecialArray;
VAR i : specialformat;
j : DrawObjectTyp;
BEGIN
FOR i := Normal TO Postscript DO
FOR j := Picture TO Ellipse DO
CompileEm[i, j] := FALSE;
END;
END;
FOR j := Picture TO Ellipse DO
CompileEm[Normal , j] := TRUE;
CompileEm[Eepic , j] := TRUE;
END;
FOR i := Normal TO Postscript DO
CompileEm[i, Picture ] := TRUE;
CompileEm[i, Text ] := TRUE;
END;
CompileEm[Cstrunk, Disk ] := TRUE;
CompileEm[Cstrunk, Arrow ] := TRUE;
CompileEm[Cstrunk, Filledbox ] := TRUE;
CompileEm[Cstrunk, Ovalbox ] := TRUE;
END InitSpecialArray;
BEGIN
InitSpecialArray;
END Compile .