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