|
|
1.1 ! root 1: #include "e.h" ! 2: ! 3: #define abs(x) ((x) > 0 ? (x) : (-(x))) ! 4: ! 5: extern void brack(int, char *, char *, char *); ! 6: ! 7: void paren(int leftc, int p1, int rightc) ! 8: { ! 9: int n, m, j; ! 10: double h1, b1; ! 11: double v, bv; /* v = shift of inside, bv = shift of brackets */ ! 12: extern double Parenbase, Parenshift, Parenheight; ! 13: ! 14: bv = ttype == DEVPOST ? Parenshift : 0; /* move brackets down this much */ ! 15: h1 = eht[p1]; ! 16: b1 = ebase[p1]; ! 17: yyval = p1; ! 18: lfont[yyval] = rfont[yyval] = 0; ! 19: n = REL(h1,ps) + 0.99; /* ceiling */ ! 20: if (n < 2) ! 21: n = 1; ! 22: m = n - 2; ! 23: if (leftc == '{' || rightc == '}') { ! 24: n = n%2 ? n : ++n; ! 25: if (n < 3) ! 26: n = 3; ! 27: m = n-3; ! 28: } ! 29: eht[yyval] = EM((double) n + Parenheight, ps); ! 30: ebase[yyval] = eht[yyval]/2 - EM(Parenbase, ps); ! 31: ! 32: /* try to cope with things that are badly centered */ ! 33: /* (top heavy or bottom heavy) */ ! 34: if (abs(h1/2 - b1) >= EM(0.5, ps)) ! 35: v = REL(-ebase[yyval] + (eht[yyval]-h1)/2 + b1, ps); ! 36: else ! 37: v = 0; /* don't shift it at all */ ! 38: ! 39: printf(".ds %d \\^", yyval); /* was \| */ ! 40: if (bv) ! 41: printf("\\v'%gm'", bv); ! 42: switch (leftc) { ! 43: case 'n': /* nothing */ ! 44: case '\0': ! 45: break; ! 46: case 'f': /* floor */ ! 47: if (n <= 1) ! 48: printf("\\(lf"); ! 49: else ! 50: brack(m, "\\(bv", "\\(bv", "\\(lf"); ! 51: break; ! 52: case 'c': /* ceiling */ ! 53: if (n <= 1) ! 54: printf("\\(lc"); ! 55: else ! 56: brack(m, "\\(lc", "\\(bv", "\\(bv"); ! 57: break; ! 58: case '{': ! 59: printf("\\b'\\(lt"); ! 60: for(j = 0; j < m; j += 2) printf("\\(bv"); ! 61: printf("\\(lk"); ! 62: for(j = 0; j < m; j += 2) printf("\\(bv"); ! 63: printf("\\(lb'"); ! 64: break; ! 65: case '(': ! 66: brack(m, "\\(lt", "\\(bv", "\\(lb"); ! 67: break; ! 68: case '[': ! 69: brack(m, "\\(lc", "\\(bv", "\\(lf"); ! 70: break; ! 71: case '|': ! 72: brack(m, "|", "|", "|"); ! 73: break; ! 74: default: ! 75: brack(m, (char *) &leftc, (char *) &leftc, (char *) &leftc); ! 76: break; ! 77: } ! 78: if (bv) ! 79: printf("\\v'%gm'", -bv); ! 80: if (v) ! 81: printf("\\v'%gm'\\*(%d\\v'%gm'", -v, p1, v); ! 82: else ! 83: printf("\\*(%d", p1); ! 84: if (rightc) { ! 85: if (bv) ! 86: printf("\\v'%gm'", bv); ! 87: switch (rightc) { ! 88: case 'f': /* floor */ ! 89: if (n <= 1) ! 90: printf("\\(rf"); ! 91: else ! 92: brack(m, "\\(bv", "\\(bv", "\\(rf"); ! 93: break; ! 94: case 'c': /* ceiling */ ! 95: if (n <= 1) ! 96: printf("\\(rc"); ! 97: else ! 98: brack(m, "\\(rc", "\\(bv", "\\(bv"); ! 99: break; ! 100: case '}': ! 101: printf("\\b'\\(rt"); ! 102: for(j = 0; j < m; j += 2) printf("\\(bv"); ! 103: printf("\\(rk"); ! 104: for(j = 0; j < m; j += 2) printf("\\(bv"); ! 105: printf("\\(rb'"); ! 106: break; ! 107: case ']': ! 108: brack(m, "\\(rc", "\\(bv", "\\(rf"); ! 109: break; ! 110: case ')': ! 111: brack(m, "\\(rt", "\\(bv", "\\(rb"); ! 112: break; ! 113: case '|': ! 114: brack(m, "|", "|", "|"); ! 115: break; ! 116: default: ! 117: brack(m, (char *) &rightc, (char *) &rightc, (char *) &rightc); ! 118: break; ! 119: } ! 120: if (bv) ! 121: printf("\\v'%gm'", -bv); ! 122: } ! 123: printf("\n"); ! 124: dprintf(".\tcurly: h=%g b=%g n=%d v=%g l=%c, r=%c\n", ! 125: eht[yyval], ebase[yyval], n, v, leftc, rightc); ! 126: } ! 127: ! 128: void brack(int m, char *t, char *c, char *b) ! 129: { ! 130: int j; ! 131: printf("\\b'%s", t); ! 132: for( j=0; j < m; j++) ! 133: printf("%s", c); ! 134: printf("%s'", b); ! 135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.