void do_inline(void) { int ds; printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n"); printf(".if \\n(.X .nrf 99 \\n(.s\n"); ds = oalloc(); printf(".rm %d \n", ds); do{ if (*in) printf(".as %d \"%s\n", ds, in); init(); yyparse(); if (eqnreg > 0) { printf(".as %d \\*(%d\n", ds, eqnreg); ofree(eqnreg); } printf(".ps \\n(99\n.ft \\n(98\n"); } while (getline(&in, &insize) == lefteq); if (*in) printf(".as %d \"%s", ds, in); printf(".ps \\n(99\n.ft \\n(98\n"); printf("\\*(%d\n", ds); ofree(ds); }
void boverb(int p1, int p2) { int treg; #ifndef NEQN float h, b, d; #else /* NEQN */ int h, b, d; #endif /* NEQN */ treg = oalloc(); yyval.token = p1; #ifndef NEQN d = VERT(EM(0.3, ps)); h = eht[p1] + eht[p2] + d; #else /* NEQN */ d = VERT(1); h = eht[p1] + eht[p2]; #endif /* NEQN */ b = eht[p2] - d; #ifndef NEQN if(dbg)printf(".\tb:bob: S%d <- S%d over S%d; b=%g, h=%g\n", yyval.token, p1, p2, b, h); #else /* NEQN */ if(dbg)printf(".\tb:bob: S%d <- S%d over S%d; b=%d, h=%d\n", yyval.token, p1, p2, b, h); #endif /* NEQN */ nrwid(p1, ps, p1); nrwid(p2, ps, p2); printf(".nr %d \\n(%d\n", treg, p1); printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, treg, treg, p2); #ifndef NEQN printf(".nr %d \\n(%d+\\s%s.5m\\s0\n", treg, treg, tsize(EFFPS(ps))); printf(".ds %d \\v'%gp'\\h'\\n(%du-\\n(%du/2u'\\*(%d\\\n", yyval.token, eht[p2]-ebase[p2]-d, treg, p2, p2); printf("\\h'-\\n(%du-\\n(%du/2u'\\v'%gp'\\*(%d\\\n", p2, p1, -(eht[p2]-ebase[p2]+d+ebase[p1]), p1); printf("\\h'-\\n(%du-\\n(%du/2u+.1m'\\v'%gp'\\l'\\n(%du-.2m'\\h'.1m'\\v'%gp'\n", treg, p1, ebase[p1]+d, treg, d); #else /* NEQN */ printf(".ds %d \\v'%du'\\h'\\n(%du-\\n(%du/2u'\\*(%d\\\n", yyval.token, eht[p2]-ebase[p2]-d, treg, p2, p2); printf("\\h'-\\n(%du-\\n(%du/2u'\\v'%du'\\*(%d\\\n", p2, p1, -eht[p2]+ebase[p2]-ebase[p1], p1); printf("\\h'-\\n(%du-\\n(%du-2u/2u'\\v'%du'\\l'\\n(%du'\\v'%du'\n", treg, p1, ebase[p1], treg, d); #endif /* NEQN */ ebase[yyval.token] = b; eht[yyval.token] = h; lfont[yyval.token] = rfont[yyval.token] = 0; ofree(p2); ofree(treg); }
void eqnbox(int p1, int p2, int lu) { int b, h; char *sh; yyval = p1; b = max(ebase[p1], ebase[p2]); eht[yyval] = h = b + max(eht[p1]-ebase[p1], eht[p2]-ebase[p2]); ebase[yyval] = b; if (dbg) printf(".\te:eb: S%d <- S%d S%d; b=%d, h=%d\n", yyval, p1, p2, b, h); if (rfont[p1] == ITAL && lfont[p2] == ROM) sh = "\\|"; else sh = ""; if (lu) { printf(".nr %d \\w'\\s%d\\*(%d%s'\n", p1, ps, p1, sh); printf(".ds %d \\h'|\\n(97u-\\n(%du'\\*(%d\n", p1, p1, p1); } printf(".as %d \"%s\\*(%d\n", yyval, sh, p2); rfont[p1] = rfont[p2]; ofree(p2); }
void eqnbox(int p1, int p2, int lu) { #ifndef NEQN float b, h; #else /* NEQN */ int b, h; #endif /* NEQN */ const char *sh; yyval.token = p1; b = max(ebase[p1], ebase[p2]); eht[yyval.token] = h = b + max(eht[p1]-ebase[p1], eht[p2]-ebase[p2]); ebase[yyval.token] = b; #ifndef NEQN if(dbg)printf(".\te:eb: S%d <- S%d S%d; b=%g, h=%g\n", yyval.token, p1, p2, b, h); #else /* NEQN */ if(dbg)printf(".\te:eb: S%d <- S%d S%d; b=%d, h=%d\n", yyval.token, p1, p2, b, h); #endif /* NEQN */ if (ital(rfont[p1]) && rom(lfont[p2])) { if (op(lfont[p2])) sh = "\\|"; else sh = "\\^"; } else sh = ""; if (lu) { printf(".nr %d \\w'\\s%s\\*(%d%s'\n", p1, tsize(ps), p1, sh); printf(".ds %d \\h'|\\n(97u-\\n(%du'\\*(%d\n", p1, p1, p1); } printf(".as %d \"%s\\*(%d\n", yyval.token, sh, p2); rfont[p1] = rfont[p2]; ofree(p2); }
void lpile(int type, int p1, int p2) { int bi, hi, i, gap, h, b, nlist, nlist2, mid; yyval = oalloc(); #ifndef NEQN gap = VERT(EM(0.4, ps)); /* 4/10 m between blocks */ #else /* NEQN */ gap = VERT(1); #endif /* NEQN */ if (type == '-') gap = 0; nlist = p2 - p1; nlist2 = (nlist+1)/2; mid = p1 + nlist2 -1; h = 0; for (i = p1; i < p2; i++) h += eht[lp[i]]; eht[yyval] = h + (nlist-1)*gap; b = 0; for (i = p2-1; i > mid; i--) b += eht[lp[i]] + gap; #ifndef NEQN ebase[yyval] = (nlist%2) ? b + ebase[lp[mid]] : b - VERT(EM(0.5, ps)) - gap; #else /* NEQN */ ebase[yyval] = (nlist%2) ? b + ebase[lp[mid]] : b - VERT(1) - gap; #endif /* NEQN */ if (dbg) { printf(".\tS%d <- %c pile of:", yyval, type); for (i = p1; i < p2; i++) printf(" S%d", lp[i]); printf(";h=%d b=%d\n", eht[yyval], ebase[yyval]); } nrwid(lp[p1], ps, lp[p1]); printf(".nr %d \\n(%d\n", yyval, lp[p1]); for (i = p1+1; i < p2; i++) { nrwid(lp[i], ps, lp[i]); printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", lp[i], yyval, yyval, lp[i]); } printf(".ds %d \\v'%du'\\h'%du*\\n(%du'\\\n", yyval, ebase[yyval], type == 'R' ? 1 : 0, yyval); for (i = p2-1; i >= p1; i--) { hi = eht[lp[i]]; bi = ebase[lp[i]]; switch (type) { case 'L': printf("\\v'%du'\\*(%d\\h'-\\n(%du'\\v'0-%du'\\\n", -bi, lp[i], lp[i], hi-bi+gap); continue; case 'R': printf("\\v'%du'\\h'-\\n(%du'\\*(%d\\v'0-%du'\\\n", -bi, lp[i], lp[i], hi-bi+gap); continue; case 'C': case '-': printf("\\v'%du'\\h'\\n(%du-\\n(%du/2u'\\*(%d", -bi, yyval, lp[i], lp[i]); printf("\\h'-\\n(%du-\\n(%du/2u'\\v'0-%du'\\\n", yyval, lp[i], hi-bi+gap); continue; } } printf("\\v'%du'\\h'%du*\\n(%du'\n", eht[yyval]-ebase[yyval]+gap, type != 'R' ? 1 : 0, yyval); for (i = p1; i < p2; i++) ofree(lp[i]); lfont[yyval] = rfont[yyval] = 0; }
void bshiftb(int p1, int dir, int p2) { int shval, d1, h1, b1, h2, b2; #ifndef NEQN int diffps, effps, effps2; char *sh1, *sh2; #endif /* NEQN */ yyval = p1; h1 = eht[p1]; b1 = ebase[p1]; h2 = eht[p2]; b2 = ebase[p2]; #ifndef NEQN effps = EFFPS(ps); effps2 = EFFPS(ps+deltaps); diffps = deltaps; sh1 = sh2 = ""; #endif /* NEQN */ if (dir == SUB) { /* subscript */ #ifndef NEQN /* top 1/2m above bottom of main box */ d1 = VERT(EM(0.5, effps2)); #else /* NEQN */ d1 = VERT(1); #endif /* NEQN */ shval = - d1 + h2 - b2; if (d1+b1 > h2) /* move little sub down */ shval = b1-b2; ebase[yyval] = b1 + max(0, h2-b1-d1); eht[yyval] = h1 + max(0, h2-b1-d1); #ifndef NEQN if (rfont[p1] == ITAL && lfont[p2] == ROM) sh1 = "\\|"; if (rfont[p2] == ITAL) sh2 = "\\|"; #endif /* NEQN */ } else { /* superscript */ #ifndef NEQN /* 4/10 up main box */ d1 = VERT(EM(0.2, effps)); #else /* NEQN */ d1 = VERT(1); #endif /* NEQN */ ebase[yyval] = b1; #ifndef NEQN shval = -VERT((4 * (h1-b1)) / 10) - b2; if (VERT(4*(h1-b1)/10) + h2 < h1-b1) /* raise little super */ #else /* NEQN */ shval = -VERT(1) - b2; if (VERT(1) + h2 < h1-b1) /* raise little super */ #endif /* NEQN */ shval = -(h1-b1) + h2-b2 - d1; #ifndef NEQN eht[yyval] = h1 + max(0, h2-VERT((6*(h1-b1))/10)); if (rfont[p1] == ITAL) sh1 = "\\|"; if (rfont[p2] == ITAL) sh2 = "\\|"; #else /* NEQN */ eht[yyval] = h1 + max(0, h2 - VERT(1)); #endif /* NEQN */ } if (dbg) printf(".\tb:b shift b: S%d <- S%d vert %d S%d vert %d; " "b=%d, h=%d\n", yyval, p1, shval, p2, -shval, ebase[yyval], eht[yyval]); #ifndef NEQN printf(".as %d \\v'%du'\\s-%d%s\\*(%d\\s+%d%s\\v'%du'\n", yyval, shval, diffps, sh1, p2, diffps, sh2, -shval); ps += deltaps; if (rfont[p2] == ITAL) rfont[p1] = 0; else rfont[p1] = rfont[p2]; #else /* NEQN */ printf(".as %d \\v'%du'\\*(%d\\v'%du'\n", yyval, shval, p2, -shval); #endif /* NEQN */ ofree(p2); }
void shift2(int p1, int p2, int p3) { int effps, h1, h2, h3, b1, b2, b3, subsh, d1, d2, supsh, treg; #ifndef NEQN int effps2; #endif /* NEQN */ treg = oalloc(); yyval = p1; if (dbg) printf(".\tshift2 s%d <- %d %d %d\n", yyval, p1, p2, p3); effps = EFFPS(ps+deltaps); #ifndef NEQN eht[p3] = h3 = VERT((eht[p3] * effps) / EFFPS(ps)); ps += deltaps; effps2 = EFFPS(ps+deltaps); #endif /* NEQN */ h1 = eht[p1]; b1 = ebase[p1]; h2 = eht[p2]; b2 = ebase[p2]; #ifndef NEQN b3 = ebase[p3]; d1 = VERT(EM(0.5, effps2)); #else /* NEQN */ h3 = eht[p3]; b3 = ebase[p3]; d1 = VERT(1); #endif /* NEQN */ subsh = -d1+h2-b2; if (d1+b1 > h2) /* move little sub down */ subsh = b1-b2; #ifndef NEQN supsh = -VERT((4*(h1-b1))/10) - b3; d2 = VERT(EM(0.2, effps)); if (VERT(4*(h1-b1)/10)+h3 < h1-b1) #else /* NEQN */ supsh = - VERT(1) - b3; d2 = VERT(1); if (VERT(1)+h3 < h1-b1) #endif /* NEQN */ supsh = -(h1-b1) + (h3-b3) - d2; #ifndef NEQN eht[yyval] = h1 + max(0, h3-VERT((6*(h1-b1))/10)) + max(0, h2-b1-d1); #else /* NEQN */ eht[yyval] = h1 + max(0, h3-VERT(1)) + max(0, h2-b1-d1); #endif /* NEQN */ ebase[yyval] = b1+max(0, h2-b1-d1); #ifndef NEQN if (rfont[p1] == ITAL && lfont[p2] == ROM) printf(".ds %d \\|\\*(%d\n", p2, p2); if (rfont[p2] == ITAL) printf(".as %d \\|\n", p2); #endif /* NEQN */ nrwid(p2, effps, p2); #ifndef NEQN if (rfont[p1] == ITAL && lfont[p3] == ROM) printf(".ds %d \\|\\|\\*(%d\n", p3, p3); else printf(".ds %d \\|\\*(%d\n", p3, p3); #endif /* NEQN */ nrwid(p3, effps, p3); printf(".nr %d \\n(%d\n", treg, p3); printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, treg, treg, p2); #ifndef NEQN printf(".as %d \\v'%du'\\s%d\\*(%d\\h'-\\n(%du'\\v'%du'\\\n", p1, subsh, effps, p2, p2, -subsh+supsh); printf("\\s%d\\*(%d\\h'-\\n(%du+\\n(%du'\\s%d\\v'%du'\n", effps, p3, p3, treg, effps2, -supsh); #else /* NEQN */ printf(".as %d \\v'%du'\\*(%d\\h'-\\n(%du'\\v'%du'\\\n", p1, subsh, p2, p2, -subsh+supsh); printf("\\*(%d\\h'-\\n(%du+\\n(%du'\\v'%du'\n", p3, p3, treg, -supsh); #endif /* NEQN */ ps += deltaps; #ifndef NEQN if (rfont[p2] == ITAL) rfont[yyval] = 0; /* lie */ #endif /* NEQN */ ofree(p2); ofree(p3); ofree(treg); }
void matrix(int p1) { #ifndef NEQN float hb, b; #else /* NEQN */ int hb, b; #endif /* NEQN */ int nrow, ncol, i, j, k, val[100]; const char *space; space = "\\ \\ "; nrow = lp[p1]; /* disaster if rows inconsistent */ ncol = 0; for( i=p1; i<ct; i += lp[i]+2 ){ ncol++; if(dbg)printf(".\tcolct=%d\n",lp[i]); } for( k=1; k<=nrow; k++ ) { hb = b = 0; j = p1 + k; for( i=0; i<ncol; i++ ) { hb = max(hb, eht[lp[j]]-ebase[lp[j]]); b = max(b, ebase[lp[j]]); j += nrow + 2; } #ifndef NEQN if(dbg)printf(".\trow %d: b=%g, hb=%g\n", k, b, hb); #else /* NEQN */ if(dbg)printf(".\trow %d: b=%d, hb=%d\n", k, b, hb); #endif /* NEQN */ j = p1 + k; for( i=0; i<ncol; i++ ) { ebase[lp[j]] = b; eht[lp[j]] = b + hb; j += nrow + 2; } } j = p1; for( i=0; i<ncol; i++ ) { lpile(lp[j+lp[j]+1], j+1, j+lp[j]+1); val[i] = yyval.token; j += nrow + 2; } yyval.token = oalloc(); eht[yyval.token] = eht[val[0]]; ebase[yyval.token] = ebase[val[0]]; lfont[yyval.token] = rfont[yyval.token] = 0; #ifndef NEQN if(dbg)printf(".\tmatrix S%d: r=%d, c=%d, h=%g, b=%g\n", yyval.token,nrow,ncol,eht[yyval.token],ebase[yyval.token]); #else /* NEQN */ if(dbg)printf(".\tmatrix S%d: r=%d, c=%d, h=%d, b=%d\n", yyval.token,nrow,ncol,eht[yyval.token],ebase[yyval.token]); #endif /* NEQN */ printf(".ds %d \"", yyval.token); for( i=0; i<ncol; i++ ) { printf("\\*(%d%s", val[i], i==ncol-1 ? "" : space); ofree(val[i]); } printf("\n"); ct = p1; }