version 1.11, 2017/07/06 00:19:54 |
version 1.13, 2017/07/08 14:51:04 |
Line 40 static void eqn_box(struct termp *, const struct eqn_b |
|
Line 40 static void eqn_box(struct termp *, const struct eqn_b |
|
|
|
|
|
void |
void |
term_eqn(struct termp *p, const struct eqn *ep) |
term_eqn(struct termp *p, const struct eqn_box *bp) |
{ |
{ |
|
|
eqn_box(p, ep->root); |
eqn_box(p, bp); |
p->flags &= ~TERMP_NOSPACE; |
p->flags &= ~TERMP_NOSPACE; |
} |
} |
|
|
|
|
eqn_box(struct termp *p, const struct eqn_box *bp) |
eqn_box(struct termp *p, const struct eqn_box *bp) |
{ |
{ |
const struct eqn_box *child; |
const struct eqn_box *child; |
|
int delim; |
|
|
|
/* Delimiters around this box? */ |
|
|
if ((bp->type == EQN_LIST && bp->expectargs > 1) || |
if ((bp->type == EQN_LIST && bp->expectargs > 1) || |
(bp->type == EQN_PILE && (bp->prev || bp->next)) || |
(bp->type == EQN_PILE && (bp->prev || bp->next)) || |
(bp->parent != NULL && bp->parent->pos == EQNPOS_SQRT)) { |
(bp->parent != NULL && (bp->parent->pos == EQNPOS_SQRT || |
|
/* Diacritic followed by ^ or _. */ |
|
((bp->top != NULL || bp->bottom != NULL) && |
|
bp->parent->type == EQN_SUBEXPR && |
|
bp->parent->pos != EQNPOS_OVER && bp->next != NULL) || |
|
/* Nested over, sub, sup, from, to. */ |
|
(bp->type == EQN_SUBEXPR && bp->pos != EQNPOS_SQRT && |
|
((bp->parent->type == EQN_LIST && bp->expectargs == 1) || |
|
(bp->parent->type == EQN_SUBEXPR && |
|
bp->pos != EQNPOS_SQRT)))))) { |
if (bp->parent->type == EQN_SUBEXPR && bp->prev != NULL) |
if (bp->parent->type == EQN_SUBEXPR && bp->prev != NULL) |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
term_word(p, bp->left != NULL ? bp->left : "("); |
term_word(p, bp->left != NULL ? bp->left : "("); |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
} |
delim = 1; |
|
} else |
|
delim = 0; |
|
|
|
/* Handle Fonts and text. */ |
|
|
if (bp->font != EQNFONT_NONE) |
if (bp->font != EQNFONT_NONE) |
term_fontpush(p, fontmap[(int)bp->font]); |
term_fontpush(p, fontmap[(int)bp->font]); |
|
|
if (bp->text != NULL) |
if (bp->text != NULL) |
term_word(p, bp->text); |
term_word(p, bp->text); |
|
|
|
/* Special box types. */ |
|
|
if (bp->pos == EQNPOS_SQRT) { |
if (bp->pos == EQNPOS_SQRT) { |
term_word(p, "sqrt"); |
term_word(p, "sqrt"); |
if (bp->first != NULL) { |
if (bp->first != NULL) { |
Line 111 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
Line 130 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
} |
} |
} |
} |
|
|
|
/* Handle Fonts and diacritics. */ |
|
|
if (bp->font != EQNFONT_NONE) |
if (bp->font != EQNFONT_NONE) |
term_fontpop(p); |
term_fontpop(p); |
if (bp->top != NULL) { |
if (bp->top != NULL) { |
Line 121 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
Line 142 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
term_word(p, "_"); |
term_word(p, "_"); |
} |
} |
if ((bp->type == EQN_LIST && bp->expectargs > 1) || |
|
(bp->type == EQN_PILE && (bp->prev || bp->next)) || |
/* Right delimiter after this box? */ |
(bp->parent != NULL && bp->parent->pos == EQNPOS_SQRT)) { |
|
|
if (delim) { |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
term_word(p, bp->right != NULL ? bp->right : ")"); |
term_word(p, bp->right != NULL ? bp->right : ")"); |
if (bp->parent->type == EQN_SUBEXPR && bp->next != NULL) |
if (bp->parent->type == EQN_SUBEXPR && bp->next != NULL) |