1 /* paren.c 4.2 83/02/12 */ 2 3 # include "e.h" 4 5 paren(leftc, p1, rightc) int p1, leftc, rightc; { 6 int n, m, h1, j, b1, v; 7 h1 = eht[p1]; b1 = ebase[p1]; 8 yyval = p1; 9 #ifndef NEQN 10 lfont[yyval] = rfont[yyval] = 0; 11 n = (h1+(6*EFFPS(ps)-1))/(6*EFFPS(ps)); 12 #else NEQN 13 n = max(b1+VERT(1), h1-b1-VERT(1)) / VERT(1); 14 #endif NEQN 15 if( n<2 ) n = 1; 16 m = n-2; 17 if (leftc=='{' || rightc == '}') { 18 n = n%2 ? n : ++n; 19 if( n<3 ) n=3; 20 m = n-3; 21 } 22 #ifndef NEQN 23 eht[yyval] = VERT(6 * ps * n); 24 ebase[yyval] = b1 + (eht[yyval]-h1)/2; 25 v = b1 - h1/2 + VERT( (ps*6*4)/10 ); 26 #else NEQN 27 eht[yyval] = VERT(2 * n); 28 ebase[yyval] = (n)/2 * VERT(2); 29 if (n%2 == 0) 30 ebase[yyval] -= VERT(1); 31 v = b1 - h1/2 + VERT(1); 32 #endif NEQN 33 printf(".ds %d \\|\\v'%du'", yyval, v); 34 switch( leftc ) { 35 case 'n': /* nothing */ 36 case '\0': 37 break; 38 case 'f': /* floor */ 39 if (n <= 1) 40 printf("\\(lf"); 41 else 42 brack(m, "\\(bv", "\\(bv", "\\(lf"); 43 break; 44 case 'c': /* ceiling */ 45 if (n <= 1) 46 printf("\\(lc"); 47 else 48 brack(m, "\\(lc", "\\(bv", "\\(bv"); 49 break; 50 case '{': 51 printf("\\b'\\(lt"); 52 for(j = 0; j < m; j += 2) printf("\\(bv"); 53 printf("\\(lk"); 54 for(j = 0; j < m; j += 2) printf("\\(bv"); 55 printf("\\(lb'"); 56 break; 57 case '(': 58 brack(m, "\\(lt", "\\(bv", "\\(lb"); 59 break; 60 case '[': 61 brack(m, "\\(lc", "\\(bv", "\\(lf"); 62 break; 63 case '|': 64 brack(m, "|", "|", "|"); 65 break; 66 default: 67 brack(m, (char *) &leftc, (char *) &leftc, (char *) &leftc); 68 break; 69 } 70 printf("\\v'%du'\\*(%d", -v, p1); 71 if( rightc ) { 72 printf("\\|\\v'%du'", v); 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 printf("\\v'%du'", -v); 107 } 108 printf("\n"); 109 if(dbg)printf(".\tcurly: h=%d b=%d n=%d v=%d l=%c, r=%c\n", 110 eht[yyval], ebase[yyval], n, v, leftc, rightc); 111 } 112 113 brack(m, t, c, b) int m; char *t, *c, *b; { 114 int j; 115 printf("\\b'%s", t); 116 for( j=0; j<m; j++) 117 printf("%s", c); 118 printf("%s'", b); 119 } 120