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