1*14486Ssam #ifndef lint 2*14486Ssam static char sccsid[] = "@(#)shift.c 4.3 08/11/83"; 3*14486Ssam #endif 411016Sshannon 511016Sshannon # include "e.h" 611016Sshannon #include "e.def" 711016Sshannon 811016Sshannon bshiftb(p1, dir, p2) int p1, dir, p2; { 911023Sshannon int shval, d1, h1, b1, h2, b2; 1011023Sshannon #ifndef NEQN 1111023Sshannon int diffps, effps, effps2; 1211016Sshannon char *sh1, *sh2; 1311023Sshannon #endif NEQN 1411016Sshannon 1511016Sshannon yyval = p1; 1611016Sshannon h1 = eht[p1]; 1711016Sshannon b1 = ebase[p1]; 1811016Sshannon h2 = eht[p2]; 1911016Sshannon b2 = ebase[p2]; 2011023Sshannon #ifndef NEQN 2111016Sshannon effps = EFFPS(ps); 2211016Sshannon effps2 = EFFPS(ps+deltaps); 2311016Sshannon diffps = deltaps; 2411016Sshannon sh1 = sh2 = ""; 2511023Sshannon #endif NEQN 2611023Sshannon if( dir == SUB ) { /* subscript */ 2711023Sshannon #ifndef NEQN 2811016Sshannon /* top 1/2m above bottom of main box */ 2911016Sshannon d1 = VERT( (effps2*6)/2 ); 3011023Sshannon #else NEQN 3111023Sshannon d1 = VERT(1); 3211023Sshannon #endif NEQN 3311016Sshannon shval = - d1 + h2 - b2; 3411016Sshannon if( d1+b1 > h2 ) /* move little sub down */ 3511016Sshannon shval = b1-b2; 3611016Sshannon ebase[yyval] = b1 + max(0, h2-b1-d1); 3711016Sshannon eht[yyval] = h1 + max(0, h2-b1-d1); 3811023Sshannon #ifndef NEQN 3911016Sshannon if (rfont[p1] == ITAL && lfont[p2] == ROM) 4011016Sshannon sh1 = "\\|"; 4111016Sshannon if (rfont[p2] == ITAL) 4211016Sshannon sh2 = "\\|"; 4311023Sshannon #endif NEQN 4411016Sshannon } else { /* superscript */ 4511023Sshannon #ifndef NEQN 4611016Sshannon /* 4/10 up main box */ 4711016Sshannon d1 = VERT( (effps*6*2)/10 ); 4811023Sshannon #else NEQN 4911023Sshannon d1 = VERT(1); 5011023Sshannon #endif NEQN 5111016Sshannon ebase[yyval] = b1; 5211023Sshannon #ifndef NEQN 5311016Sshannon shval = -VERT( (4 * (h1-b1)) / 10 ) - b2; 5411016Sshannon if( VERT(4*(h1-b1)/10) + h2 < h1-b1 ) /* raise little super */ 5511023Sshannon #else NEQN 5611023Sshannon shval = -VERT(1) - b2; 5711023Sshannon if( VERT(1) + h2 < h1-b1 ) /* raise little super */ 5811023Sshannon #endif NEQN 5911016Sshannon shval = -(h1-b1) + h2-b2 - d1; 6011023Sshannon #ifndef NEQN 6111016Sshannon eht[yyval] = h1 + max(0, h2-VERT((6*(h1-b1))/10)); 6211016Sshannon if (rfont[p1] == ITAL) 6311016Sshannon sh1 = "\\|"; 6411016Sshannon if (rfont[p2] == ITAL) 6511016Sshannon sh2 = "\\|"; 6611023Sshannon #else NEQN 6711023Sshannon eht[yyval] = h1 + max(0, h2 - VERT(1)); 6811023Sshannon #endif NEQN 6911016Sshannon } 7011016Sshannon if(dbg)printf(".\tb:b shift b: S%d <- S%d vert %d S%d vert %d; b=%d, h=%d\n", 7111016Sshannon yyval, p1, shval, p2, -shval, ebase[yyval], eht[yyval]); 7211023Sshannon #ifndef NEQN 7311016Sshannon printf(".as %d \\v'%du'\\s-%d%s\\*(%d\\s+%d%s\\v'%du'\n", 7411016Sshannon yyval, shval, diffps, sh1, p2, diffps, sh2, -shval); 7511016Sshannon ps += deltaps; 7611016Sshannon if (rfont[p2] == ITAL) 7711016Sshannon rfont[p1] = 0; 7811016Sshannon else 7911016Sshannon rfont[p1] = rfont[p2]; 8011023Sshannon #else NEQN 8111023Sshannon printf(".as %d \\v'%du'\\*(%d\\v'%du'\n", 8211023Sshannon yyval, shval, p2, -shval); 8311023Sshannon #endif NEQN 8411016Sshannon ofree(p2); 8511016Sshannon } 8611016Sshannon 8711016Sshannon shift(p1) int p1; { 8811016Sshannon ps -= deltaps; 8911016Sshannon yyval = p1; 9011016Sshannon if(dbg)printf(".\tshift: %d;ps=%d\n", yyval, ps); 9111016Sshannon } 9211016Sshannon 9311016Sshannon shift2(p1, p2, p3) int p1, p2, p3; { 9411023Sshannon int effps, h1, h2, h3, b1, b2, b3, subsh, d1, d2, supsh, treg; 9511023Sshannon #ifndef NEQN 9611023Sshannon int effps2; 9711023Sshannon #endif NEQN 9811023Sshannon 9911016Sshannon treg = oalloc(); 10011016Sshannon yyval = p1; 10111016Sshannon if(dbg)printf(".\tshift2 s%d <- %d %d %d\n", yyval, p1, p2, p3); 10211016Sshannon effps = EFFPS(ps+deltaps); 10311023Sshannon #ifndef NEQN 10411016Sshannon eht[p3] = h3 = VERT( (eht[p3] * effps) / EFFPS(ps) ); 10511016Sshannon ps += deltaps; 10611016Sshannon effps2 = EFFPS(ps+deltaps); 10711023Sshannon #endif NEQN 10811016Sshannon h1 = eht[p1]; b1 = ebase[p1]; 10911016Sshannon h2 = eht[p2]; b2 = ebase[p2]; 11011023Sshannon #ifndef NEQN 11111016Sshannon b3 = ebase[p3]; 11211016Sshannon d1 = VERT( (effps2*6)/2 ); 11311023Sshannon #else NEQN 11411023Sshannon h3 = eht[p3]; b3 = ebase[p3]; 11511023Sshannon d1 = VERT(1); 11611023Sshannon #endif NEQN 11711016Sshannon subsh = -d1+h2-b2; 11811016Sshannon if( d1+b1 > h2 ) /* move little sub down */ 11911016Sshannon subsh = b1-b2; 12011023Sshannon #ifndef NEQN 12111016Sshannon supsh = -VERT( (4*(h1-b1))/10 ) - b3; 12211016Sshannon d2 = VERT( (effps*6*2)/10 ); 12311016Sshannon if( VERT(4*(h1-b1)/10)+h3 < h1-b1 ) 12411023Sshannon #else NEQN 12511023Sshannon supsh = - VERT(1) - b3; 12611023Sshannon d2 = VERT(1); 12711023Sshannon if( VERT(1)+h3 < h1-b1 ) 12811023Sshannon #endif NEQN 12911016Sshannon supsh = -(h1-b1) + (h3-b3) - d2; 13011023Sshannon #ifndef NEQN 13111016Sshannon eht[yyval] = h1 + max(0, h3-VERT( (6*(h1-b1))/10 )) + max(0, h2-b1-d1); 13211023Sshannon #else NEQN 13311023Sshannon eht[yyval] = h1 + max(0, h3-VERT(1)) + max(0, h2-b1-d1); 13411023Sshannon #endif NEQN 13511016Sshannon ebase[yyval] = b1+max(0, h2-b1-d1); 13611023Sshannon #ifndef NEQN 13711016Sshannon if (rfont[p1] == ITAL && lfont[p2] == ROM) 13811016Sshannon printf(".ds %d \\|\\*(%d\n", p2, p2); 13911016Sshannon if (rfont[p2] == ITAL) 14011016Sshannon printf(".as %d \\|\n", p2); 14111023Sshannon #endif NEQN 14211016Sshannon nrwid(p2, effps, p2); 14311023Sshannon #ifndef NEQN 14411016Sshannon if (rfont[p1] == ITAL && lfont[p3] == ROM) 14511016Sshannon printf(".ds %d \\|\\|\\*(%d\n", p3, p3); 14611016Sshannon else 14711016Sshannon printf(".ds %d \\|\\*(%d\n", p3, p3); 14811023Sshannon #endif NEQN 14911016Sshannon nrwid(p3, effps, p3); 15011016Sshannon printf(".nr %d \\n(%d\n", treg, p3); 15111016Sshannon printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, treg, treg, p2); 15211023Sshannon #ifndef NEQN 15311016Sshannon printf(".as %d \\v'%du'\\s%d\\*(%d\\h'-\\n(%du'\\v'%du'\\\n", 15411016Sshannon p1, subsh, effps, p2, p2, -subsh+supsh); 15511016Sshannon printf("\\s%d\\*(%d\\h'-\\n(%du+\\n(%du'\\s%d\\v'%du'\n", 15611016Sshannon effps, p3, p3, treg, effps2, -supsh); 15711023Sshannon #else NEQN 15811023Sshannon printf(".as %d \\v'%du'\\*(%d\\h'-\\n(%du'\\v'%du'\\\n", 15911023Sshannon p1, subsh, p2, p2, -subsh+supsh); 16011023Sshannon printf("\\*(%d\\h'-\\n(%du+\\n(%du'\\v'%du'\n", 16111023Sshannon p3, p3, treg, -supsh); 16211023Sshannon #endif NEQN 16311016Sshannon ps += deltaps; 16411023Sshannon #ifndef NEQN 16511016Sshannon if (rfont[p2] == ITAL) 16611016Sshannon rfont[yyval] = 0; /* lie */ 16711023Sshannon #endif NEQN 16811016Sshannon ofree(p2); ofree(p3); ofree(treg); 16911016Sshannon } 170