1*11016Sshannon /* shift.c 4.1 83/02/11 */ 2*11016Sshannon 3*11016Sshannon # include "e.h" 4*11016Sshannon #include "e.def" 5*11016Sshannon 6*11016Sshannon bshiftb(p1, dir, p2) int p1, dir, p2; { 7*11016Sshannon int shval, diffps, effps, effps2, d1, h1, b1, h2, b2; 8*11016Sshannon char *sh1, *sh2; 9*11016Sshannon 10*11016Sshannon yyval = p1; 11*11016Sshannon h1 = eht[p1]; 12*11016Sshannon b1 = ebase[p1]; 13*11016Sshannon h2 = eht[p2]; 14*11016Sshannon b2 = ebase[p2]; 15*11016Sshannon effps = EFFPS(ps); 16*11016Sshannon effps2 = EFFPS(ps+deltaps); 17*11016Sshannon diffps = deltaps; 18*11016Sshannon sh1 = sh2 = ""; 19*11016Sshannon if( dir == SUB ) { 20*11016Sshannon /* top 1/2m above bottom of main box */ 21*11016Sshannon d1 = VERT( (effps2*6)/2 ); 22*11016Sshannon shval = - d1 + h2 - b2; 23*11016Sshannon if( d1+b1 > h2 ) /* move little sub down */ 24*11016Sshannon shval = b1-b2; 25*11016Sshannon ebase[yyval] = b1 + max(0, h2-b1-d1); 26*11016Sshannon eht[yyval] = h1 + max(0, h2-b1-d1); 27*11016Sshannon if (rfont[p1] == ITAL && lfont[p2] == ROM) 28*11016Sshannon sh1 = "\\|"; 29*11016Sshannon if (rfont[p2] == ITAL) 30*11016Sshannon sh2 = "\\|"; 31*11016Sshannon } else { /* superscript */ 32*11016Sshannon /* 4/10 up main box */ 33*11016Sshannon d1 = VERT( (effps*6*2)/10 ); 34*11016Sshannon ebase[yyval] = b1; 35*11016Sshannon shval = -VERT( (4 * (h1-b1)) / 10 ) - b2; 36*11016Sshannon if( VERT(4*(h1-b1)/10) + h2 < h1-b1 ) /* raise little super */ 37*11016Sshannon shval = -(h1-b1) + h2-b2 - d1; 38*11016Sshannon eht[yyval] = h1 + max(0, h2-VERT((6*(h1-b1))/10)); 39*11016Sshannon if (rfont[p1] == ITAL) 40*11016Sshannon sh1 = "\\|"; 41*11016Sshannon if (rfont[p2] == ITAL) 42*11016Sshannon sh2 = "\\|"; 43*11016Sshannon } 44*11016Sshannon if(dbg)printf(".\tb:b shift b: S%d <- S%d vert %d S%d vert %d; b=%d, h=%d\n", 45*11016Sshannon yyval, p1, shval, p2, -shval, ebase[yyval], eht[yyval]); 46*11016Sshannon printf(".as %d \\v'%du'\\s-%d%s\\*(%d\\s+%d%s\\v'%du'\n", 47*11016Sshannon yyval, shval, diffps, sh1, p2, diffps, sh2, -shval); 48*11016Sshannon ps += deltaps; 49*11016Sshannon if (rfont[p2] == ITAL) 50*11016Sshannon rfont[p1] = 0; 51*11016Sshannon else 52*11016Sshannon rfont[p1] = rfont[p2]; 53*11016Sshannon ofree(p2); 54*11016Sshannon } 55*11016Sshannon 56*11016Sshannon shift(p1) int p1; { 57*11016Sshannon ps -= deltaps; 58*11016Sshannon yyval = p1; 59*11016Sshannon if(dbg)printf(".\tshift: %d;ps=%d\n", yyval, ps); 60*11016Sshannon } 61*11016Sshannon 62*11016Sshannon shift2(p1, p2, p3) int p1, p2, p3; { 63*11016Sshannon int effps, effps2, h1, h2, h3, b1, b2, b3, subsh, d1, d2, supsh; 64*11016Sshannon int treg; 65*11016Sshannon treg = oalloc(); 66*11016Sshannon yyval = p1; 67*11016Sshannon if(dbg)printf(".\tshift2 s%d <- %d %d %d\n", yyval, p1, p2, p3); 68*11016Sshannon effps = EFFPS(ps+deltaps); 69*11016Sshannon eht[p3] = h3 = VERT( (eht[p3] * effps) / EFFPS(ps) ); 70*11016Sshannon ps += deltaps; 71*11016Sshannon effps2 = EFFPS(ps+deltaps); 72*11016Sshannon h1 = eht[p1]; b1 = ebase[p1]; 73*11016Sshannon h2 = eht[p2]; b2 = ebase[p2]; 74*11016Sshannon b3 = ebase[p3]; 75*11016Sshannon d1 = VERT( (effps2*6)/2 ); 76*11016Sshannon subsh = -d1+h2-b2; 77*11016Sshannon if( d1+b1 > h2 ) /* move little sub down */ 78*11016Sshannon subsh = b1-b2; 79*11016Sshannon supsh = -VERT( (4*(h1-b1))/10 ) - b3; 80*11016Sshannon d2 = VERT( (effps*6*2)/10 ); 81*11016Sshannon if( VERT(4*(h1-b1)/10)+h3 < h1-b1 ) 82*11016Sshannon supsh = -(h1-b1) + (h3-b3) - d2; 83*11016Sshannon eht[yyval] = h1 + max(0, h3-VERT( (6*(h1-b1))/10 )) + max(0, h2-b1-d1); 84*11016Sshannon ebase[yyval] = b1+max(0, h2-b1-d1); 85*11016Sshannon if (rfont[p1] == ITAL && lfont[p2] == ROM) 86*11016Sshannon printf(".ds %d \\|\\*(%d\n", p2, p2); 87*11016Sshannon if (rfont[p2] == ITAL) 88*11016Sshannon printf(".as %d \\|\n", p2); 89*11016Sshannon nrwid(p2, effps, p2); 90*11016Sshannon if (rfont[p1] == ITAL && lfont[p3] == ROM) 91*11016Sshannon printf(".ds %d \\|\\|\\*(%d\n", p3, p3); 92*11016Sshannon else 93*11016Sshannon printf(".ds %d \\|\\*(%d\n", p3, p3); 94*11016Sshannon nrwid(p3, effps, p3); 95*11016Sshannon printf(".nr %d \\n(%d\n", treg, p3); 96*11016Sshannon printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, treg, treg, p2); 97*11016Sshannon printf(".as %d \\v'%du'\\s%d\\*(%d\\h'-\\n(%du'\\v'%du'\\\n", 98*11016Sshannon p1, subsh, effps, p2, p2, -subsh+supsh); 99*11016Sshannon printf("\\s%d\\*(%d\\h'-\\n(%du+\\n(%du'\\s%d\\v'%du'\n", 100*11016Sshannon effps, p3, p3, treg, effps2, -supsh); 101*11016Sshannon ps += deltaps; 102*11016Sshannon if (rfont[p2] == ITAL) 103*11016Sshannon rfont[yyval] = 0; /* lie */ 104*11016Sshannon ofree(p2); ofree(p3); ofree(treg); 105*11016Sshannon } 106