version 1.9, 2017/02/12 14:19:01 |
version 1.12, 2017/07/07 19:06:31 |
|
|
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; |
|
|
if (bp->type == EQN_LIST || |
/* Delimiters around this box? */ |
|
|
|
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 96 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
Line 115 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
} else { |
} else { |
child = bp->first; |
child = bp->first; |
if (bp->type == EQN_MATRIX && |
if (bp->type == EQN_MATRIX && |
child != NULL && child->type == EQN_LIST) |
child != NULL && |
|
child->type == EQN_LIST && |
|
child->expectargs > 1) |
child = child->first; |
child = child->first; |
while (child != NULL) { |
while (child != NULL) { |
eqn_box(p, |
eqn_box(p, |
bp->type == EQN_PILE && |
bp->type == EQN_PILE && |
child->type == EQN_LIST && |
child->type == EQN_LIST && |
|
child->expectargs > 1 && |
child->args == 1 ? |
child->args == 1 ? |
child->first : child); |
child->first : child); |
child = child->next; |
child = child->next; |
} |
} |
} |
} |
|
|
|
/* Handle Fonts and diacritics. */ |
|
|
if (bp->font != EQNFONT_NONE) |
if (bp->font != EQNFONT_NONE) |
term_fontpop(p); |
term_fontpop(p); |
if (bp->type == EQN_LIST || |
|
(bp->type == EQN_PILE && (bp->prev || bp->next)) || |
|
(bp->parent != NULL && bp->parent->pos == EQNPOS_SQRT)) { |
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, bp->right != NULL ? bp->right : ")"); |
|
if (bp->parent->type == EQN_SUBEXPR && bp->next != NULL) |
|
p->flags |= TERMP_NOSPACE; |
|
} |
|
|
|
if (bp->top != NULL) { |
if (bp->top != NULL) { |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
term_word(p, bp->top); |
term_word(p, bp->top); |
Line 126 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
Line 141 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
if (bp->bottom != NULL) { |
if (bp->bottom != NULL) { |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
term_word(p, "_"); |
term_word(p, "_"); |
|
} |
|
|
|
/* Right delimiter after this box? */ |
|
|
|
if (delim) { |
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, bp->right != NULL ? bp->right : ")"); |
|
if (bp->parent->type == EQN_SUBEXPR && bp->next != NULL) |
|
p->flags |= TERMP_NOSPACE; |
} |
} |
} |
} |