1 #ifndef lint 2 static char sccsid[] = "@(#)paren.c 2.2 (CWI) 87/04/01"; 3 #endif lint 4 # include "e.h" 5 6 paren(leftc, p1, rightc) 7 int p1, leftc, rightc; 8 { 9 int n, m, j; 10 float h1, b1, v; 11 extern float Parenbase; 12 13 h1 = eht[p1]; 14 b1 = ebase[p1]; 15 yyval = p1; 16 lfont[yyval] = rfont[yyval] = 0; 17 n = REL(h1,ps) + 0.99; /* ceiling */ 18 if (n < 2) 19 n = 1; 20 m = n - 2; 21 if (leftc == '{' || rightc == '}') { 22 n = n%2 ? n : ++n; 23 if (n < 3) 24 n = 3; 25 m = n-3; 26 } 27 eht[yyval] = EM((float) n, ps); 28 ebase[yyval] = eht[yyval]/2 - EM(Parenbase, ps); 29 /* v = REL(-ebase[yyval] + (eht[yyval]-h1)/2 + b1, ps); */ 30 v = 0; /* in other words, don't shift it at all */ 31 printf(".ds %d \\|", yyval); 32 switch (leftc) { 33 case 'n': /* nothing */ 34 case '\0': 35 break; 36 case 'f': /* floor */ 37 if (n <= 1) 38 printf("\\(lf"); 39 else 40 brack(m, "\\(bv", "\\(bv", "\\(lf"); 41 break; 42 case 'c': /* ceiling */ 43 if (n <= 1) 44 printf("\\(lc"); 45 else 46 brack(m, "\\(lc", "\\(bv", "\\(bv"); 47 break; 48 case '{': 49 printf("\\b'\\(lt"); 50 for(j = 0; j < m; j += 2) printf("\\(bv"); 51 printf("\\(lk"); 52 for(j = 0; j < m; j += 2) printf("\\(bv"); 53 printf("\\(lb'"); 54 break; 55 case '(': 56 brack(m, "\\(lt", "\\(bv", "\\(lb"); 57 break; 58 case '[': 59 brack(m, "\\(lc", "\\(bv", "\\(lf"); 60 break; 61 case '|': 62 brack(m, "|", "|", "|"); 63 break; 64 default: 65 brack(m, (char *) &leftc, (char *) &leftc, (char *) &leftc); 66 break; 67 } 68 if (v) 69 printf("\\v'%gm'\\*(%d\\v'%gm'", -v, p1, v); 70 else 71 printf("\\*(%d", p1); 72 if (rightc) { 73 switch (rightc) { 74 case 'f': /* floor */ 75 if (n <= 1) 76 printf("\\(rf"); 77 else 78 brack(m, "\\(bv", "\\(bv", "\\(rf"); 79 break; 80 case 'c': /* ceiling */ 81 if (n <= 1) 82 printf("\\(rc"); 83 else 84 brack(m, "\\(rc", "\\(bv", "\\(bv"); 85 break; 86 case '}': 87 printf("\\b'\\(rt"); 88 for(j = 0; j < m; j += 2) printf("\\(bv"); 89 printf("\\(rk"); 90 for(j = 0; j < m; j += 2) printf("\\(bv"); 91 printf("\\(rb'"); 92 break; 93 case ']': 94 brack(m, "\\(rc", "\\(bv", "\\(rf"); 95 break; 96 case ')': 97 brack(m, "\\(rt", "\\(bv", "\\(rb"); 98 break; 99 case '|': 100 brack(m, "|", "|", "|"); 101 break; 102 default: 103 brack(m, (char *) &rightc, (char *) &rightc, (char *) &rightc); 104 break; 105 } 106 } 107 printf("\n"); 108 dprintf(".\tcurly: h=%g b=%g n=%d v=%g l=%c, r=%c\n", 109 eht[yyval], ebase[yyval], n, v, leftc, rightc); 110 } 111 112 brack(m, t, c, b) 113 int m; 114 char *t, *c, *b; 115 { 116 int j; 117 printf("\\b'%s", t); 118 for( j=0; j < m; j++) 119 printf("%s", c); 120 printf("%s'", b); 121 } 122