home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Tex / td187src.lzh / COMPILE.I < prev    next >
Text File  |  1991-12-14  |  43KB  |  1,311 lines

  1. IMPLEMENTATION MODULE Compile ;
  2.  
  3. (* Erweitert um Beziercurve,    JP *)
  4. (* Erweitert um Epic-Kommandos, JP *)
  5.  
  6. FROM Dialoge   IMPORT BusyStart, BusyEnd;
  7. FROM FileIO    IMPORT Rewrite, Close, WriteLn;
  8. FROM File      IMPORT InsertFile;
  9. FROM CSspecial IMPORT WriteCSspecial;
  10. FROM Types     IMPORT TextPosTyp, DrawObjectTyp, ObjectSet,
  11.                       LatexSpecials,
  12.                       ObjectPtrTyp, specialformat;
  13. IMPORT CommonData ;
  14. IMPORT Diverses ;
  15. IMPORT GetFile;
  16. IMPORT ObjectUtilities ;
  17. IMPORT MagicStrings;
  18. IMPORT MagicSys;
  19. IMPORT Variablen ;
  20. IMPORT MathLib0 ;
  21.  
  22. (**
  23. IMPORT Debug;
  24. **)
  25.  
  26. (* Index 1 und 2 bezeichen immer den Referenzpunkt                         *)
  27. (* Index 8 zumeist die Liniendicke, Index 9 die Textlänge so vorhanden     *)
  28. (*      0         |   3    |   4   |   5   |   6   |   7   |   8   |   9   *)
  29. (* ---------------+--------+-------+---------------+-------+-------+------ *)
  30. (* Picture        | XExt   | YExt  |objekte|unitlen|       |       |       *)
  31. (* Text           |        |       |       |       |AlignFl|       |Textlen*)
  32. (* Line           |        |       |       |       |       |       |       *)
  33. (* Arrow          |        |       |       |       |       |       |       *)
  34. (* Circle         | Radius |       |       |       |       |       |       *)
  35. (* Disk           | Radius |       |       |       |       |       |       *)
  36. (* Oval           | Radius | Posit.|       |       |       |       |       *)
  37. (* Filledbox      | XExt   | XExt  |       |       |       |       |       *)
  38. (* Ovalbox        | XExt   | YExt  |       |       |       |       |       *)
  39. (* Framebox       | XExt   | YExt  |Textpos|MBxFlag|AlignFl|       |Textlen*)
  40. (* Dashbox        | XExt   | Yext  |Textpos|       |AlignFl|       |Textlen*)
  41. (* Beziercurve    |  X2    |  Y2   |  X3   |  Y3   |Points |       |       *)
  42. (* Bezierellipse  |  X2    |  Y2   |  X3   |  Y3   |Points |       |       *)
  43. (* EpicSolidLine  | Pts-1  |       |       |       |       |       |MarkTL *)
  44. (* EpicDottedLine | Pts-1  |       |       |       |       |       |   "   *)
  45. (* EpicDashedLine | Pts-1  |       |       |       |       |       |   "   *)
  46. (* EpicGrid       | Xext   | YExt  |DeltaX |DeltaY |       |       |       *)
  47. (* Arc            | Radius |StartA.|DeltaA.|       |       |       |       *)
  48. (* Spline         | Pts-1  |       |       |       |       |       |       *)
  49. (* Ellipse        | XRadius|YRadius|StartA.|DeltaA.|       |       |       *)
  50.  
  51. CONST FullCSName = TRUE; (* Beim special-Befehl Pfad mit übergeben    *)
  52. CONST Clever     = TRUE; (* Doppelpfeile durch einfaches hinzufügen   *)
  53.                          (* einer zweiten Pfeilspitze erzeugen (TRUE) *)
  54.                          (* oder durch 2 Pfeile darstellen (FALSE)?   *)
  55.  
  56. VAR OutLine, Part,
  57.     CSName,
  58.     String         : ARRAY [0..255] OF CHAR ;
  59.     Handle,
  60.     i , j          : INTEGER ;
  61.     Object         : ObjectPtrTyp ;
  62.     Width          : INTEGER ;  (* Liniendicke *)
  63.     TextOnly       : BOOLEAN ;
  64.     Flag1          : BOOLEAN ;
  65.     Flag2          : BOOLEAN ;
  66.     UseCSspecial,
  67.     UseEEPiC       : BOOLEAN ;
  68.     CompileEm      : ARRAY specialformat,
  69.                            DrawObjectTyp OF BOOLEAN;
  70.  
  71. (**
  72. PROCEDURE AppendChar(c : CHAR; VAR target : ARRAY OF CHAR);
  73. VAR temp : ARRAY [0..1] OF CHAR;
  74. BEGIN
  75.   temp[0] := c;
  76.   temp[1] := 0C;
  77.   MagicStrings.Append(temp, target);
  78. END AppendChar;
  79. **)
  80.  
  81. (**********************************************************)
  82.  
  83. PROCEDURE Position ( Pos : INTEGER ; VAR Str : ARRAY OF CHAR ) ;
  84.  
  85. BEGIN
  86.   CASE VAL(TextPosTyp, Pos) OF
  87.     LeftTop  : MagicStrings.Assign ( '[tl]', Str); |
  88.     Left     : MagicStrings.Assign ( '[l]', Str); |
  89.     LeftBot  : MagicStrings.Assign ( '[bl]', Str); |
  90.     Top      : MagicStrings.Assign ( '[t]', Str); |
  91.     Bottom   : MagicStrings.Assign ( '[b]', Str); |
  92.     RightTop : MagicStrings.Assign ( '[tr]', Str); |
  93.     Right    : MagicStrings.Assign ( '[r]', Str); |
  94.     RightBot : MagicStrings.Assign ( '[br]', Str); |
  95.   ELSE
  96.     MagicStrings.Assign ( '', Str);
  97.   END;
  98. END Position ;
  99.  
  100. PROCEDURE BasicGetPut(x, y : INTEGER);
  101. BEGIN
  102.   OutLine := "\put(,)" ; (* Anfangskoordinaten *)
  103.   Variablen.SimpleValueToStr ( y , String ) ;
  104.   MagicStrings.Insert ( String , OutLine , 6 ) ;
  105.   Variablen.SimpleValueToStr ( x , String ) ;
  106.   MagicStrings.Insert ( String , OutLine , 5 ) ;
  107. END BasicGetPut;
  108.  
  109. PROCEDURE Basic10GetPut(x, y : MagicSys.lINTEGER);
  110. BEGIN
  111.   OutLine := "\put(,)" ; (* Anfangskoordinaten *)
  112.   Variablen.SimpleValue10ToStr ( y , String ) ;
  113.   MagicStrings.Insert ( String , OutLine , 6 ) ;
  114.   Variablen.SimpleValue10ToStr ( x , String ) ;
  115.   MagicStrings.Insert ( String , OutLine , 5 ) ;
  116. END Basic10GetPut;
  117.  
  118. PROCEDURE GetPut ( Object : ObjectPtrTyp ) ;
  119. BEGIN
  120.   BasicGetPut(Object^.Code[1], Object^.Code[2]);
  121. END GetPut;
  122.  
  123. PROCEDURE GetText(    Object : ObjectPtrTyp;
  124.                   VAR result : ARRAY OF CHAR) ;
  125. VAR temp   : ARRAY [0..255] OF CHAR;
  126.     insert : ARRAY [0..19] OF CHAR;
  127.     align  : INTEGER;
  128.     cr     : BOOLEAN;
  129.     i, j, len : INTEGER;
  130. BEGIN
  131.   temp  := '';
  132.   cr    := FALSE;
  133.   len   := Object^.Code[9];
  134.   align := Object^.Code[7];
  135.   FOR i := 0 TO len-1 DO
  136.     temp [ i ] := Object^.CPtr^ [ i ] ;
  137.   END ;
  138.   temp [ len ] := 0C ;
  139.   FOR i:=0 TO len-2 DO
  140.     IF (temp[i]='\') AND (temp[i+1]='\') THEN
  141.       cr := TRUE;
  142.     END;
  143.   END;
  144.   IF cr THEN
  145.     insert := '';
  146.     CASE align OF
  147.      0: (* center     *) insert := '\shortstack{'; |
  148.      1: (* leftalign  *) insert := '\shortstack[l]{'; |
  149.      2: (* rightalign *) insert := '\shortstack[r]{'; |
  150.      ELSE
  151.     END;
  152.     IF insert[0]<>0C THEN
  153.       MagicStrings.Insert(insert, temp, 0);
  154. (*      AppendChar ('}', temp);*)
  155.       MagicStrings.Append('}', temp);
  156.     END;
  157.   END;
  158.   MagicStrings.Assign ( temp, result);
  159. END GetText;
  160.  
  161. PROCEDURE ArrowHead(x1, y1, x2, y2 : INTEGER;
  162.                     start, end     : BOOLEAN);
  163. (* LaTeX erlaubt die Steigungspaare von (-4..+4,-4..+4) wobei
  164.    die Werte keinen gemeinsamen Teiler haben dürfen *)
  165. VAR mx, my : INTEGER;
  166.     dx, dy : INTEGER;
  167.     i, j   : INTEGER;
  168.     a1, e1,
  169.     a2, e2 : INTEGER;
  170.     slope  : ARRAY [-4..+4],[-4..+4] OF LONGREAL;
  171.     testslope : LONGREAL;
  172.     delta     : LONGREAL;
  173. BEGIN
  174.   FOR mx := -4 TO 4 DO
  175.     FOR my := -4 TO 4 DO
  176.       IF mx<>0 THEN
  177.         slope[mx,my] := MathLib0.real(my) / MathLib0.real(mx) ;
  178.        ELSE
  179.         IF mx>=0 THEN
  180.           slope[mx,my] :=  +9999.99
  181.          ELSE
  182.           slope[mx,my] :=  -9999.99
  183.         END;
  184.       END;
  185.     END;
  186.   END;
  187.  
  188.   (* Also: zunaechst einmal Steigung bestimmen *)
  189.   dx := x2 - x1;
  190.   dy := y2 - y1;
  191.   IF dx<0 THEN
  192.     a1 := -4;
  193.     e1 := 0;
  194.    ELSE
  195.     a1 := 0;
  196.     e1 := +4;
  197.   END;
  198.   IF dy<0 THEN
  199.     a2 := -4;
  200.     e2 := 0;
  201.    ELSE
  202.     a2 := 0;
  203.     e2 := +4;
  204.   END;
  205.   (* Sonderfälle abfangen *)
  206.   IF dx = 0 THEN
  207.     mx := 0;
  208.     IF dy<0 THEN
  209.       my := -1;
  210.      ELSE
  211.       my := +1;
  212.     END;
  213.    ELSIF dy = 0 THEN
  214.     my := 0;
  215.     IF dx<0 THEN
  216.       mx := -1;
  217.      ELSE
  218.       mx := +1;
  219.     END;
  220.    ELSE
  221.     testslope := MathLib0.real(dy) / MathLib0.real(dx);
  222.     (* So welcher Wert liegt nahe *)
  223.     mx := 0;
  224.     my := 0;
  225.     delta := 9999.99;
  226.     FOR i:=a1 TO e1 DO
  227.       FOR j:=a2 TO e2 DO
  228.         IF ABS(slope[i,j] - testslope)<delta THEN
  229.           delta := ABS(slope[i,j] - testslope);
  230.           mx := i;
  231.           my := j;
  232.         END;
  233.       END;
  234.     END;
  235.   END;
  236.   IF NOT ((mx=0) AND (my=0)) THEN
  237.     (* So jetzt eventuell Bruch reduzieren *)
  238.     IF (mx<>0) AND (my<>0) THEN
  239.       WHILE ((mx MOD 2) = 0) AND ((my MOD 2) =0) DO
  240.         (* Es können nur Vielfache von 2 sein *)
  241.         mx := mx DIV 2;
  242.         my := my DIV 2;
  243.       END;
  244.     END;
  245.   END;
  246.   IF start THEN
  247.     BasicGetPut(x1, y1);
  248.     Part := '{\vector(,){0}}';
  249.     Variablen.NumberToStr ( -my , String ) ;
  250.     MagicStrings.Insert ( String , Part , 10 ) ;
  251.     Variablen.NumberToStr ( -mx , String ) ;
  252.     MagicStrings.Insert ( String , Part , 9 ) ;
  253.     MagicStrings.Append ( Part , OutLine ) ;
  254.     WriteLn ( Handle, OutLine ) ;
  255.   END;
  256.   IF end THEN
  257.     BasicGetPut(x2, y2);
  258.     Part := '{\vector(,){0}}';
  259.     Variablen.NumberToStr ( my , String ) ;
  260.     MagicStrings.Insert ( String , Part , 10 ) ;
  261.     Variablen.NumberToStr ( mx , String ) ;
  262.     MagicStrings.Insert ( String , Part , 9 ) ;
  263.     MagicStrings.Append ( Part , OutLine ) ;
  264.     WriteLn ( Handle, OutLine ) ;
  265.   END;
  266. END ArrowHead;
  267.  
  268. PROCEDURE DoCircles ( Object : ObjectPtrTyp ) ;
  269. VAR store : ARRAY [0..255] OF CHAR;
  270.     start, end, i : INTEGER;
  271.  
  272.    PROCEDURE Radian (angle : INTEGER; VAR str : ARRAY OF CHAR);
  273.    VAR rad : LONGREAL;
  274.        pre, aft : INTEGER;
  275.        tmp : ARRAY [0..19] OF CHAR;
  276.    BEGIN
  277. (* TDI:     rad := MathLib0.DegToRad(MathLib0.real(angle)); *)
  278.      rad := MathLib0.rad(MathLib0.real(angle));
  279.      pre := Diverses.round(rad);
  280.      rad := rad - MathLib0.real(pre);
  281.      aft := Diverses.round(rad * 1000.0);
  282.      Variablen.NumberToStr(pre, str);
  283. (*     AppendChar('.', str);*)
  284.      MagicStrings.Append('.', str);
  285.      Variablen.NumberToStr(aft, tmp);
  286.      MagicStrings.Append(tmp, str);
  287.    END Radian;
  288.  
  289. BEGIN
  290. (*
  291.   PDebug.Into('Circles');
  292. *)
  293.   GetPut(Object);
  294.   CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
  295.    Ellipse:
  296.       IF UseEEPiC THEN
  297.         IF Object^.Code[7]<>0 THEN
  298.          Part := "{\ellipse*{}{}}";
  299.          i := 11;
  300.         ELSE
  301.          Part := "{\ellipse{}{}}";
  302.          i := 10;
  303.         END;
  304.         IF NOT ((Object^.Code[5]=0) AND (Object^.Code[6]=360)) THEN
  305.           (* Ellipsen-Bogen, muessen wir simulieren... *)
  306.           WriteLn(Handle, "% eepic doesn't support elliptical arcs, sorry.");
  307.           OutLine := '';
  308.          ELSE
  309.           Variablen.SimpleValueToStr ( 2 * Object^.Code [ 4 ] , String ) ;
  310.           MagicStrings.Insert ( String , Part , i+2 ) ;
  311.           Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
  312.           MagicStrings.Insert ( String , Part , i ) ;
  313.         END;
  314.        ELSE
  315.         WriteLn(Handle, "% LaTeX doesn't support ellipses, sorry.");
  316.         OutLine := '';
  317.       END; |
  318.    Circle:
  319.       Part := "{\circle{}}" ;
  320.       Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
  321.       MagicStrings.Insert ( String , Part , 9 ) ; |
  322.    Disk:
  323.       Part := "{\circle*{}}" ;
  324.       Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
  325.       MagicStrings.Insert ( String , Part , 10 ) ; |
  326.    Oval:
  327.       Part := "{\oval(,)}" ;
  328.       Position ( Object^.Code [ 4 ] , String ) ;
  329.       IF String[0]<>0C THEN
  330.         MagicStrings.Insert ( String , Part, 9);
  331.       END;
  332.       Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
  333.       MagicStrings.Insert ( String , Part , 8 ) ;
  334.       MagicStrings.Insert ( String , Part , 7 ) ; |
  335.    Arc:
  336.       IF UseEEPiC THEN
  337.         Part := "{\arc{}{}{}}";
  338.         (* Wichtig: Start- und End-Winkel müssen in Bogengrad angegeben
  339.            werden. Ausserdem wird entgegen der sonst verwendeten Kon-
  340.            vention der Winkel IM Uhrzeigersinn gezeichnet. *)
  341.         Radian( (Object^.Code [ 4 ] + Object^.Code[5]) MOD 360 , String ) ;
  342.         MagicStrings.Insert ( String , Part , 10) ;
  343.         IF (Object^.Code[4] + Object^.Code[5]) >360 THEN
  344.           Radian( 360 + Object^.Code [ 4 ] , String ) ;
  345.          ELSE
  346.           Radian( Object^.Code [ 4 ] , String ) ;
  347.         END;
  348.         MagicStrings.Insert ( String , Part , 8) ;
  349.         Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
  350.         MagicStrings.Insert ( String , Part , 6 ) ;
  351.        ELSE
  352.         store := "% LaTeX doesn't support arcs, so I tried to simulate this one";
  353.         WriteLn ( Handle, store ) ;
  354.         MagicStrings.Assign ( OutLine, store);
  355.         start := Object^.Code [ 4 ];
  356.         end   := start + Object^.Code [ 5 ];
  357.         IF (start MOD 90) > (90 DIV 2) THEN
  358.           start := ((start DIV 90)+1) * 90;
  359.          ELSE
  360.           start := (start DIV 90) * 90;
  361.         END;
  362.         IF (end MOD 90) > (90 DIV 2) THEN
  363.           end := ((end DIV 90)+1) * 90;
  364.          ELSE
  365.           end := (end DIV 90) * 90;
  366.         END;
  367.         IF start <> end THEN
  368.           i := start;
  369.           WHILE (i<end) DO
  370.             CASE (i MOD 360) DIV 90 OF
  371.              0 : (* 000..090 *) start := ORD(RightTop); |
  372.              1 : (* 090..180 *) start := ORD(LeftTop); |
  373.              2 : (* 180..270 *) start := ORD(LeftBot); |
  374.              3 : (* 270..360 *) start := ORD(RightBot); |
  375.              4 : (* 360..090 *) start := ORD(RightTop); |
  376.             ELSE
  377.             END;
  378.             Part := "{\oval(,)}" ;
  379.             Position ( start , String ) ;
  380.             IF String[0]<>0C THEN
  381.               MagicStrings.Insert ( String , Part, 9);
  382.             END;
  383.             Variablen.SimpleValueToStr ( 2 * Object^.Code [ 3 ] , String ) ;
  384.             MagicStrings.Insert ( String , Part , 8 ) ;
  385.             MagicStrings.Insert ( String , Part , 7 ) ;
  386.             INC(i, 90);
  387.             MagicStrings.Append ( Part , OutLine ) ;
  388.             WriteLn ( Handle, OutLine ) ;
  389.             MagicStrings.Assign ( store, OutLine);
  390.           END;
  391.         END;
  392.         OutLine := '';
  393.       END; |
  394.   END;
  395.   IF OutLine[0]<>0C THEN
  396.     MagicStrings.Append ( Part , OutLine ) ;
  397.     WriteLn ( Handle, OutLine ) ;
  398.   END;
  399. (*
  400.   PDebug.Leaving('Circles');
  401. *)
  402. END DoCircles;
  403.  
  404. PROCEDURE DoEpicText ( Object  : ObjectPtrTyp ) ;
  405. VAR BeginStr, EndStr, Jput : ARRAY [0..79] OF CHAR;
  406.     FirstX, FirstY, i      : INTEGER;
  407.  
  408.     PROCEDURE PutStr(x, y : INTEGER);
  409.     BEGIN
  410.       BasicGetPut(x, y);
  411.       MagicStrings.Append( Jput, String );
  412.       WriteLn(Handle, OutLine);
  413.     END PutStr;
  414.  
  415. BEGIN
  416.   IF (Object^.Code[9]<>0) AND (Object^.CPtr<>NIL) THEN
  417.     (* Es ist ein \jput-Environment *)
  418.  
  419.     Jput[0] := '{';
  420.     FOR i:=0 TO Object^.Code[9]-1 DO
  421.       Jput[i+1] := Object^.CPtr^[i];
  422.     END;
  423.     Jput[Object^.Code[9]+1] := '}';
  424.     Jput[Object^.Code[9]+2] := 0C;
  425.     FirstX := Object^.Code[1]; FirstY := Object^.Code[2];
  426.     PutStr(FirstX, FirstY);
  427.     FOR i:=1 TO Object^.Code[3] DO
  428.       PutStr( FirstX + Object^.EPtr^[(i-1)*2    ],
  429.               FirstY + Object^.EPtr^[(i-1)*2 + 1]);
  430.     END;
  431.   END;
  432. END DoEpicText;
  433.  
  434. PROCEDURE DoEpicArrow ( Object  : ObjectPtrTyp ) ;
  435. VAR FirstX,      FirstY,
  436.     LastX,       LastY,
  437.     FirstXplus1, FirstYplus1,
  438.     LastXminus1, LastYminus1 : INTEGER;
  439.     start, ende : BOOLEAN;
  440. BEGIN
  441.   IF Object^.Code[5]<>0 THEN
  442.     start  := Object^.Code[5] MOD 2 = 1;
  443.     ende   := Object^.Code[5] DIV 2 = 1;
  444.     FirstX := Object^.Code[1];
  445.     FirstY := Object^.Code[2];
  446.     FirstXplus1 := FirstX + Object^.EPtr^[0];
  447.     FirstYplus1 := FirstY + Object^.EPtr^[1];
  448.     LastX  := FirstX + Object^.EPtr^[2 * (Object^.Code[3]-1)     ];
  449.     LastY  := FirstY + Object^.EPtr^[2 * (Object^.Code[3]-1) + 1 ];
  450.     IF Object^.Code[3]>1 THEN
  451.       LastXminus1  := FirstX + Object^.EPtr^[2 * (Object^.Code[3]-2)     ];
  452.       LastYminus1  := FirstY + Object^.EPtr^[2 * (Object^.Code[3]-2) + 1 ];
  453.      ELSE
  454.       LastXminus1  := FirstX;
  455.       LastYminus1  := FirstY;
  456.     END;
  457.     IF start THEN
  458.       ArrowHead(FirstX, FirstY, FirstXplus1, FirstYplus1, start, FALSE);
  459.     END;
  460.     IF ende THEN
  461.       ArrowHead(LastXminus1, LastYminus1, LastX, LastY, FALSE, ende);
  462.     END;
  463.   END;
  464. END DoEpicArrow;
  465.  
  466. PROCEDURE DoEpic ( Object  : ObjectPtrTyp ) ;
  467. VAR BeginStr, EndStr, Jput : ARRAY [0..79] OF CHAR;
  468.     FirstX, FirstY, i      : INTEGER;
  469.  
  470.     PROCEDURE GetJPut(x, y : INTEGER);
  471.     BEGIN
  472. (*
  473.       OutLine := '\jput(,)';
  474.       Variablen.SimpleValueToStr ( y , String ) ;
  475.       MagicStrings.Insert ( String , OutLine , 7 ) ;
  476.       Variablen.SimpleValueToStr ( x , String ) ;
  477.       MagicStrings.Insert ( String , OutLine , 6 ) ;
  478.       MagicStrings.Append ( Jput, OutLine);
  479. *)
  480.       BasicGetPut(x, y);
  481.       MagicStrings.Insert('j', OutLine, 1);
  482.     END GetJPut;
  483.  
  484.     PROCEDURE AddPt(x, y : INTEGER);
  485.     BEGIN
  486. (*
  487.       IF (MagicStrings.Length(OutLine)>100) THEN
  488. *)
  489.       IF (LENGTH(OutLine)>75) THEN
  490.         MagicStrings.Append ('% ', OutLine);
  491.         WriteLn(Handle, OutLine);
  492.         OutLine := '    ';
  493.       END;
  494.       Part := '(,)';
  495.       Variablen.SimpleValueToStr ( y , String ) ;
  496.       MagicStrings.Insert ( String , Part , 2 ) ;
  497.       Variablen.SimpleValueToStr ( x , String ) ;
  498.       MagicStrings.Insert ( String , Part , 1 ) ;
  499.       MagicStrings.Append ( Part, OutLine);
  500.     END AddPt;
  501.  
  502. BEGIN
  503. (*
  504.   PDebug.Into('EPiC');
  505. *)
  506.   CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
  507.     EpicSolidLine,
  508.     EpicDottedLine,
  509.     EpicDashedLine : (* JP *)
  510.        DoEpicArrow(Object);
  511.        IF (Object^.Code[9]<>0) AND (Object^.CPtr<>NIL) THEN
  512.          (* Es ist ein \jput-Environment *)
  513.  
  514.          Jput[0] := '{';
  515.          FOR i:=0 TO Object^.Code[9]-1 DO
  516.            Jput[i+1] := Object^.CPtr^[i];
  517.          END;
  518.          Jput[Object^.Code[9]+1] := '}';
  519.          Jput[Object^.Code[9]+2] := 0C;
  520.  
  521.          CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
  522.            EpicSolidLine  :
  523.              BeginStr := '\begin{drawjoin}';
  524.              EndStr   := '\end{drawjoin}'; |
  525.            EpicDottedLine :
  526.              (* fester Dot-Gap *)
  527.              BeginStr := '\begin{dottedjoin}{2}';
  528.              EndStr   := '\end{dottedjoin}'; |
  529.            EpicDashedLine : (* JP *)
  530.              (* feste Dash-Länge *)
  531.              BeginStr := '\begin{dashjoin}{2}';
  532.              EndStr   := '\end{dashjoin}'; |
  533.           ELSE
  534.          END;
  535.          WriteLn(Handle, BeginStr);
  536.          FirstX := Object^.Code[1]; FirstY := Object^.Code[2];
  537.          GetJPut(FirstX, FirstY);
  538.          WriteLn(Handle, OutLine);
  539.          FOR i:=1 TO Object^.Code[3] DO
  540.            GetJPut( FirstX + Object^.EPtr^[(i-1)*2    ],
  541.                     FirstY + Object^.EPtr^[(i-1)*2 + 1]);
  542.            WriteLn(Handle, OutLine);
  543.          END;
  544.          WriteLn(Handle, EndStr);
  545.         ELSE
  546.          CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
  547.            Spline         :
  548.              OutLine := '\spline'; |
  549.            EpicSolidLine  :
  550.              OutLine := '\drawline'; |
  551.            EpicDottedLine :
  552.              (* fester Dot-Gap *)
  553.              OutLine := '\dottedline{2}';|
  554.            EpicDashedLine : (* JP *)
  555.              (* feste Dash-Länge *)
  556.              OutLine := '\dashline{2}';|
  557.           ELSE
  558.          END;
  559.          FirstX := Object^.Code[1]; FirstY := Object^.Code[2];
  560.          AddPt(FirstX, FirstY);
  561.          FOR i:=1 TO Object^.Code[3] DO
  562.            AddPt( FirstX + Object^.EPtr^[(i-1)*2    ],
  563.                   FirstY + Object^.EPtr^[(i-1)*2 + 1]);
  564.          END;
  565.          WriteLn(Handle, OutLine);
  566.        END;   |
  567.     EpicGrid : (* JP *)
  568.        GetPut(Object);
  569.        Part := '{\grid(,)(,)}';
  570.        Variablen.SimpleValueToStr ( Object^.Code [ 6 ] , String ) ;
  571.        MagicStrings.Insert ( String , Part , 11 ) ;
  572.        Variablen.SimpleValueToStr ( Object^.Code [ 5 ] , String ) ;
  573.        MagicStrings.Insert ( String , Part , 10 ) ;
  574.        Variablen.SimpleValueToStr ( Object^.Code [ 4 ] , String ) ;
  575.        MagicStrings.Insert ( String , Part , 8 ) ;
  576.        Variablen.SimpleValueToStr ( Object^.Code [ 3 ] , String ) ;
  577.        MagicStrings.Insert ( String , Part , 7 ) ;
  578.        MagicStrings.Append ( Part , OutLine ) ;
  579.        WriteLn ( Handle, OutLine ) ; |
  580.    ELSE
  581.   END;
  582. (*
  583.   PDebug.Leaving('EPiC');
  584. *)
  585. END DoEpic;
  586.  
  587. PROCEDURE DoBezier ( Object : ObjectPtrTyp ) ;
  588. VAR BeziStr : ARRAY [0..127] OF CHAR;
  589.     x1, x2, x3, x4,
  590.     y1, y2, y3, y4,
  591.     px1, px2, px3, px4,
  592.     py1, py2, py3, py4 : INTEGER;
  593.  
  594.     PROCEDURE WriteBezier (x1, y1, x2, y2, x3, y3 : INTEGER);
  595.     BEGIN
  596.       MagicStrings.Assign ( BeziStr, OutLine);
  597.       Part := "(,)" ; (* 1. Stützpunkt *)
  598.       Variablen.SimpleValueToStr ( y1 , String ) ;
  599.       MagicStrings.Insert ( String , Part , 2 ) ;
  600.       Variablen.SimpleValueToStr ( x1 , String ) ;
  601.       MagicStrings.Insert ( String , Part , 1 ) ;
  602.       MagicStrings.Append ( Part, OutLine);
  603.  
  604.       Part := "(,)" ; (* Kontrollpunkt *)
  605.       Variablen.SimpleValueToStr ( y2, String ) ;
  606.       MagicStrings.Insert ( String , Part , 2 ) ;
  607.       Variablen.SimpleValueToStr ( x2, String ) ;
  608.       MagicStrings.Insert ( String , Part , 1 ) ;
  609.       MagicStrings.Append ( Part, OutLine);
  610.  
  611.       Part := "(,)" ; (* 2. Stützpunkt *)
  612.       Variablen.SimpleValueToStr ( y3, String ) ;
  613.       MagicStrings.Insert ( String , Part , 2 ) ;
  614.       Variablen.SimpleValueToStr ( x3, String ) ;
  615.       MagicStrings.Insert ( String , Part , 1 ) ;
  616.       MagicStrings.Append ( Part, OutLine);
  617.  
  618.       (* Und schlie₧lich ausgeben *)
  619.       WriteLn ( Handle, OutLine);
  620.  
  621.     END WriteBezier;
  622.  
  623. BEGIN
  624. (*
  625.   PDebug.Into('Bezier');
  626. *)
  627.   (* Zahl der Punkte in Object^.Code[7] festgelegt *)
  628.   BeziStr := "\bezier{}" ;
  629.   Variablen.NumberToStr(Object^.Code[7], Part);
  630.   MagicStrings.Insert(Part, BeziStr, 8);
  631.   MagicStrings.Assign ( BeziStr, OutLine);
  632.   (* Jetzt noch die drei Koordinaten einfüllen *)
  633.   (* Nach Vereinbarung in Bezier sind dies die *)
  634.   (* Werte (1,2), (3,4) und (5,6). Die letzten *)
  635.   (* beiden Wertepaare sind Relativkoordinaten *)
  636.   (* zu (1,2) !                                *)
  637.   (* In (7) steht die Zahl der Punkte          *)
  638.   IF VAL(DrawObjectTyp, Object^.Code [0]) = Beziercurve THEN
  639.     WriteBezier(Object^.Code [ 1 ] , Object^.Code [ 2 ] ,
  640.                   Object^.Code [ 1 ] + Object^.Code [ 3 ] ,
  641.                   Object^.Code [ 2 ] + Object^.Code [ 4 ] ,
  642.                   Object^.Code [ 1 ] + Object^.Code [ 5 ] ,
  643.                   Object^.Code [ 2 ] + Object^.Code [ 6 ] );
  644.   ELSE
  645.     (* Bezierellipse, etwas komplizierter                *)
  646.     (* Gegeben sind drei Punkte der umgebenden Raute     *)
  647.     (* Der vierte Punkt lä₧t sich dann berechnen, damit  *)
  648.     (* sind dann die vier Kontrollpkte gegeben. Die an-  *)
  649.     (* deren Punkte sind dann die Seitenmitten. Insge-   *)
  650.     (* samt kriegen wir also vier Bezierkurven.          *)
  651.     x1 := Object^.Code[1];      y1 := Object^.Code[2];
  652.     x2 := Object^.Code[3] + x1; y2 := Object^.Code[4] + y1;
  653.     x3 := Object^.Code[5] + x1; y3 := Object^.Code[6] + y1;
  654.     x4 := x2 + (x1 - x2) + (x3 - x2);
  655.     y4 := y2 + (y1 - y2) + (y3 - y2);
  656.     px1 := (x1 + x2) DIV 2; py1 := (y1 + y2) DIV 2;
  657.     px2 := (x1 + x4) DIV 2; py2 := (y1 + y4) DIV 2;
  658.     px3 := (x3 + x4) DIV 2; py3 := (y3 + y4) DIV 2;
  659.     px4 := (x3 + x2) DIV 2; py4 := (y3 + y2) DIV 2;
  660.     WriteBezier(px1, py1, x1, y1, px2, py2);
  661.     WriteBezier(px2, py2, x4, y4, px3, py3);
  662.     WriteBezier(px3, py3, x3, y3, px4, py4);
  663.     WriteBezier(px4, py4, x2, y2, px1, py1);
  664.   END;
  665. (*
  666.   PDebug.Leaving('Bezier');
  667. *)
  668. END (* of *) DoBezier ;
  669.  
  670.  
  671. (* $D+*)
  672. PROCEDURE DoLines ( Object : ObjectPtrTyp; Special : BOOLEAN ) ;
  673. VAR i, j : INTEGER;
  674.     x1, y1, x2, y2, x3, y3,
  675.     xlen, ylen : MagicSys.lINTEGER;
  676.  
  677.    PROCEDURE MakeLine(IsVector     : BOOLEAN;
  678.                       x, y,
  679.                       xlen, ylen,
  680.                       mx, my       : INTEGER);
  681.    VAR inspos1, inspos2, inspos3 : CARDINAL;
  682.    BEGIN
  683.      IF IsVector THEN
  684.        Part := "{\vector(,){}}" ;
  685.        inspos1 := 12;
  686.        inspos2 := 10;
  687.        inspos3 :=  9;
  688.       ELSE
  689.        Part := "{\line(,){}}" ;
  690.        inspos1 := 10;
  691.        inspos2 := 8;
  692.        inspos3 := 7;
  693.      END;
  694.      BasicGetPut(x, y);
  695.      IF xlen <> 0 THEN
  696.        Variablen.SimpleValueToStr ( xlen , String ) ;
  697.      ELSE
  698.        Variablen.SimpleValueToStr ( ylen , String ) ;
  699.      END ;
  700.      MagicStrings.Insert ( String , Part , inspos1 ) ;
  701.      Variablen.NumberToStr ( my , String ) ;
  702.      MagicStrings.Insert ( String , Part , inspos2 ) ;
  703.      Variablen.NumberToStr ( mx , String ) ;
  704.      MagicStrings.Insert ( String , Part , inspos3 ) ;
  705.      MagicStrings.Append ( Part , OutLine ) ;
  706.      WriteLn ( Handle, OutLine ) ;
  707.    END MakeLine;
  708. (* $D+*)
  709.    PROCEDURE MakeLine10(IsVector     : BOOLEAN;
  710.                         x, y,
  711.                         xlen, ylen   : MagicSys.lINTEGER;
  712.                         mx, my       : INTEGER);
  713.    VAR inspos1, inspos2, inspos3 : CARDINAL;
  714.    BEGIN
  715.      IF IsVector THEN
  716.        Part := "{\vector(,){}}" ;
  717.        inspos1 := 12;
  718.        inspos2 := 10;
  719.        inspos3 :=  9;
  720.       ELSE
  721.        Part := "{\line(,){}}" ;
  722.        inspos1 := 10;
  723.        inspos2 := 8;
  724.        inspos3 := 7;
  725.      END;
  726.      Basic10GetPut(x, y);
  727.      IF xlen <> 0 THEN
  728.        Variablen.SimpleValue10ToStr ( xlen , String ) ;
  729.      ELSE
  730.        Variablen.SimpleValue10ToStr ( ylen , String ) ;
  731.      END ;
  732.      MagicStrings.Insert ( String , Part , inspos1 ) ;
  733.      Variablen.NumberToStr ( my , String ) ;
  734.      MagicStrings.Insert ( String , Part , inspos2 ) ;
  735.      Variablen.NumberToStr ( mx , String ) ;
  736.      MagicStrings.Insert ( String , Part , inspos3 ) ;
  737.      MagicStrings.Append ( Part , OutLine ) ;
  738.      WriteLn ( Handle, OutLine ) ;
  739.    END MakeLine10;
  740. (* $D-*)
  741.  
  742. BEGIN
  743. (*
  744.   PDebug.Into('DoLines');
  745. *)
  746.   GetPut(Object);
  747.   IF VAL(DrawObjectTyp, Object^.Code [0]) = Line THEN
  748.     IF NOT Special THEN
  749.       MakeLine(FALSE, Object^.Code[1], Object^.Code[2],
  750.                       Object^.Code[3], Object^.Code[4],
  751.                       Object^.Code[5], Object^.Code[6]);
  752.     END;
  753.    ELSE
  754.     IF Special THEN
  755.       IF Object^.Code[5] > 0 THEN
  756.         i := +1;
  757.        ELSE
  758.         i := -1;
  759.       END;
  760.       IF Object^.Code[6] > 0 THEN
  761.         j := +1;
  762.        ELSE
  763.         j := -1;
  764.       END;
  765.       ArrowHead(Object^.Code[1] , Object^.Code[2],
  766.                 Object^.Code[1] + i * Object^.Code[3],
  767.                 Object^.Code[2] + j * Object^.Code[4],
  768.                 Object^.Code[7]<>0, TRUE);
  769.      ELSE
  770.       IF (Object^.Code[7] = 0) THEN
  771.        (* einfacher Pfeil *)
  772.         MakeLine(TRUE, Object^.Code[1], Object^.Code[2],
  773.                        Object^.Code[3], Object^.Code[4],
  774.                        Object^.Code[5], Object^.Code[6]);
  775.        ELSE
  776.   (* $D+*)
  777.     (*$? Clever:
  778.         MakeLine(TRUE, Object^.Code[1], Object^.Code[2],
  779.                        Object^.Code[3], Object^.Code[4],
  780.                        Object^.Code[5], Object^.Code[6]);
  781.         MakeLine(TRUE, Object^.Code[1], Object^.Code[2],
  782.                        0,               0,
  783.                       -Object^.Code[5],-Object^.Code[6]);
  784.     *)
  785.     (*$? NOT Clever:
  786.         xlen := LONG(Object^.Code[3]) * 5; (* *10 DIV 2 *)
  787.         ylen := LONG(Object^.Code[4]) * 5; (* *10 DIV 2 *)
  788.         x1   := LONG(Object^.Code[1]) * 10;
  789.         y1   := LONG(Object^.Code[2]) * 10;
  790.  
  791.         IF Object^.Code[5] > 0 THEN
  792.           x3 := x1 +  xlen;
  793.          ELSE
  794.           x3 := x1 -  xlen;
  795.         END;
  796.         IF Object^.Code[6] > 0 THEN
  797.           y3 := y1 +  ylen;
  798.          ELSE
  799.           y3 := y1 -  ylen;
  800.         END;
  801.         MakeLine10(TRUE, x3, y3, xlen, ylen, +Object^.Code[5],+Object^.Code[6]);
  802.         MakeLine10(TRUE, x3, y3, xlen, ylen, -Object^.Code[5],-Object^.Code[6]);
  803.     *)
  804.   (* $D-*)
  805.       END;
  806.     END;
  807.   END;
  808. (*
  809.   PDebug.Leaving('DoLines');
  810. *)
  811. END DoLines;
  812. (* $D-*)
  813.  
  814. PROCEDURE DoBoxes ( Object : ObjectPtrTyp ) ;
  815. VAR inspos1, inspos2, inspos3, inspos4 : INTEGER;
  816. BEGIN
  817.   GetPut(Object);
  818.   Part := '';
  819.   CASE VAL(DrawObjectTyp, Object^.Code [ 0 ]) OF
  820.    Ovalbox:
  821.     IF NOT TextOnly THEN
  822.       Part := "{\oval(,)}" ;
  823.       inspos1 := 8;
  824.       inspos2 := 7;
  825.     END;|
  826.   Filledbox:
  827.     IF NOT TextOnly THEN
  828.       Part := '{\rule{\unitlength}{\unitlength}}';
  829.       inspos1 := 20;
  830.       inspos2 := 7;
  831.     END;|
  832.   ELSE
  833.     IF TextOnly OR (Object^.Code [ 6 ] = 1) THEN
  834.       Part := "{\makebox(,){}}" ;
  835.       inspos4 := 13;
  836.       inspos1 := 11;
  837.       inspos2 := 10;
  838.      ELSE
  839.       IF VAL(DrawObjectTyp, Object^.Code [0]) =
  840.              Framebox THEN
  841.         inspos2 := 11;
  842.         inspos1 := 12;
  843.         inspos4 := 14;
  844.         Part := "{\framebox(,){}}" ;
  845. (** Angeblich geht es so besser...^^^
  846.         IF Object^.Code[9]=0 THEN (* kein Text *)
  847.           Part := "{\framebox(,)}" ;
  848.          ELSE
  849.           Part := "{\framebox(,){}}" ;
  850.         END;
  851. **)
  852.        ELSE
  853.         (* Strichlänge fest : 2 mm *)
  854.         Part := "{\dashbox{2}(,){}}" ;
  855.         inspos4 := 16;
  856.         inspos1 := 14;
  857.         inspos2 := 13;
  858.       END;
  859.     END;
  860.     IF Object^.CPtr <> NIL THEN
  861.       GetText(Object, String);
  862.       MagicStrings.Insert ( String , Part , inspos4 ) ;
  863.       IF VAL(TextPosTyp, Object^.Code [ 5 ]) <>
  864.          Center THEN
  865.         Position ( Object^.Code [ 5 ] , String ) ;
  866.         IF String[0]<>0C THEN
  867.           MagicStrings.Insert ( String , Part , inspos4-1 ) ;
  868.         END ;
  869.       END ;
  870.      ELSE
  871.       IF TextOnly THEN
  872.         Part := '';
  873.       END;
  874.     END ;
  875.   END ;
  876.   IF Part[0]<>0C THEN
  877.     Variablen.SimpleValueToStr ( Object^.Code [ 4 ] , String ) ;
  878.     MagicStrings.Insert ( String , Part , inspos1 ) ;
  879.     Variablen.SimpleValueToStr ( Object^.Code [ 3 ] , String ) ;
  880.     MagicStrings.Insert ( String , Part , inspos2 ) ;
  881.     MagicStrings.Append ( Part , OutLine ) ;
  882.     WriteLn ( Handle, OutLine ) ;
  883.   END;
  884. END DoBoxes;
  885.  
  886. (**
  887. PROCEDURE CheckEpicBezier ( FirstObject : ObjectPtrTyp;
  888.                             VAR EpicCommands,
  889.                                 BezierCommands : BOOLEAN );
  890. VAR Eres, Bres : BOOLEAN;
  891.     Object : ObjectPtrTyp;
  892. BEGIN
  893.   Eres := FALSE;
  894.   Bres := FALSE;
  895.   Object := FirstObject ;
  896.   WHILE Object <> NIL DO
  897.     CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
  898.      Picture        : IF Object^.Children<>NIL THEN
  899.                                         EpicCommands   := Eres;
  900.                                         BezierCommands := Bres;
  901.                                         CheckEpicBezier(Object^.Children,
  902.                                                         Eres, Bres);
  903.                                         Eres := Eres OR EpicCommands;
  904.                                         Bres := Bres OR BezierCommands;
  905.                                       END; |
  906.      Beziercurve,
  907.      Bezierellipse  : Bres := TRUE; |
  908.      EpicSolidLine,
  909.      EpicDottedLine,
  910.      EpicGrid,
  911.      EpicDashedLine : Eres := TRUE; |
  912.      ELSE
  913.     END;
  914.     Object := Object^.Next;
  915.   END;
  916.   EpicCommands   := Eres;
  917.   BezierCommands := Bres;
  918. END CheckEpicBezier;
  919. **)
  920.  
  921. PROCEDURE CompilePic(StartObj     : ObjectPtrTyp;
  922.                      XExt, YExt   : INTEGER;
  923.                      REF PreText,
  924.                          PostText : ARRAY OF CHAR);
  925. (* wird bei jedem Picture bzw. Subpicture aufgerufen, *)
  926. (* evtl. auch rekursiv                                *)
  927. VAR Object : ObjectPtrTyp;
  928.     TempStr: ARRAY [0..129] OF CHAR;
  929.     i      : INTEGER;
  930.     lines  : BOOLEAN;
  931. BEGIN
  932.   TempStr := "\begin{picture}(,)" ;
  933.   Variablen.SimpleValueToStr ( YExt , String ) ;
  934.   MagicStrings.Insert ( String , TempStr , 17 ) ;
  935.   Variablen.SimpleValueToStr ( XExt , String ) ;
  936.   MagicStrings.Insert ( String , TempStr , 16 ) ;
  937.   MagicStrings.Assign ( PreText, OutLine);
  938.   MagicStrings.Append ( TempStr, OutLine);
  939.   WriteLn ( Handle, OutLine ) ;
  940.  
  941.   IF Flag1 THEN
  942.     Flag1 := FALSE;
  943.     OutLine := '\put(0,0){\picfont\symbol{';
  944.     Variablen.NumberToStr (CommonData.MetaPAscii, TempStr);
  945.     MagicStrings.Append(TempStr, OutLine ) ;
  946.     MagicStrings.Append('}}', OutLine ) ;
  947.     WriteLn(Handle, OutLine);
  948.   END;
  949.   IF Flag2 THEN
  950.     Flag2 := FALSE;
  951.     OutLine := '\put(0,0){\special{CS!i ';
  952.     MagicStrings.Assign(CSName, TempStr);
  953. (*$?     FullCSName :
  954.     i := 0;
  955.     WHILE TempStr[i]<>0C DO
  956.       IF TempStr[i]='\' THEN TempStr[i] := '/'; END;
  957.       INC(i);
  958.     END;
  959. *)
  960. (*$? NOT FullCSName : GetFile.ReplacePath(TempStr, ''); *)
  961.     MagicStrings.Append(TempStr, OutLine ) ;
  962.     MagicStrings.Append('}}', OutLine ) ;
  963.     WriteLn(Handle, OutLine);
  964.   END;
  965.   Object := StartObj;
  966.  
  967.   WHILE Object <> NIL DO
  968.  
  969.     IF VAL(DrawObjectTyp, Object^.Code [0])<>
  970.        Picture THEN
  971.       IF ( Object^.Code [ 8 ] <> Width ) AND
  972.          ( Object^.Code [ 8 ] <> 0 ) THEN
  973.         CASE Object^.Code [ 8 ] OF
  974.          1,2 : Width := 1;
  975.                WriteLn ( Handle, "\thinlines") ; |
  976.          3,4 : Width := 3;
  977.                WriteLn ( Handle, "\thicklines") ; |
  978.          5,6 : Width := 7;
  979.                WriteLn ( Handle, "\Thicklines") ; |
  980.         ELSE
  981.           Width := 1 ;
  982.           WriteLn ( Handle, "\thinlines") ;
  983.         END ;
  984.       END ;
  985.     END ;
  986.  
  987.     CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
  988.      Picture :
  989.        GetPut(Object);
  990.        MagicStrings.Assign(OutLine, TempStr);
  991. (*       AppendChar('{', TempStr);*)
  992.        MagicStrings.Append('{', TempStr);
  993.        CompilePic(Object^.Children,
  994.                   Object^.Code[3], Object^.Code[4],
  995.                   TempStr, "}"); |
  996.      Beziercurve,
  997.      Bezierellipse :
  998.        IF NOT (TextOnly OR UseCSspecial) THEN
  999.          DoBezier( Object );
  1000.        END; |
  1001.      EpicSolidLine,
  1002.      EpicDottedLine,
  1003.      EpicDashedLine :
  1004.        IF NOT (TextOnly OR UseCSspecial) THEN
  1005.          DoEpic(Object);
  1006.         ELSE
  1007.          IF TextOnly THEN
  1008.            DoEpicText(Object);
  1009.          END;
  1010.          IF UseCSspecial THEN
  1011.            DoEpicArrow(Object);
  1012.          END;
  1013.        END; |
  1014.      EpicGrid :
  1015.        IF NOT (TextOnly OR UseCSspecial) THEN
  1016.          DoEpic(Object);
  1017.        END; |
  1018.      Spline :
  1019.        IF NOT (TextOnly OR UseCSspecial) THEN
  1020.          IF UseEEPiC THEN
  1021.            DoEpic(Object);
  1022.           ELSE
  1023.            WriteLn(Handle,
  1024.             "% LaTeX doesn't support splines, sorry.");
  1025.          END;
  1026.        END; |
  1027.      Text :
  1028.        GetPut( Object );
  1029.        Part := "{}" ;
  1030.        GetText(Object, TempStr);
  1031.        MagicStrings.Insert ( TempStr , Part , 1 ) ;
  1032.        MagicStrings.Append ( Part , OutLine ) ;
  1033.        WriteLn ( Handle, OutLine ) ;|
  1034.      Line  :
  1035.        IF NOT (TextOnly OR UseCSspecial) THEN
  1036.          DoLines ( Object, FALSE );
  1037.        END; |
  1038.      Arrow :
  1039.        IF NOT (TextOnly OR UseCSspecial) THEN
  1040.          DoLines ( Object, FALSE );
  1041.         ELSE
  1042.          IF UseCSspecial THEN
  1043.            DoLines ( Object, TRUE);
  1044.          END;
  1045.        END; |
  1046.      Circle,   (* Durchmesser! *)
  1047.      Arc,
  1048.      Oval,
  1049.      Ellipse:
  1050.        IF NOT (TextOnly OR UseCSspecial) THEN
  1051.          DoCircles ( Object );
  1052.        END; |
  1053.      Disk :
  1054.        IF NOT (TextOnly OR (CommonData.Usespecial=cstrunk2)) THEN
  1055.          DoCircles ( Object );
  1056.        END; |
  1057.      Filledbox,
  1058.      Ovalbox,
  1059.      Framebox,
  1060.      Dashbox :
  1061.        DoBoxes ( Object ); |
  1062.     ELSE
  1063.     END;
  1064.  
  1065.     Object := Object^.Next ;
  1066.  
  1067.   END ; (* WHILE *)
  1068.  
  1069.   OutLine := "\end{picture}" ;
  1070.   MagicStrings.Append ( PostText, OutLine);
  1071.   WriteLn ( Handle, OutLine ) ;
  1072. END CompilePic;
  1073.  
  1074. PROCEDURE Do ( KomplettFile,
  1075.                NurText      : BOOLEAN ) ;
  1076. VAR anf , end     : INTEGER ;
  1077.     IncludeEpic,
  1078.     IncludeEepic,
  1079.     IncludeBezier : BOOLEAN;
  1080.     i, j          : INTEGER;
  1081.     vst, nst      : ARRAY [0..10] OF CHAR;
  1082.     Comment       : ARRAY [0..1] OF CHAR;
  1083. BEGIN
  1084.   UseEEPiC     := CommonData.Usespecial  = tpic;
  1085.   UseCSspecial := (CommonData.Usespecial = cstrunk1) OR
  1086.                   (CommonData.Usespecial = cstrunk2);
  1087.   TextOnly := NurText;
  1088.   Flag1    := NurText;
  1089.   Flag2    := UseCSspecial;
  1090.   Comment  := '%';
  1091.   IF Variablen.FirstObject^.Next<>NIL THEN
  1092.     IncludeBezier := ObjectUtilities.ObjectExist(
  1093.                        ObjectSet{
  1094.                          Beziercurve,
  1095.                          Bezierellipse});
  1096.     IncludeEepic  := ObjectUtilities.ObjectExist(
  1097.                        ObjectSet{
  1098.                          Spline,
  1099.                          Ellipse,
  1100.                          Line,
  1101.                          Arc} );
  1102.     IncludeEpic   := ObjectUtilities.ObjectExist(
  1103.                        ObjectSet{
  1104.                          EpicSolidLine,
  1105.                          EpicDottedLine,
  1106.                          EpicDashedLine,
  1107.                          EpicGrid} );
  1108.     IncludeEpic := IncludeEpic OR (IncludeEepic AND UseEEPiC);
  1109.     IF NurText THEN
  1110.       IncludeBezier := FALSE;
  1111.       IncludeEpic   := FALSE;
  1112.     END;
  1113.     IF UseCSspecial THEN
  1114.       IncludeEpic   := FALSE;
  1115.       IncludeBezier := FALSE;
  1116.     END;
  1117.     IF CommonData.FileName [ 0 ] = 0C THEN
  1118.       String := "PICTURE." ;
  1119.       MagicStrings.Append(CommonData.Extensions[2], String);
  1120.     ELSE
  1121.       MagicStrings.Assign ( CommonData.FileName, String);
  1122.       GetFile.ReplaceExtension(String, CommonData.Extensions[2]);
  1123.       GetFile.RemovePath(String);
  1124.     END ;
  1125.     IF CommonData.LaTeXPath[0]<>0C THEN
  1126.       MagicStrings.Assign(String, OutLine);
  1127.       MagicStrings.Assign(CommonData.LaTeXPath, String);
  1128.       MagicStrings.Append(OutLine, String);
  1129.     END;
  1130.     IF GetFile.Check(String) THEN
  1131.  
  1132.       IF UseCSspecial THEN
  1133.         MagicStrings.Assign(String, CSName);
  1134.         GetFile.ReplaceExtension(CSName, CommonData.Extensions[8]);
  1135.         GetFile.ReplacePath(CSName, CommonData.CSGPath);
  1136.         BusyStart(CSName, FALSE);
  1137.         WriteCSspecial(CSName);
  1138.         BusyEnd;
  1139.       END;
  1140.  
  1141.       BusyStart(String, FALSE);
  1142.  
  1143.       Rewrite(Handle, String);
  1144.       Object := Variablen.FirstObject ;
  1145.  
  1146.       IF KomplettFile THEN
  1147.         i := 0;
  1148.         IF IncludeEpic OR IncludeBezier THEN
  1149.           IF NOT IncludeBezier THEN (* nur Epic *)
  1150.             IF UseEEPiC THEN
  1151.               InsertFile ( Handle, 'LATEX4.HDR' ); (* nur eepic *)
  1152.              ELSE
  1153.               InsertFile ( Handle, 'LATEX3.HDR' ); (* nur epic *)
  1154.             END;
  1155.            ELSE
  1156.             IF NOT IncludeEpic THEN
  1157.               InsertFile ( Handle, 'LATEX2.HDR' ); (* nur Bezier *)
  1158.              ELSE
  1159.               IF UseEEPiC THEN
  1160.                 InsertFile ( Handle, 'LATEX6.HDR' ); (* nur eepic *)
  1161.                ELSE
  1162.                 InsertFile ( Handle, 'LATEX5.HDR' ); (* nur epic *)
  1163.               END;
  1164.             END;
  1165.           END;
  1166.          ELSE
  1167.           InsertFile ( Handle, 'LATEX1.HDR' ); (* pures LaTeX *)
  1168.         END;
  1169.       END;
  1170. (**
  1171.       IF KomplettFile THEN
  1172.         WriteLn ( Handle, '% macropackage=lplain (Use LaTeX to trans- )');
  1173.         WriteLn ( Handle, '% format=latex        (late this document !)');
  1174.         OutLine := '\documentstyle';
  1175.         IF IncludeEpic OR IncludeBezier THEN
  1176. (*          AppendChar ('[',OutLine);*)
  1177.           MagicStrings.Append('[',OutLine);
  1178.           IF IncludeBezier THEN
  1179.             MagicStrings.Append ('bezier',OutLine);
  1180.             IF IncludeEpic THEN
  1181. (*              AppendChar (',',OutLine);*)
  1182.               MagicStrings.Append(',',OutLine);
  1183.             END;
  1184.           END;
  1185.           IF IncludeEpic THEN
  1186.             MagicStrings.Append ('epic',OutLine);
  1187.             IF UseEEPiC THEN
  1188.               MagicStrings.Append (',eepic',OutLine);
  1189.             END;
  1190.           END;
  1191. (*          AppendChar (']',OutLine);*)
  1192.           MagicStrings.Append(']',OutLine);
  1193.         END;
  1194.         MagicStrings.Append ('{article}', OutLine);
  1195.         WriteLn ( Handle, OutLine ) ;
  1196.       END;
  1197.  
  1198.       WriteLn ( Handle, Comment) ;                     (* Namen mit ausgeben *)
  1199.  
  1200.       OutLine := "% " ;
  1201.       MagicStrings.Append ( String , OutLine ) ;
  1202.       WriteLn ( Handle, OutLine ) ;
  1203.       IF KomplettFile THEN
  1204.         WriteLn ( Handle, '% Mainfile for graphic-inclusion (created by TeX-Draw, JP-91)');
  1205.       END;
  1206. **)
  1207.  
  1208.       WriteLn(Handle, Comment);
  1209.  
  1210.       IF IncludeBezier THEN
  1211.         WriteLn ( Handle, "% You need 'bezier.sty'");
  1212.       END;
  1213.       IF IncludeEpic THEN
  1214.         WriteLn ( Handle, "% You need 'epic.sty'");
  1215.         IF UseEEPiC THEN
  1216.           WriteLn ( Handle, "% You need 'eepic.sty'");
  1217.         END;
  1218.       END;
  1219.       WriteLn ( Handle, Comment) ;
  1220.  
  1221.       IF NurText THEN
  1222.         OutLine := '\font\picfont = ';
  1223.         IF CommonData.FileName [ 0 ] = 0C THEN
  1224.           String := "picture" ;
  1225.          ELSE
  1226.           MagicStrings.Assign ( CommonData.FileName, String);
  1227.           GetFile.RemovePath(String);
  1228.           GetFile.ReplaceExtension(String, "");
  1229.           IF String[0]<>0C THEN
  1230. (*
  1231.             IF String[MagicStrings.Length(String)-1]='.' THEN
  1232. *)
  1233.             IF String[LENGTH(String)-1]='.' THEN
  1234. (*
  1235.               String[MagicStrings.Length(String)-1] := 0C;
  1236. *)
  1237.               String[LENGTH(String)-1] := 0C;
  1238.             END;
  1239.           END;
  1240.         END ;
  1241.         MagicStrings.Append(String, OutLine);
  1242.         WriteLn(Handle, OutLine);
  1243.       END;
  1244.       OutLine := "\setlength{\unitlength}{";
  1245.  
  1246.       Variablen.FactorToStr(Part);
  1247.       MagicStrings.Append ( Part, OutLine);
  1248.       Variablen.UnitToStr(Part);
  1249.       MagicStrings.Append ( Part, OutLine);
  1250.  
  1251. (*      AppendChar ( '}', OutLine);*)
  1252.       MagicStrings.Append( '}', OutLine);
  1253.       WriteLn ( Handle, OutLine ) ;
  1254.       
  1255.       IF NOT (UseEEPiC AND IncludeEpic) THEN
  1256.         (* Eigene Definition von \Thicklines *)
  1257.         WriteLn(Handle, '\makeatletter');
  1258.         WriteLn(Handle, '\def\Thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw');
  1259.         WriteLn(Handle, '\@wholewidth4\fontdimen8\tenln \@halfwidth .5\@wholewidth}');
  1260.         WriteLn(Handle, '\makeatother');
  1261.       END; 
  1262.  
  1263.       Width := 1 ;  (* entspricht default \thinlines *)
  1264.  
  1265.       CompilePic(Variablen.FirstObject^.Next,
  1266.                  Variablen.FirstObject^.Code[3],
  1267.                  Variablen.FirstObject^.Code[4],
  1268.                  '', '');
  1269.       WriteLn ( Handle, Comment) ;
  1270.       IF KomplettFile THEN
  1271.         InsertFile ( Handle, 'LATEX.FTR' );
  1272. (*        
  1273.         WriteLn ( Handle, '\end{document}');
  1274. *)
  1275.       END;
  1276.  
  1277.       Close(Handle);
  1278.  
  1279.       BusyEnd;
  1280.     END;
  1281.   END;
  1282.  
  1283. END Do ;
  1284.  
  1285. PROCEDURE InitSpecialArray;
  1286. VAR i : specialformat;
  1287.     j : DrawObjectTyp;
  1288. BEGIN
  1289.   FOR i := Normal TO Postscript DO
  1290.     FOR j := Picture TO Ellipse DO
  1291.       CompileEm[i, j] := FALSE;
  1292.     END;
  1293.   END;
  1294.   FOR j := Picture TO Ellipse DO
  1295.     CompileEm[Normal , j] := TRUE;
  1296.     CompileEm[Eepic  , j] := TRUE;
  1297.   END;
  1298.   FOR i := Normal TO Postscript DO
  1299.     CompileEm[i, Picture       ] := TRUE;
  1300.     CompileEm[i, Text          ] := TRUE;
  1301.   END;
  1302.   CompileEm[Cstrunk, Disk      ] := TRUE;
  1303.   CompileEm[Cstrunk, Arrow     ] := TRUE;
  1304.   CompileEm[Cstrunk, Filledbox ] := TRUE;
  1305.   CompileEm[Cstrunk, Ovalbox   ] := TRUE;
  1306. END InitSpecialArray;
  1307.  
  1308. BEGIN
  1309.   InitSpecialArray;
  1310. END Compile .
  1311.