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