xref: /csrg-svn/old/eqn/common_source/paren.c (revision 11014)
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