1*11023Sshannon /* shift.c 4.2 83/02/12 */ 211016Sshannon 311016Sshannon # include "e.h" 411016Sshannon #include "e.def" 511016Sshannon 611016Sshannon bshiftb(p1, dir, p2) int p1, dir, p2; { 7*11023Sshannon int shval, d1, h1, b1, h2, b2; 8*11023Sshannon #ifndef NEQN 9*11023Sshannon int diffps, effps, effps2; 1011016Sshannon char *sh1, *sh2; 11*11023Sshannon #endif NEQN 1211016Sshannon 1311016Sshannon yyval = p1; 1411016Sshannon h1 = eht[p1]; 1511016Sshannon b1 = ebase[p1]; 1611016Sshannon h2 = eht[p2]; 1711016Sshannon b2 = ebase[p2]; 18*11023Sshannon #ifndef NEQN 1911016Sshannon effps = EFFPS(ps); 2011016Sshannon effps2 = EFFPS(ps+deltaps); 2111016Sshannon diffps = deltaps; 2211016Sshannon sh1 = sh2 = ""; 23*11023Sshannon #endif NEQN 24*11023Sshannon if( dir == SUB ) { /* subscript */ 25*11023Sshannon #ifndef NEQN 2611016Sshannon /* top 1/2m above bottom of main box */ 2711016Sshannon d1 = VERT( (effps2*6)/2 ); 28*11023Sshannon #else NEQN 29*11023Sshannon d1 = VERT(1); 30*11023Sshannon #endif NEQN 3111016Sshannon shval = - d1 + h2 - b2; 3211016Sshannon if( d1+b1 > h2 ) /* move little sub down */ 3311016Sshannon shval = b1-b2; 3411016Sshannon ebase[yyval] = b1 + max(0, h2-b1-d1); 3511016Sshannon eht[yyval] = h1 + max(0, h2-b1-d1); 36*11023Sshannon #ifndef NEQN 3711016Sshannon if (rfont[p1] == ITAL && lfont[p2] == ROM) 3811016Sshannon sh1 = "\\|"; 3911016Sshannon if (rfont[p2] == ITAL) 4011016Sshannon sh2 = "\\|"; 41*11023Sshannon #endif NEQN 4211016Sshannon } else { /* superscript */ 43*11023Sshannon #ifndef NEQN 4411016Sshannon /* 4/10 up main box */ 4511016Sshannon d1 = VERT( (effps*6*2)/10 ); 46*11023Sshannon #else NEQN 47*11023Sshannon d1 = VERT(1); 48*11023Sshannon #endif NEQN 4911016Sshannon ebase[yyval] = b1; 50*11023Sshannon #ifndef NEQN 5111016Sshannon shval = -VERT( (4 * (h1-b1)) / 10 ) - b2; 5211016Sshannon if( VERT(4*(h1-b1)/10) + h2 < h1-b1 ) /* raise little super */ 53*11023Sshannon #else NEQN 54*11023Sshannon shval = -VERT(1) - b2; 55*11023Sshannon if( VERT(1) + h2 < h1-b1 ) /* raise little super */ 56*11023Sshannon #endif NEQN 5711016Sshannon shval = -(h1-b1) + h2-b2 - d1; 58*11023Sshannon #ifndef NEQN 5911016Sshannon eht[yyval] = h1 + max(0, h2-VERT((6*(h1-b1))/10)); 6011016Sshannon if (rfont[p1] == ITAL) 6111016Sshannon sh1 = "\\|"; 6211016Sshannon if (rfont[p2] == ITAL) 6311016Sshannon sh2 = "\\|"; 64*11023Sshannon #else NEQN 65*11023Sshannon eht[yyval] = h1 + max(0, h2 - VERT(1)); 66*11023Sshannon #endif NEQN 6711016Sshannon } 6811016Sshannon if(dbg)printf(".\tb:b shift b: S%d <- S%d vert %d S%d vert %d; b=%d, h=%d\n", 6911016Sshannon yyval, p1, shval, p2, -shval, ebase[yyval], eht[yyval]); 70*11023Sshannon #ifndef NEQN 7111016Sshannon printf(".as %d \\v'%du'\\s-%d%s\\*(%d\\s+%d%s\\v'%du'\n", 7211016Sshannon yyval, shval, diffps, sh1, p2, diffps, sh2, -shval); 7311016Sshannon ps += deltaps; 7411016Sshannon if (rfont[p2] == ITAL) 7511016Sshannon rfont[p1] = 0; 7611016Sshannon else 7711016Sshannon rfont[p1] = rfont[p2]; 78*11023Sshannon #else NEQN 79*11023Sshannon printf(".as %d \\v'%du'\\*(%d\\v'%du'\n", 80*11023Sshannon yyval, shval, p2, -shval); 81*11023Sshannon #endif NEQN 8211016Sshannon ofree(p2); 8311016Sshannon } 8411016Sshannon 8511016Sshannon shift(p1) int p1; { 8611016Sshannon ps -= deltaps; 8711016Sshannon yyval = p1; 8811016Sshannon if(dbg)printf(".\tshift: %d;ps=%d\n", yyval, ps); 8911016Sshannon } 9011016Sshannon 9111016Sshannon shift2(p1, p2, p3) int p1, p2, p3; { 92*11023Sshannon int effps, h1, h2, h3, b1, b2, b3, subsh, d1, d2, supsh, treg; 93*11023Sshannon #ifndef NEQN 94*11023Sshannon int effps2; 95*11023Sshannon #endif NEQN 96*11023Sshannon 9711016Sshannon treg = oalloc(); 9811016Sshannon yyval = p1; 9911016Sshannon if(dbg)printf(".\tshift2 s%d <- %d %d %d\n", yyval, p1, p2, p3); 10011016Sshannon effps = EFFPS(ps+deltaps); 101*11023Sshannon #ifndef NEQN 10211016Sshannon eht[p3] = h3 = VERT( (eht[p3] * effps) / EFFPS(ps) ); 10311016Sshannon ps += deltaps; 10411016Sshannon effps2 = EFFPS(ps+deltaps); 105*11023Sshannon #endif NEQN 10611016Sshannon h1 = eht[p1]; b1 = ebase[p1]; 10711016Sshannon h2 = eht[p2]; b2 = ebase[p2]; 108*11023Sshannon #ifndef NEQN 10911016Sshannon b3 = ebase[p3]; 11011016Sshannon d1 = VERT( (effps2*6)/2 ); 111*11023Sshannon #else NEQN 112*11023Sshannon h3 = eht[p3]; b3 = ebase[p3]; 113*11023Sshannon d1 = VERT(1); 114*11023Sshannon #endif NEQN 11511016Sshannon subsh = -d1+h2-b2; 11611016Sshannon if( d1+b1 > h2 ) /* move little sub down */ 11711016Sshannon subsh = b1-b2; 118*11023Sshannon #ifndef NEQN 11911016Sshannon supsh = -VERT( (4*(h1-b1))/10 ) - b3; 12011016Sshannon d2 = VERT( (effps*6*2)/10 ); 12111016Sshannon if( VERT(4*(h1-b1)/10)+h3 < h1-b1 ) 122*11023Sshannon #else NEQN 123*11023Sshannon supsh = - VERT(1) - b3; 124*11023Sshannon d2 = VERT(1); 125*11023Sshannon if( VERT(1)+h3 < h1-b1 ) 126*11023Sshannon #endif NEQN 12711016Sshannon supsh = -(h1-b1) + (h3-b3) - d2; 128*11023Sshannon #ifndef NEQN 12911016Sshannon eht[yyval] = h1 + max(0, h3-VERT( (6*(h1-b1))/10 )) + max(0, h2-b1-d1); 130*11023Sshannon #else NEQN 131*11023Sshannon eht[yyval] = h1 + max(0, h3-VERT(1)) + max(0, h2-b1-d1); 132*11023Sshannon #endif NEQN 13311016Sshannon ebase[yyval] = b1+max(0, h2-b1-d1); 134*11023Sshannon #ifndef NEQN 13511016Sshannon if (rfont[p1] == ITAL && lfont[p2] == ROM) 13611016Sshannon printf(".ds %d \\|\\*(%d\n", p2, p2); 13711016Sshannon if (rfont[p2] == ITAL) 13811016Sshannon printf(".as %d \\|\n", p2); 139*11023Sshannon #endif NEQN 14011016Sshannon nrwid(p2, effps, p2); 141*11023Sshannon #ifndef NEQN 14211016Sshannon if (rfont[p1] == ITAL && lfont[p3] == ROM) 14311016Sshannon printf(".ds %d \\|\\|\\*(%d\n", p3, p3); 14411016Sshannon else 14511016Sshannon printf(".ds %d \\|\\*(%d\n", p3, p3); 146*11023Sshannon #endif NEQN 14711016Sshannon nrwid(p3, effps, p3); 14811016Sshannon printf(".nr %d \\n(%d\n", treg, p3); 14911016Sshannon printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, treg, treg, p2); 150*11023Sshannon #ifndef NEQN 15111016Sshannon printf(".as %d \\v'%du'\\s%d\\*(%d\\h'-\\n(%du'\\v'%du'\\\n", 15211016Sshannon p1, subsh, effps, p2, p2, -subsh+supsh); 15311016Sshannon printf("\\s%d\\*(%d\\h'-\\n(%du+\\n(%du'\\s%d\\v'%du'\n", 15411016Sshannon effps, p3, p3, treg, effps2, -supsh); 155*11023Sshannon #else NEQN 156*11023Sshannon printf(".as %d \\v'%du'\\*(%d\\h'-\\n(%du'\\v'%du'\\\n", 157*11023Sshannon p1, subsh, p2, p2, -subsh+supsh); 158*11023Sshannon printf("\\*(%d\\h'-\\n(%du+\\n(%du'\\v'%du'\n", 159*11023Sshannon p3, p3, treg, -supsh); 160*11023Sshannon #endif NEQN 16111016Sshannon ps += deltaps; 162*11023Sshannon #ifndef NEQN 16311016Sshannon if (rfont[p2] == ITAL) 16411016Sshannon rfont[yyval] = 0; /* lie */ 165*11023Sshannon #endif NEQN 16611016Sshannon ofree(p2); ofree(p3); ofree(treg); 16711016Sshannon } 168