\documentclass[12pt]{amsart} \usepackage{amsfonts,a4} \usepackage{ebezier} \newcommand{\D}{\displaystyle} \renewcommand{\thefootnote}{\fnsymbol{footnote}} \setlength{\headsep}{25pt} \setlength{\parskip}{1.5ex plus0.5ex minus0.5ex} \setlength{\parindent}{0em} \pagestyle{myheadings} \begin{document} \markboth{ \;\; \hrulefill \: Herbert M\"oller \,\hrulefill} {\hrulefill \; How to Generate \LaTeX{} Picture Environments Using the GaPFilL Method \,\hrulefill \;\quad } \vspace*{-15mm} \begin{center} \Large{\textbf{How to Generate \LaTeX{} Picture Environments Using the GaPFilL Method}}\\[7mm] \large{Herbert M\"oller\footnote[1]{\mbox{\rule[0mm]{0mm}{5mm}}\copyright{} Copyright 2006 by H. M\"oller (\texttt{mollerh@math.uni-muenster.de}). This documentation may be distributed and/or modified under the conditions of the LaTeX Project Public License.}}\\[7mm] \end{center} \begin{quote} {\small \textsc{Abstract.} Drawing programs or geometry software and Perl filter programs are used to create conveniently even complicated figures with the \LaTeX{} \texttt{picture} environment. The filter programs parse PostScript files and generate \LaTeX\ code ready for use. The new method will be explained with two filter programs for the geometry software Cabri-g\'{e}om\`{e}tre$^{\mathrm{TM}}$ II. The first program only requires the package \texttt{ebezier} \cite{Ba}. Therefore the output is driver independent. The second filter in addition supplies the new package \texttt{pict2e} \cite{GaNi}.} \end{quote} \section{Introduction} \setlength{\baselineskip}{17pt} The package \texttt{pict2e}, created by \textsc{Hubert G\"a}{\ss}\textsc{lein} and \textsc{Rolf Niepraschk}, e\-lim\-inates the most serious restrictions of the \LaTeX{} \texttt{picture} environment. Henceforth, essentially the problem of positioning the objects remains. An important suggestion, using the package $\mathrm{P_{\D I}C}$\TeX{} of \textsc{Michael J. Wichura} \cite{Wi}, was introduced in 1999 by \textsc{Robert W.D. Nickalls} with the MS\,DOS filter program `Maths\-PIC' \cite{Ni}. Afterwards, it was extended by him and by \textsc{Apostolos Syropoulos} to a Perl filter program \cite{NiSy}. However, the convenient input achieved is on the expence of about 90 further commands. Hence the question arose whether \LaTeX{} figures can also be constructed without using control commands. This seemed to be feasible because the PostScript files generated by graphic programs and used by the \LaTeX{} command \verb|\special| evidently contain all necessary information. The answer is a method which consists of four steps: \begin{enumerate} \item Generating the desired figure with a drawing program or with geometry software; \item ``Printing'' (or exporting) the construction as a PostScript file; \item Applying a filter program to the PostScript text; \item Copying the resulting code or parts of it into a \LaTeX{} document. \end{enumerate} Because of this structure, the method is called ``GaPFilL'' (\emph{Graphics as PostScript Filtered for \LaTeX}). Since the steps (1) and (2) and the packages used in the \LaTeX{} document may vary, it is necessary to apply different filter programs. In the following the context will be described as an example by means of two prototypes: \texttt{CABebez.pl} only requires the macro package \texttt{ebezier}; \texttt{CABpict.pl} in addition uses the above mentioned package \texttt{pict2e}. \section{The Drawing Program or Geometry Software} Most programs which generate graphical objects are suited for the GaPFilL meth\-od. To create diagrams and simple illustrations, it is sufficient to use draw\-ing programs belonging to office packages. The fine drawing program \texttt{Draw} of \texttt{OpenOffice.org} is even free of charge. For the representation of geometrical facts, geometry software is preferable since, apart from the construction of the objects, it offers a lot of transformations and combinations such as reflection, bisection of angles, transfer of measurement and generation of loci. In the educational system, Cabri-g\'{e}om\`{e}tre$^{\mathrm{TM}}$ II (in the following: Cabri Geometry) is a powerful ``dynamic'' geometry software with wide distribution for the operating systems Windows$^{\D \circledR}$ and Mac$^{\D \circledR}$OS. Since 1987 it was developed by \textsc{Jean-Marie Laborde} and \textsc{Franck Bellemain} at the `Institut d'Informa\-tique et Math\'{e}matiques Appliqu\'{e}es' of the Joseph Fourier University in Grenoble. Among other things, due to numerous courses of further education for teachers and due to the implementation of adapted versions in the hand-held computers TI-92, Voyage$^{\mathrm{TM}}$ 200 and other calculators of Texas Instruments$^{\D \circledR}$ it is widely used. Since many people are familiar with these programs, we will only describe the pecularities which are important for the generation of \LaTeX{} figures. In 2004, improved versions Cabri-g\'{e}om\`{e}tre$^{\mathrm{TM}}$ II plus both for Windows and Macintosh computers were published. The differences will be mentioned where appropriate. \section{The Use of Colours} With the aid of colours additional information is conveyed to the filter program. Colouring of objects in the \LaTeX{} \texttt{picture} environment objects is carried out on demand with commands of the \texttt{color} package when the work is to be finished (see Section 8). The names of the colours used in the following come from the Macintosh version of Cabri Geometry, where only eleven colours are available. The Mac\,OS version of Cabri Geometry II plus has a palette with 36 colours. In both new versions the RGB values of colours may be set by the user. In Section 7 it will be described how to change the assignment of colours in the filter program. \\[-8mm] \begin{list}{$\bullet$}{ \setlength{\labelwidth}{3mm} \setlength{\leftmargin}{7mm} } \item All \emph{straight lines, rays, line segments, circles and conic sections} which are coloured \fbox{yellow} serve as \emph{drawing aids} because they are ignored by the filter program. The red points shown by Cabri Geometry will be disregarded by the filter program too. Straight lines, rays, parabolas and hyperbolas are cut off at the boundary of the drawing section. Since the filter program calculates the exact ``bounding box'', these figures should only be used as drawing aid if the resulting shape is not the desired one.\vspace{1mm} \item \emph{Continuous lines and polygons} have to be \fbox{green}.\vspace{1mm} \item \emph{Arrows} must be drawn in \fbox{violet}.\vspace{1mm} \item \emph{Dotted objects (line segments, arrow lines, polygons, circles, arcs)} are obtained by using the colour \fbox{dark green}. \vspace{1mm} \item \emph{Quadratic} and \emph{cubic B\'ezier curves} are entered as \fbox{blue} polygons with three respectively four corners (see Figures 1 and 2). The corresponding curves may be viewed with Cabri Geometry by using macros. This will be explained in Section 4. %Figures 1 and 2 \begin{figure}[tbh] \setlength{\unitlength}{1pt} \begin{minipage}[b]{8.0cm} \setlength{\unitlength}{1pt} \begin{picture}(147,84)(-19,19) \linethickness{0.8pt} \thicklines %Lines, polygons and Bˇzier curves %Dotted line \linethickness{1.2pt} \Lbezier[23](71.811024,96.377953)(30.236220,30.23622) \Lbezier[42](30.236220,30.23622)(168.188976,54.80315) \Lbezier[31](168.188976,54.80315)(71.811024,96.377953) %Quadratic Bˇzier curve \Qbezier[279](71.811024,96.377953)(30.236220,30.23622)(168.188976,54.80315) \put(60.968504,93.543307){1} \put(21.566929,29.84252){2} \put(163.905512,44.464567){3} \put(77,18){Figure 1} \end{picture} \end{minipage}\hfill \raisebox{6mm}{ \begin{minipage}[b]{5.0cm} \begin{picture}(138,68)(33,14) \linethickness{0.8pt} \thicklines %Lines, polygons and Bˇzier curves %Dotted line \linethickness{1.2pt} \Lbezier[37](28.346457,16.062992)(152.125984,14.173228) \Lbezier[30](152.125984,14.173228)(59.527559,55.748031) \Lbezier[25](59.527559,55.748031)(139.842520,81.259843) \Lbezier[38](139.842520,81.259843)(28.346457,16.062992) %Cubic Bˇzier curve \cbezier[280](28.346457,16.062992)(152.125984,14.173228)(59.527559,55.748031)(139.842520,81.259843) \put(23.622047,20.566929){1} \put(150.236220,18.732283){2} \put(50.078740,53.188976){3} \put(137.952756,70.866142){4} \put(69,-4){Figure 2} \end{picture} \end{minipage}} \end{figure} \item \emph{Polygons} have to be \emph{closed} by clicking on the starting point or by double clicking. Using the colour \fbox{navy blue}, the last line of the polygon will be suppressed so that \emph{open polygons} can also be entered conveniently.\vspace{1mm} \item \emph{Text or formula places} are positioned by using \fbox{blue} polygons with two corners. For the bounding box to be calculated correctly, the marking line should approximately be the diagonal beginning at the lower left corner of the smallest rectangle enclosing the text or formula. In the \LaTeX{} output a serial number will be written at the position of the starting point.\vspace{1mm} \item The remaining five colours are used for the \emph{filling, hatching and dotting} of areas bordered by \emph{polygons.} For that the filter program cuts up the polygon area into triangles which have the starting point of the polygon as a common corner. To avoid overlap, the given area must be devided by polygons such that for each polygon the triangles which arise from connecting the starting point with the other corners have at most one side in common with the other triangles (see Figures 3 and 4).\\[-7mm] %Figures 3 and 4 \begin{figure}[tbh] \setlength{\unitlength}{1pt} \begin{minipage}[b]{8.0cm} \setlength{\unitlength}{1pt} \begin{picture}(110,95)(-38,12) \linethickness{0.8pt} \thicklines %Lines, polygons and Bˇzier curves \Lbezier[153](37.795276,19.84252)(25.511811,95.433071) \Lbezier[80](25.511811,95.433071)(51.023622,64.251969) \Lbezier[112](51.023622,64.251969)(86.929134,107.716535) \Lbezier[94](86.929134,107.716535)(76.535433,61.417323) \put(76.535433,61.417323){\line(4,-1){60.472441}} \Lbezier[205](137.007874,46.299213)(37.795276,19.84252) %Dotted line \linethickness{1.2pt} \Lbezier[13](37.795276,19.84252)(51.023622,64.251969) \Lbezier[30](37.795276,19.84252)(86.929134,107.716535) \Lbezier[17](37.795276,19.84252)(76.535433,61.417323) \put(27.732283,16.897638){A} \put(22.007874,98.212598){B} \put(37.795276,59.582677){C} \put(89.598425,104.992126){D} \put(80.761464,63.360815){E} \put(135.503937,34.795276){F} \put(60,1){Figure 3} \end{picture} \end{minipage}\hfill \raisebox{2mm}{ \begin{minipage}[b]{5.0cm} \begin{picture}(150,102)(21,9) \linethickness{0.8pt} \thicklines %Lines, polygons and Bˇzier curves \Lbezier[128](64.251969,108.661417)(116.372861,70.793372) \Lbezier[128](116.372861,70.793372)(96.464452,9.521588) \put(96.464452,9.521588){\line(-1,0){64.424967}} \Lbezier[128](32.039485,9.521588)(12.131076,70.793372) \Lbezier[128](12.131076,70.793372)(64.251969,108.661417) \Lbezier[49](51.817323,66.028346)(76.422047,66.292913) \Lbezier[49](76.422047,66.292913)(76.686614,41.688189) \Lbezier[49](76.686614,41.688189)(52.081890,41.423622) \Lbezier[49](52.081890,41.423622)(51.817323,66.028346) %Dotted line \linethickness{1.2pt} \Lbezier[14](12.131076,70.793372)(51.817323,66.028346) \Lbezier[17](12.131076,70.793372)(52.081890,41.423622) \Lbezier[14](32.039485,9.521588)(52.081890,41.423622) \Lbezier[14](76.686614,41.688189)(96.464452,9.521588) \Lbezier[16](51.817323,66.028346)(64.251969,108.661417) \Lbezier[16](64.251969,108.661417)(76.422047,66.292913) \Lbezier[15](76.422047,66.292913)(116.372861,70.793372) \Lbezier[17](116.372861,70.793372)(76.686614,41.688189) %Dotted triangle \linethickness{0.8pt} \multiput(36,68)(4,0){5}{\line(1,0){0.8}} \multiput(22,70)(4,0){8}{\line(1,0){0.8}} \multiput(16,72)(4,0){10}{\line(1,0){0.8}} \multiput(18,74)(4,0){10}{\line(1,0){0.8}} \multiput(20,76)(4,0){9}{\line(1,0){0.8}} \multiput(26,78)(4,0){8}{\line(1,0){0.8}} \multiput(28,80)(4,0){7}{\line(1,0){0.8}} \multiput(30,82)(4,0){7}{\line(1,0){0.8}} \multiput(32,84)(4,0){7}{\line(1,0){0.8}} \multiput(34,86)(4,0){6}{\line(1,0){0.8}} \multiput(36,88)(4,0){6}{\line(1,0){0.8}} \multiput(42,90)(4,0){5}{\line(1,0){0.8}} \multiput(44,92)(4,0){4}{\line(1,0){0.8}} \multiput(46,94)(4,0){4}{\line(1,0){0.8}} \multiput(48,96)(4,0){4}{\line(1,0){0.8}} \multiput(50,98)(4,0){3}{\line(1,0){0.8}} \multiput(56,100)(4,0){2}{\line(1,0){0.8}} \multiput(58,102)(4,0){2}{\line(1,0){0.8}} \multiput(60,104)(4,0){1}{\line(1,0){0.8}} \multiput(62,106)(4,0){1}{\line(1,0){0.8}} \multiput(64,108)(4,0){1}{\line(1,0){0.8}} %Dotted triangle \multiput(54,42)(4,0){0}{\line(1,0){0.8}} \multiput(52,44)(4,0){1}{\line(1,0){0.8}} \multiput(46,46)(4,0){2}{\line(1,0){0.8}} \multiput(44,48)(4,0){3}{\line(1,0){0.8}} \multiput(42,50)(4,0){3}{\line(1,0){0.8}} \multiput(40,52)(4,0){3}{\line(1,0){0.8}} \multiput(38,54)(4,0){4}{\line(1,0){0.8}} \multiput(36,56)(4,0){4}{\line(1,0){0.8}} \multiput(30,58)(4,0){6}{\line(1,0){0.8}} \multiput(28,60)(4,0){6}{\line(1,0){0.8}} \multiput(26,62)(4,0){7}{\line(1,0){0.8}} \multiput(24,64)(4,0){7}{\line(1,0){0.8}} \multiput(22,66)(4,0){8}{\line(1,0){0.8}} \multiput(16,68)(4,0){5}{\line(1,0){0.8}} \multiput(14,70)(4,0){2}{\line(1,0){0.8}} %Dotted triangle \multiput(34,10)(4,0){0}{\line(1,0){0.8}} \multiput(32,12)(4,0){1}{\line(1,0){0.8}} \multiput(34,14)(4,0){1}{\line(1,0){0.8}} \multiput(32,16)(4,0){2}{\line(1,0){0.8}} \multiput(30,18)(4,0){2}{\line(1,0){0.8}} \multiput(32,20)(4,0){2}{\line(1,0){0.8}} \multiput(30,22)(4,0){3}{\line(1,0){0.8}} \multiput(28,24)(4,0){4}{\line(1,0){0.8}} \multiput(30,26)(4,0){4}{\line(1,0){0.8}} \multiput(28,28)(4,0){4}{\line(1,0){0.8}} \multiput(26,30)(4,0){5}{\line(1,0){0.8}} \multiput(28,32)(4,0){5}{\line(1,0){0.8}} \multiput(26,34)(4,0){6}{\line(1,0){0.8}} \multiput(24,36)(4,0){7}{\line(1,0){0.8}} \multiput(26,38)(4,0){6}{\line(1,0){0.8}} \multiput(24,40)(4,0){7}{\line(1,0){0.8}} \multiput(22,42)(4,0){8}{\line(1,0){0.8}} \multiput(24,44)(4,0){7}{\line(1,0){0.8}} \multiput(22,46)(4,0){6}{\line(1,0){0.8}} \multiput(20,48)(4,0){6}{\line(1,0){0.8}} \multiput(22,50)(4,0){5}{\line(1,0){0.8}} \multiput(20,52)(4,0){5}{\line(1,0){0.8}} \multiput(18,54)(4,0){5}{\line(1,0){0.8}} \multiput(20,56)(4,0){4}{\line(1,0){0.8}} \multiput(18,58)(4,0){3}{\line(1,0){0.8}} \multiput(16,60)(4,0){3}{\line(1,0){0.8}} \multiput(18,62)(4,0){2}{\line(1,0){0.8}} \multiput(16,64)(4,0){2}{\line(1,0){0.8}} \multiput(14,66)(4,0){2}{\line(1,0){0.8}} \multiput(16,68)(4,0){0}{\line(1,0){0.8}} \multiput(14,70)(4,0){0}{\line(1,0){0.8}} %Dotted triangle \multiput(98,10)(4,0){0}{\line(1,0){0.8}} \multiput(96,12)(4,0){1}{\line(1,0){0.8}} \multiput(94,14)(4,0){1}{\line(1,0){0.8}} \multiput(96,16)(4,0){1}{\line(1,0){0.8}} \multiput(94,18)(4,0){2}{\line(1,0){0.8}} \multiput(92,20)(4,0){2}{\line(1,0){0.8}} \multiput(90,22)(4,0){3}{\line(1,0){0.8}} \multiput(88,24)(4,0){4}{\line(1,0){0.8}} \multiput(90,26)(4,0){3}{\line(1,0){0.8}} \multiput(88,28)(4,0){4}{\line(1,0){0.8}} \multiput(86,30)(4,0){5}{\line(1,0){0.8}} \multiput(84,32)(4,0){5}{\line(1,0){0.8}} \multiput(82,34)(4,0){6}{\line(1,0){0.8}} \multiput(84,36)(4,0){6}{\line(1,0){0.8}} \multiput(82,38)(4,0){6}{\line(1,0){0.8}} \multiput(80,40)(4,0){7}{\line(1,0){0.8}} \multiput(78,42)(4,0){8}{\line(1,0){0.8}} \multiput(80,44)(4,0){7}{\line(1,0){0.8}} \multiput(86,46)(4,0){6}{\line(1,0){0.8}} \multiput(88,48)(4,0){6}{\line(1,0){0.8}} \multiput(90,50)(4,0){5}{\line(1,0){0.8}} \multiput(92,52)(4,0){5}{\line(1,0){0.8}} \multiput(94,54)(4,0){5}{\line(1,0){0.8}} \multiput(100,56)(4,0){3}{\line(1,0){0.8}} \multiput(102,58)(4,0){3}{\line(1,0){0.8}} \multiput(104,60)(4,0){3}{\line(1,0){0.8}} \multiput(106,62)(4,0){2}{\line(1,0){0.8}} \multiput(108,64)(4,0){2}{\line(1,0){0.8}} \multiput(110,66)(4,0){2}{\line(1,0){0.8}} \multiput(116,68)(4,0){0}{\line(1,0){0.8}} \multiput(118,70)(4,0){0}{\line(1,0){0.8}} %Dotted triangle \multiput(78,42)(4,0){0}{\line(1,0){0.8}} \multiput(80,44)(4,0){0}{\line(1,0){0.8}} \multiput(78,46)(4,0){2}{\line(1,0){0.8}} \multiput(80,48)(4,0){2}{\line(1,0){0.8}} \multiput(78,50)(4,0){3}{\line(1,0){0.8}} \multiput(80,52)(4,0){3}{\line(1,0){0.8}} \multiput(78,54)(4,0){4}{\line(1,0){0.8}} \multiput(80,56)(4,0){5}{\line(1,0){0.8}} \multiput(78,58)(4,0){6}{\line(1,0){0.8}} \multiput(80,60)(4,0){6}{\line(1,0){0.8}} \multiput(78,62)(4,0){7}{\line(1,0){0.8}} \multiput(80,64)(4,0){7}{\line(1,0){0.8}} \multiput(78,66)(4,0){8}{\line(1,0){0.8}} \multiput(92,68)(4,0){6}{\line(1,0){0.8}} \multiput(110,70)(4,0){2}{\line(1,0){0.8}} %Dotted triangle \multiput(76,68)(4,0){4}{\line(1,0){0.8}} \multiput(78,70)(4,0){8}{\line(1,0){0.8}} \multiput(76,72)(4,0){10}{\line(1,0){0.8}} \multiput(78,74)(4,0){9}{\line(1,0){0.8}} \multiput(76,76)(4,0){9}{\line(1,0){0.8}} \multiput(74,78)(4,0){9}{\line(1,0){0.8}} \multiput(76,80)(4,0){7}{\line(1,0){0.8}} \multiput(74,82)(4,0){7}{\line(1,0){0.8}} \multiput(72,84)(4,0){7}{\line(1,0){0.8}} \multiput(74,86)(4,0){6}{\line(1,0){0.8}} \multiput(72,88)(4,0){6}{\line(1,0){0.8}} \multiput(70,90)(4,0){5}{\line(1,0){0.8}} \multiput(72,92)(4,0){4}{\line(1,0){0.8}} \multiput(70,94)(4,0){4}{\line(1,0){0.8}} \multiput(68,96)(4,0){4}{\line(1,0){0.8}} \multiput(70,98)(4,0){3}{\line(1,0){0.8}} \multiput(68,100)(4,0){3}{\line(1,0){0.8}} \multiput(70,102)(4,0){1}{\line(1,0){0.8}} \multiput(68,104)(4,0){1}{\line(1,0){0.8}} \multiput(66,106)(4,0){1}{\line(1,0){0.8}} \multiput(68,108)(4,0){0}{\line(1,0){0.8}} %Hatched triangle \Lbezier[7](65.2359207037011,105.235920811786)(62.4363140016148,102.4363141097) \Lbezier[15](66.1285055587812,102.1285056742)(60.7892551048443,96.7892552202636) \Lbezier[22](67.0210904138612,99.0210905366148)(59.1421962080738,91.1421963308273) \put(67.9136752689413,95.9136753990291){\line(-1,-1){10.4185379576379}} \put(68.8062601240213,92.8062602614434){\line(-1,-1){12.9581817094884}} \put(69.6988449791014,89.6988451238577){\line(-1,-1){15.497825461339}} \put(70.5914298341814,86.591429986272){\line(-1,-1){18.0374692131895}} \put(71.4840146892615,83.4840148486863){\line(-1,-1){17.4316358238517}} \put(72.3765995443415,80.3765997111006){\line(-1,-1){14.2807424059155}} \put(73.2691843994216,77.2691845735149){\line(-1,-1){11.1298489879793}} \Lbezier[22](74.1617692545016,74.1617694359292)(66.1828136844585,66.1828138658861) \Lbezier[13](75.0543541095817,71.0543542983436)(70.2262919574748,66.2262921462366) \Lbezier[4](75.9469389646618,67.9469391607579)(74.269770230491,66.2697704265871) %Hatched triangle \Lbezier[10](53.4382060465256,41.438206152038)(49.8144047931543,37.8144048986667) \put(57.4816843197205,41.4816844416667){\line(-1,-1){14.4271554953665}} \put(61.5251625929154,41.5251627312953){\line(-1,-1){25.2305097373617}} \put(65.5686408661102,41.5686410209239){\line(-1,-1){28.2271651916524}} \put(69.6121191393051,41.6121193105525){\line(-1,-1){17.9612717829661}} \Lbezier[21](73.6555974125,41.6555976001812)(65.9602190382202,33.9602192259014) %Hatched triangle \Lbezier[10](33.521588,9.52158800460102)(37.3414757050646,13.3414757096656) \put(37.521588,9.52158801701857){\line(1,1){14.1292594695494}} \put(41.521588,9.52158802943611){\line(1,1){24.4386312340343}} \put(45.521588,9.52158804185366){\line(1,1){31.5463756065196}} \put(49.521588,9.5215880542712){\line(1,1){29.0693750607577}} \put(53.521588,9.52158806668875){\line(1,1){26.5923745149957}} \put(57.521588,9.5215880791063){\line(1,1){24.1153739692337}} \put(61.521588,9.52158809152384){\line(1,1){21.6383734234717}} \put(65.521588,9.52158810394139){\line(1,1){19.1613728777097}} \put(69.521588,9.52158811635893){\line(1,1){16.6843723319477}} \put(73.521588,9.52158812877648){\line(1,1){14.2073717861858}} \put(77.521588,9.52158814119403){\line(1,1){11.7303712404238}} \Lbezier[26](81.521588,9.52158815361157)(90.7749586946618,18.7749588482734) \Lbezier[19](85.521588,9.52158816602912)(92.2979581488998,16.2979583149289) \Lbezier[12](89.521588,9.52158817844666)(93.8209576031378,13.8209577815845) \Lbezier[5](93.521588,9.52158819086421)(95.3439570573758,11.3439572482401) \put(2.503937,67.19685){1} \put(55.692913,55.748031){2} \put(120.834646,67.307087){3} \put(19.393701,7.559055){4} \put(48,-8){Figure 4} \end{picture} \end{minipage}} \end{figure}\vspace{2mm} \hspace{-4mm}\fbox{Red} \emph{polygons} are \emph{filled} without boundery. For the \emph{hatching with visible boundary lines} the colour \fbox{orange} has to be chosen for the polygon; \emph{without boundary lines} the colour \fbox{brown} will do it. If the polygon is coloured \fbox{purple}, the area will be \emph{dotted with visible boundary lines}; with the colour \fbox{violet} an area can be \emph{dotted without boundary lines}. The previous assignments of colours are summarized in the following table.\vspace{3mm} \begin{center} \begin{tabular}{|c|c|} \hline \rule[-1mm]{0mm}{4.5mm} Type & Colour \\ \hline \rule[0mm]{0mm}{4mm} auxiliary line & yellow \\ unbroken object & green \\ arrow & violet \\ dotted object & dark green \\ B\'ezier curve or text & blue \\ open polygon & navy blue \\ filling without border & red \\ hatching with border & orange \\ hatching without border & brown \\ dotting with border & purple \\ dotting without border & dark brown \\ \hline \end{tabular}\\ \end{center}\vspace{3mm} \item With Cabri Geometry semicircles and quadrants of a circle, which in \LaTeX{} are also connected with the \verb|\oval| command, must be constructed as circular arcs determined by three points on a circle. For those circular arcs which have at their ends radii parallel to the coordinate axes, the input is simplified by using coloured circles. The next table contains the assigned colours. With the Macintosh version of Cabri Geometry, the respective colours of the objects can be preset in the ``standard settings''. \vspace{3mm} \begin{center} \begin{tabular}{|c|c|} \hline \rule[-1mm]{0mm}{4.5mm} Type & Colour \\ \hline \rule[0mm]{0mm}{4mm} auxiliary circle & yellow \\ unbroken circle & navy blue \\ dotted arc or circle & dark green \\ left semicircle & purple \\ right semicircle & red \\ bottom semicircle & orange \\ top semicircle & dark brown \\ left bottom quadrant of a circle & blue \\ left top quadrant of a circle & green \\ right bottom quadrant of a circle & brown \\ right top quadrant of a circle & violet \\ \hline \end{tabular} \end{center} \end{list}\vspace{2mm} \section{Macros for B\'ezier Curves with Cabri Geometry} In contrast to many drawing programs, Cabri Geometry does not offer the tool `B\'ezier curve' which yields a substantial part of the efficiency of \LaTeX{} figures. This deficiency can be compensated by ``loci'' which are generated with the aid of macros described in the following. In the mathematical representation we use vectors instead of the spanning points because the geometrical meaning is better known from vector geometry than from complex numbers. If $t$ with $0 \le t \le 1$ is the running parameter, then the \emph{quadratic B\'ezier curve} spanned by $\vec{x}_{1},\,\vec{x}_{2},\,\vec{x}_{3}$ can be written in the following form with the abbreviation $t_{1}:\,=1-t$: \[\vec{x}(t)=t_{1}\left(t_{1}\vec{x}_{1}+t\,\vec{x}_{2}\right)+ t\left(t_{1}\vec{x}_{2}+t\,\vec{x}_{3}\right).\]\\[-5mm] Since all three linear combinations belonging to the plus signs have the same coefficients $t_{1}$ and $t$, each point of the quadratic B\'ezier curve can be obtained by dividing three line segments with the same division ratio $t:t_{1}.$ Since \[t_{1}\vec{x}_{i}+t\,\vec{x}_{i+1} =\vec{x}_{i}+t\left(\vec{x}_{i+1}-\vec{x}_{i}\right),\;i=1,\,2,\]\\[-6mm] at first the two ``connecting line segments'' from $\vec{x}_{1}$ to $\vec{x}_{2}$ and from $\vec{x}_{2}$ to $\vec{x}_{3}$ are divided with ratio $t:t_{1}.$ If $\vec{x}\;\!'_{\!i}:\,=t_{1}\vec{x}_{i}+t\,\vec{x}_{i+1},\;i=1,\,2,$ are the accompanying ``division vectors'', then the division of the connecting line segment from $\vec{x}\;\!'_{\!1}$ to $\vec{x}\;\!'_{\!2}$ with ratio $t:t_{1}$ yields the vector $\vec{x}(t)$ belonging to the parameter $t.$ Correspondingly, the quadratic B\'ezier curve can be constructed as locus. After the input of three different points $P_{1},\,P_{2},\,P_{3},$ the line segment connecting $P_{1}$ and $P_{3}$ is drawn as ``track'' of the locus, and a point $T$ is placed on it $\:\:$(see Figure 5).\mbox{} \vspace{-7.2mm}\\ %Figur 5 \begin{figure}[tbh] \setlength{\unitlength}{1pt} \raisebox{6mm} {\begin{minipage}[b]{7.5cm} \setlength{\unitlength}{1pt} \begin{picture}(150,84)(0,19) \linethickness{0.8pt} \thicklines %Lines, polygons and Bˇzier curves %Dotted line \linethickness{1.2pt} \Lbezier[42](30.236220,30.23622)(168.188976,54.80315) \linethickness{0.8pt} \Lbezier[209](168.188976,54.80315)(71.811024,96.377953) \Lbezier[144](71.811024,96.377953)(33.429250,35.31604) \Lbezier[268](30.236220,30.23622)(162.281911,53.751207) \Lbezier[141](44.502084,52.931913)(114.874262,46.886839) %Filled triangle \linethickness{0.1pt} \put(30.3016,30.43622){\line(1,0){0.0603}} \put(30.367,30.63622){\line(1,0){0.1206}} \put(30.4325,30.83622){\line(1,0){0.1809}} \put(30.4979,31.03622){\line(1,0){0.2412}} \put(30.5633,31.23622){\line(1,0){0.3015}} \put(30.6288,31.43622){\line(1,0){0.3617}} \put(30.6942,31.63622){\line(1,0){0.422}} \put(30.7596,31.83622){\line(1,0){0.4823}} \put(30.8251,32.03622){\line(1,0){0.5426}} \put(30.8905,32.23622){\line(1,0){0.6029}} \put(30.9559,32.43622){\line(1,0){0.6632}} \put(31.0214,32.63622){\line(1,0){0.7234}} \put(31.0868,32.83622){\line(1,0){0.7837}} \put(31.1522,33.03622){\line(1,0){0.844}} \put(31.2177,33.23622){\line(1,0){0.9043}} \put(31.2831,33.43622){\line(1,0){0.9646}} \put(31.3485,33.63622){\line(1,0){1.0248}} \put(31.4139,33.83622){\line(1,0){1.0851}} \put(31.4794,34.03622){\line(1,0){1.1454}} \put(31.5448,34.23622){\line(1,0){1.2057}} \put(31.6102,34.43622){\line(1,0){1.266}} \put(31.6757,34.63622){\line(1,0){1.3263}} \put(31.7411,34.83622){\line(1,0){1.3865}} \put(31.8065,35.03622){\line(1,0){1.4468}} \put(31.872,35.23622){\line(1,0){1.5071}} \put(31.9374,35.43622){\line(1,0){1.4644}} \put(32.0028,35.63622){\line(1,0){1.3534}} \put(32.0683,35.83622){\line(1,0){1.2423}} \put(32.1337,36.03622){\line(1,0){1.1313}} \put(32.1991,36.23622){\line(1,0){1.0203}} \put(32.2646,36.43622){\line(1,0){0.9092}} \put(32.33,36.63622){\line(1,0){0.7982}} \put(32.3954,36.83622){\line(1,0){0.6871}} \put(32.4609,37.03622){\line(1,0){0.5761}} \put(32.5263,37.23622){\line(1,0){0.465}} \put(32.5917,37.43622){\line(1,0){0.354}} \put(32.6572,37.63622){\line(1,0){0.2429}} \put(32.7226,37.83622){\line(1,0){0.1319}} \put(32.788,38.03622){\line(1,0){0.0208}} \linethickness{0.8pt} %Filled triangle \linethickness{0.1pt} \put(30.4447,30.43622){\line(-1,0){0.0828}} \put(30.6532,30.63622){\line(-1,0){0.1656}} \put(30.8617,30.83622){\line(-1,0){0.2483}} \put(31.0702,31.03622){\line(-1,0){0.3311}} \put(31.2786,31.23622){\line(-1,0){0.4139}} \put(31.4871,31.43622){\line(-1,0){0.4966}} \put(31.6956,31.63622){\line(-1,0){0.5794}} \put(31.9041,31.83622){\line(-1,0){0.6621}} \put(32.1125,32.03622){\line(-1,0){0.7449}} \put(32.321,32.23622){\line(-1,0){0.8277}} \put(32.5295,32.43622){\line(-1,0){0.9104}} \put(32.738,32.63622){\line(-1,0){0.9932}} \put(32.9464,32.83622){\line(-1,0){1.0759}} \put(33.1549,33.03622){\line(-1,0){1.1587}} \put(33.3634,33.23622){\line(-1,0){1.2415}} \put(33.5719,33.43622){\line(-1,0){1.3242}} \put(33.7803,33.63622){\line(-1,0){1.407}} \put(33.9888,33.83622){\line(-1,0){1.4897}} \put(34.1973,34.03622){\line(-1,0){1.5725}} \put(34.4058,34.23622){\line(-1,0){1.6553}} \put(34.6142,34.43622){\line(-1,0){1.738}} \put(34.8227,34.63622){\line(-1,0){1.8208}} \put(35.0312,34.83622){\line(-1,0){1.9035}} \put(35.2397,35.03622){\line(-1,0){1.9863}} \put(35.4481,35.23622){\line(-1,0){2.0691}} \put(35.6566,35.43622){\line(-1,0){1.7004}} \put(35.8651,35.63622){\line(-1,0){1.032}} \put(36.0736,35.83622){\line(-1,0){0.3635}} \linethickness{0.8pt} %Filled triangle \linethickness{0.1pt} \put(161.11,51.6315371){\line(-1,0){0.3069}} \put(161.5564,51.8315371){\line(-1,0){0.6138}} \put(162.0028,52.0315371){\line(-1,0){0.9206}} \put(162.4492,52.2315371){\line(-1,0){1.2275}} \put(162.8956,52.4315371){\line(-1,0){1.5344}} \put(163.342,52.6315371){\line(-1,0){1.8412}} \put(163.7884,52.8315371){\line(-1,0){2.1481}} \put(164.2348,53.0315371){\line(-1,0){2.455}} \put(164.6812,53.2315371){\line(-1,0){2.7618}} \put(165.1276,53.4315371){\line(-1,0){3.0687}} \put(165.574,53.6315371){\line(-1,0){3.3756}} \put(166.0204,53.8315371){\line(-1,0){3.2874}} \put(166.4668,54.0315371){\line(-1,0){2.6107}} \put(166.9132,54.2315371){\line(-1,0){1.934}} \put(167.3596,54.4315371){\line(-1,0){1.2574}} \put(167.806,54.6315371){\line(-1,0){0.5807}} \linethickness{0.8pt} %Filled triangle \linethickness{0.1pt} \put(161.9952,53.9512072){\line(1,0){1.4098}} \put(161.7085,54.1512072){\line(1,0){2.8195}} \put(161.4219,54.3512072){\line(1,0){4.2293}} \put(161.1352,54.5512072){\line(1,0){5.639}} \put(160.8485,54.7512072){\line(1,0){7.0488}} \put(160.5619,54.9512072){\line(1,0){5.4768}} \put(160.2752,55.1512072){\line(1,0){2.8587}} \put(159.9885,55.3512072){\line(1,0){0.2406}} \linethickness{0.8pt} %Filled triangle \linethickness{0.1pt} \put(112.948,45.2653501){\line(1,0){1.0074}} \put(113.1856,45.4653501){\line(1,0){2.0148}} \put(113.4231,45.6653501){\line(1,0){3.0221}} \put(113.6607,45.8653501){\line(1,0){4.0295}} \put(113.8983,46.0653501){\line(1,0){5.0369}} \put(114.1359,46.2653501){\line(1,0){6.0442}} \put(114.3735,46.4653501){\line(1,0){5.4074}} \put(114.6111,46.6653501){\line(1,0){2.8416}} \put(114.8487,46.8653501){\line(1,0){0.2757}} \linethickness{0.8pt} %Filled triangle \linethickness{0.1pt} \put(120.2697,46.573321){\line(-1,0){1.7457}} \put(119.687,46.773321){\line(-1,0){3.4913}} \put(119.1044,46.973321){\line(-1,0){4.303}} \put(118.5218,47.173321){\line(-1,0){3.8887}} \put(117.9392,47.373321){\line(-1,0){3.4744}} \put(117.3565,47.573321){\line(-1,0){3.0602}} \put(116.7739,47.773321){\line(-1,0){2.6459}} \put(116.1913,47.973321){\line(-1,0){2.2316}} \put(115.6087,48.173321){\line(-1,0){1.8173}} \put(115.026,48.373321){\line(-1,0){1.4031}} \put(114.4434,48.573321){\line(-1,0){0.9888}} \put(113.8608,48.773321){\line(-1,0){0.5745}} \put(113.2782,48.973321){\line(-1,0){0.1603}} \linethickness{0.8pt} \put(56.0,93.543307){$P_{1}$} \put(16.566929,28.84252){$P_{2}$} \put(162.0,43.464567){$P_{3}$} \put(28.125984,51.07874){$Q_{1}$} \put(133.338583,73.425197){$T$} \put(116.220472,35.795276){$Q_{2}$} \put(90.818898,52.637795){$S$} \put(135.118110,69.069013){\circle*{3}} \put(94.653661,48.623818){\circle*{3}} \put(77,16){Figure 5} \end{picture} \end{minipage}}\hfill \begin{minipage}[b]{6.5cm} \setlength{\baselineskip}{17pt} The distances of $P_{1}$ and $T$ and of $P_{1}$ and $P_{3}$ determined with the tool ``dis\-tance and length'' must be transferred into the window of the tool ``calculator''. They have to be divided. After putting the value of the ratio into the drawing window, it has \end{minipage}\\[-5mm] \end{figure} to be multiplied with the distances of $P_{1}$ and $P_{2}$ and of $P_{2}$ and $P_{3}$. To get the right division points $Q_{1}$ and $Q_{2}$, these resulting lengths have to be marked off on the vectors from $P_{1}$ to $P_{2}$ and from $P_{2}$ to $P_{3}$ with the tool ``transfer of measurement''. In the same way, the point $S$ of the quadratic B\'ezier curve is constructed as division point on the vector from $Q_{1}$ to $Q_{2}.$ Calling the tool ``locus'' and clicking on the points $S$ and $T$ (in this order) the preset number of points of the quadratic B\'ezier curve will be drawn. Then, in the tool box ``macros'' the three points $P_{1}, \,P_{2},\,P_{3}$ and the locus have to be chosen respectively as source objects and as target object by clicking. Finally, with the tool ``macro name'' the macro can be saved. The \emph{cubic B\'ezier curve} determined by the vectors $\vec{y}_{1},\,\vec{y}_{2},\,\vec{y}_{3},\,\vec{y}_{4}$ is obtained quite similar by six divisions of line segments with the same ratio $t:t_{1}$ because the abbreviations\vspace{-1mm} \[\vec{y}\;\!'_{\!j}:\,= t_{1}\vec{y}_{j}+t\,\vec{y}_{j+1},\;j=1,\,2,\,3,\:\mbox{ and }\: \vec{y}\;\!''_{\!k}:\,= t_{1}\vec{y}\;\!'_{\!k}+t\,\vec{x}\;\!'_{\!k+1},\;k=1,\,2,\]\\[-7mm] enable the representation \vspace{-1mm} \[\vec{y}(t)=t_{1}\vec{y}\;\!''_{\!1}+t\,\vec{y}\;\!''_{\!2}.\]\\[-4mm] Therefore, the cubic B\'ezier curve can be constructed as locus in a way analogous to that one of the quadratic B\'ezier curve. At first, four different points have to be entered. Then the connecting line segment of the first and the last point is drawn as track of the locus. A point $T$ which has to be put on the track determines the division ratio of all six vectors occurring later. The first three vectors connect each of two points entered successively. The next two vectors lie between the three division points. The corresponding division of the sixth connecting vector yields the locus point belonging to $T$. The source objects of the macro are the four starting points, the target object is the locus. The Macintosh version of the two macros can be found in the Section ``Programs'' of the author's web site called \emph{Mathcompass} \cite{Mo}. \section{PostScript Files} The inclusion of graphics with the \LaTeX{} command \verb|\special| is extremely device dependent. This deficiency is reduced considerably by suitable \TeX{} macros which support many important drivers processing PostScript code. The \LaTeX{} packages \texttt{graphicx, color} and \texttt{pstricks} are examples which, among other possibilities, are described in \cite{GRM}. Compared with the programming of such \TeX{} macros, the writing of filter programs for the extraction of data from EPS files (EPS\,=\, Encapsulated PostScript) relevant for \LaTeX{} requires only little knowledge of PostScript, for example from \cite{Ad}. For the application with a fitting filter program, a standard EPS printer driver can be used without understanding PostScript. Suitable drivers can be downloaded free of charge from the driver web site of the Adobe Company (\texttt{http://www.adobe.com/support/downloads/main.html}). The following explanations are given for people who want to change or rewrite a filter program. PostScript files can be opened and edited with editor programs like \emph{Alpha} or \emph{BBEdit} with MacOS, \emph{WinEdt} with Windows or \emph{Emacs} with Unix. Frequently these files have more than 1000 lines. But even in this case, only a very small part lying between `EndProlog' and `EOF' contains \LaTeX{} relevant data. For the application of filter programs it is advantageous that all lines containing required numerical values are unambiguously marked at the line end. However, for the individual PostScript generators the marking may be quite different. The lines with the colour data end, among other things, with `setrgbcolor' or with `:F4'. The object data follow one to three lines later. Here too, the marking may be ``concrete'' or ``abstract''. In case of a line segment, it is, for example, `lineto stroke' respectively `@b'. In the second case, the concrete assignment can be found in the `Prolog' section. The meaning and the order of the numerical values from different PostScript generators are not uniform either. For example, a circle can be determined by its centre and radius or by two diagonal corners of its bounding box. Sometimes the x- and y-coordinates of points are exchanged. Furthermore, the numerical values do not always belong to the same unit. Usually it is `pt' which fits the \texttt{picture} environment of \LaTeX. There may also occur integer values which have to be multiplied with 0.25 in order to receive the point size. All these differences can be clarified through systematic trials. At first, each of the different objects has to be constructed with the graphic program. After noting the measurements, the drawing must be exported as a PostScript file. Most of the graphic programs indicate coordinates and lengths in millimetres. The conversion factor to pt is 2.845. Through choice of suitable lattice points or through variation of the figure, the position of the data in question can be determined. If it turns out that the y-coordinates in the PostScript file are opposed to those in the graphic program, either the drawing has to be reflected vertically before saving, or in the filter program, each y-coordinate must be multiplied by -1. \section{Perl} The interpreter language Perl (as abbreviation of ``\textbf{P}ractical \textbf{E}xtraction and \textbf{R}eport \textbf{L}anguage'') was developed around 1988 by \textsc{Larry Wall} at first for scanning arbitrary text files in order to extract and process information. It may be considered as a younger brother of the \TeX{} system published around 1978 by \textsc{Donald E. Knuth} because many persons are improving the systems since the beginning and because both systems with numerous modules and aids are available free of charge in the ``Comprehensive \TeX{} Archive Network'' (CTAN) and in the ``Comprehensive Perl Archive Network'' (\texttt{http://www.Perl.com/CPAN}) respectively. Meanwhile Perl has become a universal script language with which many kinds of recurring tasks can be automated, for example in the system man\-age\-ment of computers and of their peripherals. Along with the great power of Perl since Version 5, it is specially advantageous for the application together with \LaTeX{} that Perl systems are available on all platforms with wide distribution. Therefore it is not surprising that the CTAN already contains numerous Perl programs. Whoever has learned a higher programming language (like C, for example) will hardly have difficulties writing or changing Perl filter programs with the aid of some of the online manuals and looking at examples like the ones described in the following section. As with \LaTeX, it may be expected that, now having reached the Perl version number 5.8.7, there won't be considerable changes with respect to text filtering. Therefore it is reasonable to provide and to maintain Perl filter programs at this time also for further combinations of graphic programs, PostScript versions and \LaTeX{} packages. That can be achieved in the interest of the \LaTeX{} community by a few persons because the main work has been accomplished developing the filter structure and the subroutines. \section{The filter programs \texttt{CABpict.pl} and \texttt{CABebez.pl}} The Perl program \texttt{CABpict.pl}, which is 32 kB large, has 964 lines including the comment lines beginning with `\#' and the lines with closing braces `\}'. The program \texttt{CABebez.pl} is only 29 lines shorter. Therefore in the following only those lines and blocks are commented which are important for better understanding or which may play a part in modifications. In case of matching, the lines from \texttt{CABpict.pl} are taken. The line numbers, which in both cases don't belong to the programs, may be different even for matching lines. In this documentation, the lines of \texttt{CABebez.pl} are marked by a colon behind the numbers. \begin{small} \begin{verbatim} 1 #!perl -w 2 # CABpict.pl \end{verbatim} \vspace{-4mm} \texttt{\mbox{\quad} 3 \# (c) Copyright 2006 H. M\"oller (mollerh@math.uni-muenster.de).\\ \mbox{\quad} 4 \# Version 1.1 for Cabri-g\'eom\`etre II with MacOS 9.x, \ldots \mbox{ }.\\ \mbox{\quad} 5 \# This program may be distributed and/or modified under the\\ \mbox{\quad \quad} conditions of the LaTeX Project Public License, \ldots \mbox{ }.\\ \mbox{\quad} \ldots} \vspace{-4mm} \begin{verbatim} 9 use POSIX('ceil','floor'); \end{verbatim} \end{small} The first line doesn't represent a comment line because it begins with `\#!'. This line may be missing in some Perl versions, for example, if Perl programs are called by command line input or if no options are used. The option `\verb|-w|' causes Perl to print error messages. It can also be necessary to place the complete path name before `\texttt{perl}', for example `\texttt{/usr/bin/perl}'. Lines 2 to 8 are destined for version references. Line 9 provides two procedures from the Perl modul `POSIX'. They serve for rounding and can be replaced (with caution) by own (sub-) routines using the command `\texttt{int}'. \begin{small} \begin{verbatim} 11 # Definable by the user: 12 # Unitlength in pt: 13 $ul = 1.0; 14 # Fill factor (for filling with magnification up to 500 %) 15 $fillf = 5; 16 # Point factor: 17 $pointf = 0.3; 18 # Flag for dotting parabolic arcs (1: Dotting) 19 $Qbezflag = 0; \end{verbatim} \vspace{-4mm} \hspace{5.5pt}\texttt{16:\mbox{ }\# B\'ezier factor:} \vspace{-4mm} \begin{verbatim} 17: $bezf = 2.0; \end{verbatim} \end{small} Each of these five parameters may be changed before applying the respective program. Afterwards all parameters should get their original values unless the program is stored under a different name. Varying the `unitlength' \verb|$ul| and using a saved PostScript representation, each drawing can be reduced or magnified in the \LaTeX{} \texttt{picture} environment. The value \verb|$ul=1.0| yields the figure in its original size from Cabri Geometry. The `fill factor' \verb|$fillf| settles the distance of the horizontal line segments filling polygons. With \verb|$fillf=5| figures appear completely filled with screen magnification up to 500 \% . With \texttt{pict2e} alone, dotted curves can't be represented because \texttt{pict2e} ignores the number of points of B\'ezier objects. Therefore in \texttt{CABpict.pl} the plot commands \verb|\Lbezier| and \verb|\Qbezier| from the package \texttt{ebezier} are used additionally. With that the `point factor'\verb|$ pointf= 0.3| yields the normal point distance (like in Figures 1 to 3). To dot a curve, setting the flag \verb|$Qbezflag=1| one can approximate with arcs of parabolas for which possibly in the \LaTeX{} \texttt{picture} environment the number of points at \verb|\Qbezier| is to be adjusted. In the normal case \verb|$Qbezflag=0|, the parabolic arc is drawn with the plot command \verb|\qbezier| from \texttt{pict2e}. In \texttt{CABebez.pl} the `B\'ezier factor' \verb|$bezf= 2.0| yields a point distance which with normal magnification and in print lets the corresponding line appear closed. Since the memory need of B\'ezier curves with \texttt{ebezier} is often eight times as large as with \texttt{pict2e}, \verb|$bezf| may be reduced in case of tight memory. \begin{small} \begin{verbatim} 21 # Constants: 22 # Colour names: 23 $yellow = "0.9843900.9511410.020249"; 24 $orange = "1.0000000.3927370.009949"; 25 $red = "0.8649270.0342110.025910"; 26 $purple = "0.9486080.0325630.519234"; 27 $violet = "0.2769050.0000000.645487"; 28 $navy = "0.0000000.0000000.828138"; 29 $blue = "0.0088040.6692610.917967"; 30 $green = "0.1215990.7170980.078874"; 31 $darkgreen = "0.0000000.3933010.069093"; 32 $darkbrown = "0.3359430.1742730.020081"; 33 $brown = "0.5657890.4428780.227359"; \end{verbatim} \end{small} Cabri Geometry writes the three RGB values into the PostScript file with six decimal places and one digit before the decimal point. Through Lines 45 to 47, \texttt{CABpict.pl} looks for these lines ending with \verb*| setrgbcolor | and removes the spaces as well as the last word \verb|setrgbcolor|. In this way the corresponding line yields a single ``word'' which is placed before the respective character strings later. Through the assignment of easily remembered colour names to this ``digit words'' it is easy to use other or further colour names. The names of 68 (DVIPS-) colours with CMYK values can be found in the header file `\verb|color.pro|'. Without colour values they also appear in the files `\verb|colordvi.sty|' and `\verb|colordvi.tex|' (see \cite{Car}). \begin{small} \begin{verbatim} 35 # Further Constants: 36 # Pi: 37 $Pi = "3.14159265358979"; 38 # Constants in dotted figures: 39 $uli = sp(4 / $ul); 40 $ule = sp(0.8 / $ul); \end{verbatim} \vspace{-5mm} \hspace{5.5pt}\texttt{38:\mbox{ }\# Constant in cubic B\'ezier curves for quarters of a circle:} \vspace{-3mm} \begin{verbatim} 39: $l90 = "0.552284749830794"; \end{verbatim} \end{small} To be able to dot areas which are contained in arbitrary closed polygons, the points get absolute coordinates $(x,y)$ with regard to the respective \verb|picture| environment, where $x$ and $y$ are even integers and $x+y$ is divisible by 4. Then \verb|$uli| and \verb|$ule| deliver the horizontal distance and the length of the 0.8 pt thick line segments which form a point. Like the ``circular number'' \verb|$Pi|, \verb|$l90| also represents a number constant which is required for the approximation of circular arcs through cubic B\'ezier curves. It is deduced in \cite{Ba} (Page 6). \begin{small} \begin{verbatim} 42 @lines = <>; 43 do { 44 $_ = $lines[$i++]; 45 if (/ setrgbcolor \s/o) { 46 s/ //go; 47 s/setrgbcolor\s/ /o; 48 $c = $_; 49 $_ = $lines[$i++]; 50 s/ moveto//o; 51 s/lineto stroke/stroke/o; 52 s/curveto stroke/curveto/o; 53 s/ setlinewidth stroke//o; 54 s/ lineto//go; 55 if (/stroke/o) { 56 $line[++$#line] = $c.$_; 57 } 58 elsif (/closepath fill/o) { 59 $vector[++$#vector] = $c.$_; 60 } 61 elsif (/arc /o) { 62 $circle[++$#circle] = $c.$_; 63 } 64 elsif (/arcn/o) { 65 $arc[++$#arc] = $c.$_; 66 } 67 elsif (/curveto/o) { 68 do { 69 $conic[++$#conic] = $c.$_; 70 $_ = $lines[$i++]; 71 s/ moveto//o; 72 s/curveto stroke/curveto/o; 73 } 74 until $_ !~ /curveto/o; 75 } 76 } 77 } 78 until $i == $#lines; \end{verbatim} \end{small} With Lines 42 to 78, the required data are extracted from the PostScript file. Initially the array \verb|@lines| contains all lines. The successive assignment of each individual line to the general ``last result variable'' \verb|$_| takes place with Line 44. Next, the ``colour lines'' are looked for and condensed as described above. With Line 48, the result is assigned to the variable \verb|$c|. In the present version, only the next line has to be analysed subsequently. The commands for searching and replacing in Lines 50 to 54 care for unambiguity and for pure number sequences (apart from the last word). With PostScript versions which contain the data in a later line, it is helpful to attach the intermediate lines and the data line by removing the line breaks. Depending on the different line endings, the data are collected in five arrays. For example, Line 56 means that the array \verb|@line|, whose last element has the index \verb|$#line|, is extended by one field which holds the preceding colour variable \verb|$c| and the character string of the coordinates of the starting point and the end point of a line segment. For any arrow, Cabri Geometry writes the coordinates of the four arrowhead corners of a PSTricks style arrow into the PostScript file. With \texttt{CABpict.pl} these data are not needed if the colour of the arrow is violet because the plot command \verb|\vector| is then available. Otherwise the arrowhead consists of two filled triangles, and the arrow line is drawn as an unbroken or dotted line segment according to the colouring. The data of circles can be found in the lines ending with \verb*|arc |. Additionally a full circle is characterized by 0 and 360 as fourth and fifth value respectively. Therefore, circular arcs entered clockwise in Cabri Geometry can also be rec\-og\-nized in lines ending with \verb*|arc | because they contain the starting angle and the ending angle instead of 0 and 360. Lines with the data of circular arcs entered anticlockwise end with \verb|arcn|. The Macintosh version of Cabri Geometry offers the possibility of drawing con\-ic sections determined by five points. In the linked PostScript file, the data of approximating cubic B\'ezier curves are stored, namely nine for ellipses and four for each open branch. The values from the corresponding lines ending with \verb|curveto stroke| are stored in the array \verb|@conic|. These data can be processed directly with the plot command \verb|\cbezier|. \begin{small} \begin{verbatim} 80 $pflag = 1; 81 $sflag = 1; 82 $thicknessflag = 1; 83 $coun = 0; 84 $xtex = ""; 85 $mtex = ""; 86: $bmax = 500; 89: $btex = "\\documentclass{article}\n\\usepackage{ebezier}\n\n"; \end{verbatim} \end{small} These initialisations begin with flags for the starting corner of polygons, for the starting values of the bounding box and for the currently selected thickness of line segments. The parameter \verb|$coun| yields the numbers for the places of text and formulas. With \verb|$xtex|, the character string is set up which finally is written as \LaTeX{} text into the Perl output window through a \texttt{print} command. Since, in any case, the text markers have to be edited finally, temporary storing in \verb|$mtex| enables the positioning at the end of the \LaTeX{} text where they can easily be found. If B\'ezier curves with more than 500 points are generated with the package \verb|ebezier|, it is necessary to enlarge the \LaTeX{} value 500 of \verb|\qbeziermax|. Therefore, with the aid of the variable \verb|$bmax| the maximum number of points of B\'ezier curves is determined. If \verb|$bmax| exceeds 500, the value of \verb|\qbeziermax| is adjusted with \verb|\renewcommand| in the character string \verb|$btex| which contains the beginning of the corresponding \LaTeX{} program. The insertion of \verb|$btex| and \verb|$mtex| in \verb|$xtex| is described on page \pageref{Frame}. \begin{small} \begin{verbatim} 87 # Lines and polygons 88 $cflag = 1; 89 foreach (@line) { 90 @coo = split; 91 $co0 = $coo[0]; 92 $co2 = (-1) * $coo[2]; 93 $co4 = (-1) * $coo[4]; 94 if (($co0 ne $violet) and ($co0 ne $yellow)) { 95 if ($cflag) { \end{verbatim} \vspace{-4mm} \texttt{\mbox{\quad}96}\hspace{14mm}\verb|$xtex .= "%Lines, arrows, polygons and | \texttt{B\'ezier}\verb| curves\n";| \vspace{-4mm} \begin{verbatim} 97 $cflag = 0; 98 } 99 if ($co0 ne $blue) { 100 bound($coo[1],$co2); 101 bound($coo[3],$co4); 102 } 103 if (($co0 ne $red) and ($co0 ne $blue) and ($co0 ne $brown) 104 and ($co0 ne $darkbrown) and ($co0 ne $navy)) { 105 lin($co0,$coo[1],$co2,$coo[3],$co4); \end{verbatim} \end{small} Here begins the processing of the data of the arrays. Since these longer parts have a similar structure for most combinations of graphic programs, PostScript versions and \LaTeX{} packages, only essential or typical sections are explained as follows. The flag \verb|$cflag| ensures that in the \LaTeX{} program, the commentaries point\-ing out each of the emerging objects don't repeat permanently. With the \texttt{split} command the character strings delivered by \texttt{foreach} are transformed into lists of character strings which in our case are the numbers and the last words of the evaluated PostScript lines. In the shortened form of \texttt{split} used here, the spaces cause the separation of the character string of the last result value \verb|$_|. Since most branchings depend on at least one colour, first the list element with index 0 which contains the colour, is abbreviated. Subsequently the ``vertical reflection'' which is necessary in this version takes place multiplying each y-coordinate by -1. Line 96 yields a typical \LaTeX{} comment line because the character string which is added to \verb|$xtex| by \verb|.=| begins with the \verb|%| sign and ends with the line feed command \verb|\n| of Perl . With each of the Lines 100 and 101, the subroutine `\texttt{bound}' for the determination of the bounding box coordinates is called. It is defined in the Lines 944 to 957. In this case the coordinates of the starting point and the end point of line segments are evaluated. Objects with colour `\texttt{blue}' are excluded because the diagonal marking text or formulas is a two point polygon, and because for B\'ezier curves 51 points are considered. There are nine subroutines which can be found from Line 390 on (356 with \texttt{CABebez.pl}). The order of the subroutines plays no role. Therefore most of these procedures are described at their first appearance. The subroutine `\texttt{lin}' generates all line segments which have to be drawn. In \texttt{CABpict.pl}, the extended \verb|\line| command from \verb|pict2e| is available for unbroken line segments, whereas dotted line segments have to be drawn with the command \verb|\Lbezier| from the \texttt{ebezier} package. In \texttt{CABebez.pl} also all line segments which don't fulfill the \LaTeX{} conditions for slopes or lengths must be built up with the aid of \verb|\Lbezier|. \begin{small} \begin{verbatim} 107 if (($co0 ne $green) and ($co0 ne $darkgreen)) { 108 if ($pflag) { 109 $cb1 = $coo[1]; 110 $cb2 = $co2; 111 $pol = $co0." ".$cb1." ".$cb2; 112 $pflag = 0; 113 } 114 else { 115 $pol .= " ".$coo[1]." ".$co2; 116 if (abs($coo[3] - $cb1) + abs($co4 - $cb2) < 2.0E-6) { 117 $poly[++$#poly] = $pol; 118 $pflag = 1; \end{verbatim} \end{small} Here, for each polygon which has to be filled, dotted or hatched, the array \verb|@poly| emerges which contains the coordinates of the corners. \begin{small} \begin{verbatim} 123 if ($co0 eq $violet) { 124 $xtex .= "%Arrow\n"; ... 127 $dx = $coo[3] - $coo[1]; 128 $dy = $co4 - $co2; 129 $len = sp(abs($dx)); 130 if ($len > 1.0E-3) { 131 @p = best(abs($dy / $dx)); 132 $psx = sp($p[1]) * ($dx <=> 0); 133 $psy = sp($p[0]) * ($dy <=> 0); ... 140 $xb = sp($coo[1]); 141 $yb = sp($co2); 142 if (not $thicknessflag) { 143 $xtex .= "\\linethickness{0.8pt}\n"; 144 $thicknessflag = 1; 145 } 146 $xtex .= "\\put(".$xb.",".$yb."){\\vector(".$psx.",".$psy. "){".$len."}}\n"; \end{verbatim} \end{small} For the generation of unbroken line segments respectively of complete arrows with the package \texttt{pict2e}, the subroutine \texttt{best} is provided which yields the best possible numerators and denominators for the rational approximations of the slope with the aid of a continued fraction algorithm. Since, particularly, both components are relatively prime, it is practically no restraint that they must lie in the interval $[-1000,\,1000]$. With the two-line subroutine \texttt{sp}, the numbers which Cabri Geometry hands over to the PostScript file with six decimal places, as well as all other decimal numbers appearing in the \LaTeX{} \texttt{picture} environment, are rounded off to three places with removal of all concluding zeros. \begin{small} \begin{verbatim} 150 foreach (@poly) { 151 @po = split; 152 $p0 = $po[0]; 153 $pon = $#po; 154 if (($p0 eq $red) or ($p0 eq $purple) or ($p0 eq $darkbrown) 155 or ($p0 eq $orange) or ($p0 eq $brown)) { \end{verbatim} \end{small} The evaluation of the data of the array \verb|@poly| depends on the colour and on the index \verb|$pon=$#po| of the last element. \begin{small} \begin{verbatim} 156 if ($pon == 6) { 157 tri($p0,$po[1],$po[2],$po[3],$po[4],$po[5],$po[6]); \end{verbatim} \end{small} If \verb|$pon = 6|, then the subroutine \texttt{tri} is called which settles the filling, dotting and hatching of triangles . \begin{small} \begin{verbatim} 159 elsif ($pon == 8) { 160 ($p0,$u1,$v1,$u2,$v2,$u3,$v3,$u4,$v4) = @po; 161 $s1 = abs($u1 - $u4) + abs($u2 - $u3) + abs($v1 - $v2) + abs($v3 -$v4); 162 $s2 = abs($u1 - $u2) + abs($u3 - $u4) + abs($v1 - $v4) + abs($v2 -$v3); 163 if (($s1 < 4.0E-6) or ($s2 < 4.0E-6)) { ... 166 rect($p0,$u1,$v1,$u2,$v2,$u3,$v3,$u4,$v4); 167 } 168 else { ... 173 tri($p0,$u1,$v1,$u2,$v2,$u3,$v3); 174 tri($p0,$u1,$v1,$u3,$v3,$u4,$v4); 175 } 176 } 177 elsif ($pon > 8) { ... 179 for (my $j = 3; $j <= $pon - 3; $j += 2) { ... 181 tri($p0,$po[1],$po[2],$po[$j],$po[$j + 1],$po[$j + 2],$po[$j + 3]); \end{verbatim} \end{small} In case of \verb|$pon = 8|, rectangles with sides parallel to the axes are treated with the aid of the subroutine \texttt{rect}. This is simpler than the procedure for all other polygons which first have to be cut up in triangles. \begin{small} \begin{verbatim} 191 elsif ($p0 eq $blue) { 192 if ($pon == 4) { \end{verbatim} \vspace{-3.5mm} \hspace{5.5pt}\texttt{193\mbox{ }\# Text marker and B\'ezier curves:} \vspace{-3.5mm} \begin{verbatim} 194 $coun++; ... 201 $mtex .= "\\put(".$po1.",".$po2."){".$coun."}\n"; 202 } 203 elsif ($pon == 6) { \end{verbatim} \vspace{-3.5mm} \hspace{6pt}\texttt{204}\hspace{14mm}\verb|$xtex .= "%Quadratic | \texttt{B\'ezier}\verb| curve\n";| \vspace{-3.5mm} \begin{verbatim} 205 qbez($po[1],$po[2],$po[3],$po[4],$po[5],$po[6]); 206 } 207 elsif ($pon == 8) { \end{verbatim} \vspace{-3.5mm} \hspace{6pt}\texttt{208}\hspace{14mm}\verb|$xtex .= "%Cubic | \texttt{B\'ezier}\verb| curve\n";| \vspace{-3.5mm} \begin{verbatim} 209 cbez($po[1],$po[2],$po[3],$po[4],$po[5],$po[6],$po[7], $po[8]); \end{verbatim} \end{small} With colour \verb|$blue|, \verb|$pon = 4| yields the text markers, whereas \verb|$pon = 6| and \verb|$pon = 8| lead to the call of the subroutines \texttt{qbez} for quadratic B\'ezier curves and \texttt{cbez} for cubic B\'ezier curves respectively. \begin{small} \begin{verbatim} 214 # Arrows 215 foreach (@vector) { 216 @ve = split; 217 if ($ve[0] eq $darkgreen) { ... 235 tri($red,$vu0,$vu1,$vu2,$vu3,$ve[5],$ve[6]); 236 tri($red,$vu0,$vu1,$vu6,$vu7,$ve[5],$ve[6]); \end{verbatim} \end{small} Here, as already mentioned above, for arrows with a dotted arrow line (and always for arrows in \texttt{CABebez.pl}) the arrowhead is put together joining two filled triangles. \begin{small} \begin{verbatim} 258 # Circles, halves and quarters of circles 259 $cflag = 1; 260 $aflag = 1; 261 foreach (@circle) { 262 @po = split; 263 $p0 = $po[0]; 264 if ($p0 ne $yellow) { 265 $po[2] = (-1) * $po[2]; 266 $di = 2 * $po[3]; 267 if ($po[4] > 1.0E-3 or abs($po[5] - 360) > 1.0E-3) { 268 if ($aflag) { 269 $xtex .= "%Arcs\n"; 270 $aflag = 0; 271 } 272 $arce = ($po[4] > 0) ? 360 - $po[4] : 0; 273 $arcb = ($po[5] > 0) ? 360 - $po[5] : 0; 274 $darc = $arce - $arcb; 275 if ($darc < 0) {$darc += 360} 276 $quar = int($darc / 90); 277 if ($quar > 0) { 278 for (my $k = 1; $k <= $quar; $k++) { 279 arc($p0,$po[1],$po[2],$po[3],$arcb,$arcb + 90); 280 $arcb += 90; 281 if ($arcb > 360) {$arcb -= 360} 282 } 283 } 284 if ($darc > $quar * 90) { 285 arc($p0,$po[1],$po[2],$po[3],$arcb,$arce); 286 } 287 } 288 else { 289 if ($cflag) { 290 $xtex .= "%Circles, halves and quarters of circles\n"; 291 $cflag = 0; 292 } 293 if ($p0 eq $navy) { 294 $xtex .= "\\put(".$po[1].",".$po[2]."){\\circle{".$di. "}}\n"; ... 299 } 300 elsif ($p0 eq $purple) { 301 $xtex .= "\\put(".$po[1].",".$po[2]."){\\oval[".$di."] (".$di.",".$di.")[l]}\n"; ... 340 elsif ($p0 eq $darkgreen) { 341 $r = $po[3]; 342 $le = int(2 * $pointf * $ul * $Pi * $r); 343 $xtex .= "\\cCircle[".$le."](".$po[1].",".$po[2].") {".$r."}[f]\n"; \end{verbatim} \end{small} Circular arcs are cut up to quadrants of a circle and to a shorter remaining arc. In \texttt{CABebez.pl} the subroutine \texttt{quart} approximates all quadrants of a circle (and with that, also circles and semicircles) by a cubic B\'ezier curve. With \texttt{pict2e}, the plot commands \verb|\oval| and \verb|\circle| are available without restraints. For all remaining circular arcs the subroutine \texttt{arc} supplies the approximation by a cubic B\'ezier curve. The plot command \verb|\cCircle| of the package \texttt{ebezier} is used to get dotted circles in \texttt{CABpict.pl}. \label{Frame} \begin{small} \begin{verbatim} 379 # Frame 380 if ($xtex . $mtex ne "") { 381 $xtex = "\\documentclass{article}\n\\usepackage{ebezier}\n". 382 "\\usepackage[pdftex,pstarrows]{pict2e}\n\n \\begin{document}\n\n". 383 "\\setlength{\\unitlength}{".$ul."pt}\n". 384 "\\begin{picture}(".ceil(($xmax - $xmin)).",". 385 ceil(($ymax - $ymin)).")(".floor($xmin).",".floor($ymin).")\n". 386 "\\linethickness{0.8pt}\n"."\\thicklines\n".$xtex; 387 $xtex .= $mtex."\\end{picture}\n\n\\end{document}"; 388 } 389 print $xtex."\n"; 342: if ($bmax > 500) { 343: $bmax = 100 * ceil($bmax / 100); 344: $btex .= "\\renewcommand{\\qbeziermax}{".$bmax."}\n"; 345: } 346: if ($xtex . $mtex ne "") { 347: $xtex = $btex."\\begin{document}\n\n\\setlength{\\unitlength}{". 348: $ul."pt}\n"."\\begin{picture}(".ceil(($xmax - $xmin)).",". 349: ceil(($ymax - $ymin)).")(".floor($xmin).",".floor($ymin).")\n". \end{verbatim} \end{small} Here the different parts of the character string \verb|$xtex| are united and written into the Perl output window by the \verb|print| command. Since the subsequently assembled subroutines can be used in other versions large\-ly unchanged, now follow only comments which explain the underlying theory. In the main part of \texttt{best}, the entered decimal number is transformed into a continued fraction. Then, among all principal and intermediate convergents which are ``best approximations'', the one with the greatest possible numerator or denominator is determined. \begin{small} \begin{verbatim} 536 # Triangles 537 sub tri { 538 my ($q0,$qx1,$qy1,$qx2,$qy2,$qx3,$qy3) = @_; ... 545 if ($q0 eq $red) { 546 # Filled triangle 547 %ha = ($qx1,$qy1,$qx2+1e-07,$qy2+1e-07,$qx3+2e-07, $qy3+2e-07); 548 @hb = (); 549 @hc = (); 550 foreach (sort { $ha{$a} <=> $ha{$b} } keys %ha) { 551 $hb[++$#hb] = $_; 552 $hc[++$#hc] = $ha{$_}; 553 } 554 ($qx1,$qx2,$qx3) = @hb; 555 ($qy1,$qy2,$qy3) = @hc; \end{verbatim} \end{small} Each of the three parts of \texttt{tri} begins with sorting out corners: For filling and dott\-ing, they are ordered according to the size of the $y$-coordinates and for hatching, the order depends on the difference of both coordinates. For the sorting method used by Perl for the data type ``hash'', it should be taken into account that in our case, each of the two associated arrays must consist of different elements. Here, this is achieved by changing the seventh place behind the decimal point. If, after sorting, one imagines a straight line passing through the first and third corner, linear algebra yields the half-plane bordered by the straight line and containing the second corner. Then, starting with the connecting line segment of the first and third corner and with distinction of cases concerning the second point, the objects which have to be inserted are constructed. The intermediate points of quadratic and cubic B\'ezier curves needed for their bounding box are calculated with the formulas of Section 4. The coefficients of cubic B\'ezier curves which approximate parts of quadrants of circles in the subroutine \texttt{arc} are derived in \cite{Ba} (Pages 11\,f). \section{The \texttt{picture} environment of \LaTeX} Using the capacity of geometry software or of drawing programs, also further advantages of the \LaTeX{} \texttt{picture} environment compared with the \verb|\special| command come into effect: \\[-6mm] \begin{list}{$\bullet$}{ \setlength{\labelwidth}{3mm} \setlength{\leftmargin}{7mm} } \item All graphic data are integrated in the \TeX{} file. Particularly, no graphic files can get lost during dissemination.\vspace{1mm} \item \LaTeX{} proves its flexibility mainly with the positioning using \texttt{minipages} or \texttt{floats} (sliding objects). Since the filter programs yield the size of the bound\-ing box as well as the offset value (for the upper left corner), each figure can directly be placed in a \texttt{minipage}. Using that it can be moved horizontally and vertically, for example, applying the commands \verb|\hspace| and \verb|\raisebox| (see Figures 1 to 5).\vspace{1mm} \item The final processing of figures can be done in the usual cycle edit-typeset-preview.\vspace{1mm} \item Even in documents with numerous complicated figures, memory requirements can well be estimated and, particularly, applying \texttt{pict2e}, they are surpris\-ing\-ly low. But also with the \texttt{ebezier} package, in \textsc{Big}\TeX{} versions no lack of memory has to be expected.\vspace{1mm} \item If PDF files are generated from \LaTeX{} productions, the figures are taken over automatically. \end{list} The completion of the \LaTeX{} \texttt{picture} environment with commands from the \texttt{color} package mentioned in Section 3 is possible only with restraints. Due to a technical difficulty, \TeX{} possibly inserts vertical space at each change of colour (see \cite{Car}, Page 6). Therefore, without complicated corrections, only figures can be coloured for which all connected parts have the same colour. The development of filter programs for \LaTeX{} was initiated by the author's wish to take over about 80 figures created with the drawing program STAD on Atari computers into a book designed with \LaTeX{} on Macintosh computers. The figures were traced with the drawing program ClarisDraw, and the PostScript versions were transformed to \LaTeX{} \texttt{picture} environments with an AppleScript program. This first functioning PostScript filter program can be found in \cite{Mo} in the section `Programme'. \begin{thebibliography}{9} \setlength{\baselineskip}{18pt} \bibitem{Ad} Adobe, Systems Incorporated: PostScript Language Reference Manual. Addison-Wesley, 2nd edition, 1995. \bibitem{Ba} Bachmaier, Gerhard A.: Using \texttt{ebezier}. Package in CTAN:\texttt{/macros/latex/contrib/ebe-} \texttt{zier}, 2002. \bibitem{Car} Carlisle, David P.: Packages in the `graphics' bundle. CTAN:\texttt{/macros/latex/required} \texttt{/graphics/grfguide.pdf}, 1999/2004. \bibitem{GaNi} G\"a{\ss}lein, Hubert and Niepraschk, Rolf: The \texttt{pict2e}-package. Package in CTAN:\texttt{/macros} \texttt{/latex/contrib/pict2e/pict2e.dtx}, 2003. \bibitem{GRM} Goossens, Michel, Rahtz, Sebastian and Mittelbach, Frank: The \LaTeX{} Graphics Compan\-ion. Addison-Wesley, Reading MA, 1997. \bibitem{Mo} M\"oller, Herbert: \emph{Mathcompass} (\texttt{http://wwwmath1.uni-muenster.de/u/mollerh}). \bibitem{Ni} Nickalls, Richard W.D.: MathsPIC. CTAN:\texttt{/graphics/pictex/mathspic}, 1999. \bibitem{NiSy} Nickalls, Richard W.D. and Apostolos Syropoulos: $mathsPIC_{Perl}.$ CTAN:\texttt{/graphics} \texttt{/pictex/mathspic/Perl}, 2005. \bibitem{Wi} Wichura, Michael J.: The $\mathrm{P_{\D I}CT_{\D E}X}$ Manual, 1992. Package in CTAN:\texttt{/graphics/pictex}. \end{thebibliography} \end{document}