1 /* paren.c 4.1 83/02/11 */ 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 lfont[yyval] = rfont[yyval] = 0; 10 n = (h1+(6*EFFPS(ps)-1))/(6*EFFPS(ps)); 11 if( n<2 ) n = 1; 12 m = n-2; 13 if (leftc=='{' || rightc == '}') { 14 n = n%2 ? n : ++n; 15 if( n<3 ) n=3; 16 m = n-3; 17 } 18 eht[yyval] = VERT(6 * ps * n); 19 ebase[yyval] = b1 + (eht[yyval]-h1)/2; 20 v = b1 - h1/2 + VERT( (ps*6*4)/10 ); 21 printf(".ds %d \\|\\v'%du'", yyval, v); 22 switch( leftc ) { 23 case 'n': /* nothing */ 24 case '\0': 25 break; 26 case 'f': /* floor */ 27 if (n <= 1) 28 printf("\\(lf"); 29 else 30 brack(m, "\\(bv", "\\(bv", "\\(lf"); 31 break; 32 case 'c': /* ceiling */ 33 if (n <= 1) 34 printf("\\(lc"); 35 else 36 brack(m, "\\(lc", "\\(bv", "\\(bv"); 37 break; 38 case '{': 39 printf("\\b'\\(lt"); 40 for(j = 0; j < m; j += 2) printf("\\(bv"); 41 printf("\\(lk"); 42 for(j = 0; j < m; j += 2) printf("\\(bv"); 43 printf("\\(lb'"); 44 break; 45 case '(': 46 brack(m, "\\(lt", "\\(bv", "\\(lb"); 47 break; 48 case '[': 49 brack(m, "\\(lc", "\\(bv", "\\(lf"); 50 break; 51 case '|': 52 brack(m, "|", "|", "|"); 53 break; 54 default: 55 brack(m, (char *) &leftc, (char *) &leftc, (char *) &leftc); 56 break; 57 } 58 printf("\\v'%du'\\*(%d", -v, p1); 59 if( rightc ) { 60 printf("\\|\\v'%du'", v); 61 switch( rightc ) { 62 case 'f': /* floor */ 63 if (n <= 1) 64 printf("\\(rf"); 65 else 66 brack(m, "\\(bv", "\\(bv", "\\(rf"); 67 break; 68 case 'c': /* ceiling */ 69 if (n <= 1) 70 printf("\\(rc"); 71 else 72 brack(m, "\\(rc", "\\(bv", "\\(bv"); 73 break; 74 case '}': 75 printf("\\b'\\(rt"); 76 for(j = 0; j< m; j += 2)printf("\\(bv"); 77 printf("\\(rk"); 78 for(j = 0; j< m; j += 2) printf("\\(bv"); 79 printf("\\(rb'"); 80 break; 81 case ']': 82 brack(m, "\\(rc", "\\(bv", "\\(rf"); 83 break; 84 case ')': 85 brack(m, "\\(rt", "\\(bv", "\\(rb"); 86 break; 87 case '|': 88 brack(m, "|", "|", "|"); 89 break; 90 default: 91 brack(m, (char *) &rightc, (char *) &rightc, (char *) &rightc); 92 break; 93 } 94 printf("\\v'%du'", -v); 95 } 96 printf("\n"); 97 if(dbg)printf(".\tcurly: h=%d b=%d n=%d v=%d l=%c, r=%c\n", 98 eht[yyval], ebase[yyval], n, v, leftc, rightc); 99 } 100 101 brack(m, t, c, b) int m; char *t, *c, *b; { 102 int j; 103 printf("\\b'%s", t); 104 for( j=0; j<m; j++) 105 printf("%s", c); 106 printf("%s'", b); 107 } 108