home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / unix / unix_mac.hqx (.txt) < prev    next >
LaTeX Document  |  1987-02-12  |  10KB  |  268 lines

  1. 12-Feb-87 02:12:24-MST,9995;000000000000
  2. Return-Path: <INFO-MAC-REQUEST@SUMEX-AIM.STANFORD.EDU>
  3. Received: from SUMEX-AIM.STANFORD.EDU by SIMTEL20.ARPA with TCP; Thu 12 Feb 87 02:11:57-MST
  4. Return-Path: <weber%brand@usc-oberon.ARPA>
  5. Received: from usc-oberon.ARPA by SUMEX-AIM.STANFORD.EDU with TCP; Mon 2 Feb 87 11:57:10-PST
  6. Received: from brand by usc-oberon.ARPA (5.51/5.5) id AA08286; 
  7.                 Mon, 2 Feb 87 11:44:45 PST
  8. Received: by brand (4.12/5.2) id AA04880; 
  9.                 Mon, 2 Feb 87 11:44:14 pst
  10. Date: Mon, 2 Feb 87 11:44:14 pst
  11. From: Allan G. Weber <weber%brand@usc-oberon.ARPA>
  12. Message-Id: <8702021944.AA04880@brand>
  13. Subject: Unix program for MacDraw->Imagen (3 of 3)
  14. Newsgroups: mod.mac.sources
  15. Distribution: na
  16. To: info-mac@sumex-aim.arpa
  17. ReSent-Date: Wed 11 Feb 87 23:39:18-PST
  18. ReSent-From: Dwayne Virnau... <INFO-MAC-REQUEST@SUMEX-AIM.STANFORD.EDU>
  19. ReSent-To: info-mac-redist: ;
  20. ReSent-Message-ID: <12278384285.26.INFO-MAC-REQUEST@SUMEX-AIM.STANFORD.EDU>
  21. This is part 1 of 3 of "drawimp", a program that runs on Unix to convert
  22. MacDraw files into Impress commands for printing on Imagen laser printers.
  23.                 Allan Weber
  24.                 USC Signal and Image Processing Institute
  25.                 (213) 743-5519
  26.                 Arpa:    Weber%Brand@USC-Oberon.ARPA
  27.                 UUCP:    ...sdcrdcf!usc-oberon!brand!weber
  28. ----------------------------------------------------------------------
  29. #! /bin/sh
  30. # This is a shell archive, meaning:
  31. # 1. Remove everything above the #! /bin/sh line.
  32. # 2. Save the resulting text in a file.
  33. # 3. Execute the file with /bin/sh (not csh) to create the files:
  34. #    README.SPCL
  35. #    special.c
  36. #    PicMacros.tex
  37. # This archive created: Mon Feb  2 11:06:56 1987
  38. export PATH; PATH=/bin:$PATH
  39. if test -f 'README.SPCL'
  40.     echo shar: will not over-write existing file "'README.SPCL'"
  41. cat << \SHAR_EOF > 'README.SPCL'
  42.     Instruction for using putting MacDraw files in LaTeX documents
  43. The following files are needed to use the TeX/LaTeX option of drawimp.
  44.     special.c - Handles the \special command for including files
  45.         with Impress commands in the output stream.
  46.     PicMacros.tex - TeX and LaTeX macros
  47. You must be using the "imagen1" dvi-to-impress driver in order to make this
  48. stuff work.  This was the driver that came with the TeX distribution tape we
  49. purchased.  There may be others that could be made to work also.  Imagen1
  50. handles \special's with a routine that reads the data and ignores it.
  51. Special.c has a new routine for handling the \special command and needs to
  52. be linked in with the rest of imagen1.c First, go into your copy of
  53. imagen1.c and find the routine "DoSpecial".  Delete or comment out the
  54. DoSpecial in imagen1.c so the one in special.c will be used instead.
  55. Compile imagen1.c and special.c, link them together with whatever else is
  56. needed, and move imagen1 to where it will be found by the shell scripts that
  57. drive the Imagen printer.
  58. The following assumes something like MacTerminal and macget have been used
  59. to upload the MacDraw files to Unix.  Normally this leaves three files on
  60. Unix for each Mac file, with extensions .data, .info, and .rsrc.  The .info
  61. and .rsrc files can be deleted.  Move all the .data files to one place and
  62.     % drawimp -t *.data
  63. This will cause drawimp to process each MacDraw .data file into a separate
  64. file containing Impress commands with the same name except ending in .imp.
  65. If there are text objects in any of the pictures, it is important that all
  66. the MacDraw files be processed together in this way.  If a new picture is
  67. added later, they should all be processed again or the fonts used in the
  68. pictures will get mixed up.  
  69. In the LaTeX file, pictures are include with lines like
  70.     \DrawPicture{500}{200}{filename}
  71. The first and second arguments are the width and height respectively of the
  72. box area to reserve for the picture.  They are specified in the current
  73. units as set by \setlength{\unitlength}{0.01in} or something similar.  The
  74. picture can be larger or smaller than this, but LaTeX will reserve space
  75. according to these parameters.  The top-left corner of the active area of
  76. the picture will be placed on the page at the top-left corner of the
  77. reserved area.  The picture does not have to be pushed to the top-left of
  78. the MacDraw document page in order for drawimp to find it.  The DrawPicture
  79. macro will center the reserved picture area horizontally on the page.  The
  80. third parameter is the file name of the picture file as processed by
  81. "drawimp -t".  See the macro definition for more info.
  82. Send any comments or bug reports to "Weber%Brand@USC-ECL.ARPA"
  83.                 Allan Weber
  84.                 USC Signal and Image Processing Inst.
  85.                 PHE 306, MC-0272
  86.                 L.A., CA  90089-0272
  87.                 (213) 743-5519
  88. SHAR_EOF
  89. fi # end of overwriting check
  90. if test -f 'special.c'
  91.     echo shar: will not over-write existing file "'special.c'"
  92. cat << \SHAR_EOF > 'special.c'
  93.     Routines for handling \special commands.  Currently only supports
  94.     inserting impress data from external files.  Bitmap stuff is not
  95.     complete.
  96.     Allan Weber (Weber%Brand@USC-ECL.ARPA) - 9/12/86
  97. /* #define DEBUG */
  98. #include <stdio.h>
  99. #include <ctype.h>
  100. extern char *malloc();
  101. extern int   errno;
  102. extern int ImHH, ImVV, hh, vv;
  103. int S_bitmap();
  104. int S_impress();
  105. char *nb();
  106. struct spec {
  107.     char *name;
  108.     int  (*func)();
  109. } spectbl[] = {
  110.     "bitmap",  S_bitmap,
  111.     "impress", S_impress,
  112.     "", NULL
  113. /* Perform a \special */
  114. DoSpecial (len)
  115. int len;            /* length of the \special string */
  116.     struct spec *s;
  117.     char *p;
  118.     register char ch, *p1, *p2;
  119.     if (ImHH != hh || ImVV != vv)    /* flush out any pending moves */
  120.         ImSetPosition (hh, vv);
  121.     p1 = p = malloc(len + 1);
  122.     while (len--)            /* read the special string */
  123.         *p1++ = getc(stdin);
  124.     *p1 = '\0';
  125. #ifdef DEBUG
  126.     fprintf(stderr,"special: '%s'\n",p);
  127. #endif
  128.     p1 = nb(p);        /* skip leading blanks */    
  129.     if (*p1 == '\0')    /* if nothing left, return */
  130.         return;
  131.     p2 = p1;
  132.     while ((ch = *p2) != '\0' && !isspace(ch)) /* find end of 1st word */
  133.         p2++;
  134.     if (ch != '\0') {    /* more than one word? */
  135.         *p2++ = '\0';    /* mark end of first word */
  136.         p2 = nb(p2);    /* point to start of rest of string */
  137.     s = spectbl;
  138.     while (s->func != NULL) {
  139.         if (strcmp(p1,s->name) == 0) {
  140.             (s->func)(p1,p2);
  141.             return;
  142.         else
  143.             s++;
  144.     free(p);    
  145. split - separate the words in string s, placing a '\0' after each one
  146. and setting the elements of tok to point to the beginning of each word.
  147. Only do this for up to max words.  Return the number of words found.
  148. static split(s,tok,max)
  149. register char *s;
  150. char *tok[];
  151.     int i, n;
  152.     register char ch;
  153.     n = 0;
  154.     for (i = 0; i < max; i++) {
  155.         s = nb(s);            /* find word start */
  156.         if ((ch = *s) != '\0') {    /* did we find one? */
  157.             tok[i] = s;
  158.             n++;
  159.             while ((ch = *s) != '\0' && !isspace(ch))
  160.                 s++;        /* find end of word */
  161.             if (ch != '\0')        /* mark end of word */
  162.                 *s++ = '\0';
  163.         else
  164.             tok[i] = NULL;
  165.     return(n);
  166. char *nb(s)
  167. char *s;
  168.     register char ch;
  169.     while ((ch = *s) != '\0' && isspace(ch))
  170.         s++;
  171.     return(s);
  172. /* --------------------------------------------------------------------- */
  173. static S_bitmap(s1, s2)
  174. char *s1, *s2;
  175.     int i, n, fd;
  176.     int rows, cols, wrows, wcols, wroff, wcoff;
  177.     char *p, *word[7];
  178. #ifdef DEBUG
  179.     fprintf(stderr,"in bitmap: s1='%s', s2='%s'\n",s1,s2);
  180. #endif
  181.     p = malloc(strlen(s2) + 1);
  182.     strcpy(p,s2);
  183.     n = split(p,word,7);
  184. #ifdef DEBUG
  185.     fprintf(stderr, "split into %d words\n",n);
  186.     for (i = 0; i < n; i++)
  187.         fprintf(stderr,"%d: '%s'\n",i,word[i]);
  188. #endif
  189. #ifndef DEBUG
  190.     if ((fd = open(word[0], 0)) == -1) {
  191.         error (1, errno, "can't open %s", s2);
  192.     if (n < 7)        /* no window offset */
  193.         word[6] = word[5] = "0";
  194.     if (n < 5) {        /* full window */
  195.         word[3] = word[1];
  196.         word[4] = word[2];
  197.     if (n < 3) {        /* need at least the dimensions */
  198.         error(1, 0, "\"\\special bitmap\" not enough arguments");
  199.         free(p);
  200.         return;
  201.     rows = atoi(word[1]); cols = atoi(word[2]);
  202.     wrows = atoi(word[3]); wcols = atoi(word[4]);
  203.     wroff = atoi(word[5]); wcoff = atoi(word[6]);
  204.     close(fd);
  205. #endif
  206.     free(p);
  207. static S_impress(s1, s2)
  208. char *s1, *s2;
  209.     FILE *fp;
  210.     int n, h, v, ch;
  211.     char *p, *word[3];
  212. #ifdef DEBUG
  213.     fprintf(stderr,"in impress: s1='%s', s2='%s'\n",s1,s2);
  214. #endif
  215. #ifndef DEBUG
  216.     p = malloc(strlen(s2) + 1);
  217.     strcpy(p,s2);
  218.     n = split(p,word,3);
  219.     if ((fp = fopen(word[0], "r")) == NULL) {
  220.         error (1, errno, "can't open %s", word[0]);
  221.     putchar(211);        /* push */
  222.     if (n == 3) {        /* absolute move specified */
  223.         if (sscanf(word[1],"%d", &h) == 1) {
  224.             putchar(135);
  225.             putchar((h >> 8) & 255);
  226.             putchar(h & 255);
  227.         if (sscanf(word[2],"%d", &v) == 1) {
  228.             putchar(137);
  229.             putchar((v >> 8) & 255);
  230.             putchar(v & 255);
  231.     while ((ch = getc(fp)) != EOF || !feof(fp))
  232.         putchar(ch);
  233.     putchar(212);        /* pop */
  234.     fclose(fp);
  235. #endif
  236. SHAR_EOF
  237. fi # end of overwriting check
  238. if test -f 'PicMacros.tex'
  239.     echo shar: will not over-write existing file "'PicMacros.tex'"
  240. cat << \SHAR_EOF > 'PicMacros.tex'
  241. \def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}
  242. \ifundefined{newcommand}
  243.             % define DrawPicture for TeX
  244. \long\gdef\DrawPicture#1#2#3
  245.  {\centerline
  246.     {\vbox to #1pt
  247.         {\hbox to #2pt
  248.         {\special{impress #3}}
  249. \else
  250.             % define DrawPicture for LaTeX
  251. % output some impress data at current location on page
  252. \newcommand{\Impress}[1]
  253.   \makebox(0,0){\special{impress #1}}
  254. % put a picture on page (use for multiple pictures across page)
  255. \newcommand{\PutPicture}[3]
  256.   \begin{picture}(#1,#2)
  257.     \put(0,#2){\Impress{#3}}
  258.   \end{picture}
  259. % put a centered picture on page (use for single picture across page)
  260. \newcommand{\DrawPicture}[3]
  261.   \begin{center}
  262.     \PutPicture{#1}{#2}{#3}
  263.   \end{center}
  264. SHAR_EOF
  265. fi # end of overwriting check
  266. #    End of shell archive
  267. exit 0
  268.