version 1.13, 2017/07/08 14:51:04 |
version 1.19, 2018/12/13 05:23:38 |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
#include <assert.h> |
#include <assert.h> |
|
#include <ctype.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
#include "mandoc.h" |
#include "eqn.h" |
#include "out.h" |
#include "out.h" |
#include "term.h" |
#include "term.h" |
|
|
|
|
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; |
|
const char *cp; |
int delim; |
int delim; |
|
|
/* Delimiters around this box? */ |
/* Delimiters around this box? */ |
Line 67 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
Line 69 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
((bp->parent->type == EQN_LIST && bp->expectargs == 1) || |
((bp->parent->type == EQN_LIST && bp->expectargs == 1) || |
(bp->parent->type == EQN_SUBEXPR && |
(bp->parent->type == EQN_SUBEXPR && |
bp->pos != EQNPOS_SQRT)))))) { |
bp->pos != EQNPOS_SQRT)))))) { |
if (bp->parent->type == EQN_SUBEXPR && bp->prev != NULL) |
if ((bp->parent->type == EQN_SUBEXPR && bp->prev != NULL) || |
|
(bp->type == EQN_LIST && |
|
bp->first != NULL && |
|
bp->first->type != EQN_PILE && |
|
bp->first->type != EQN_MATRIX && |
|
bp->prev != NULL && |
|
(bp->prev->type == EQN_LIST || |
|
(bp->prev->type == EQN_TEXT && |
|
(*bp->prev->text == '\\' || |
|
isalpha((unsigned char)*bp->prev->text)))))) |
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; |
Line 80 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
Line 91 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
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) { |
|
if (strchr("!\"'),.:;?]}", *bp->text) != NULL) |
|
p->flags |= TERMP_NOSPACE; |
term_word(p, bp->text); |
term_word(p, bp->text); |
|
if ((cp = strchr(bp->text, '\0')) > bp->text && |
|
(strchr("\"'([{", cp[-1]) != NULL || |
|
(bp->prev == NULL && (cp[-1] == '-' || |
|
(cp >= bp->text + 5 && |
|
strcmp(cp - 5, "\\[mi]") == 0))))) |
|
p->flags |= TERMP_NOSPACE; |
|
} |
|
|
/* Special box types. */ |
/* Special box types. */ |
|
|
if (bp->pos == EQNPOS_SQRT) { |
if (bp->pos == EQNPOS_SQRT) { |
term_word(p, "sqrt"); |
term_word(p, "\\(sr"); |
if (bp->first != NULL) { |
if (bp->first != NULL) { |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
eqn_box(p, bp->first); |
eqn_box(p, bp->first); |
Line 98 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
Line 118 eqn_box(struct termp *p, const struct eqn_box *bp) |
|
term_word(p, bp->pos == EQNPOS_OVER ? "/" : |
term_word(p, bp->pos == EQNPOS_OVER ? "/" : |
(bp->pos == EQNPOS_SUP || |
(bp->pos == EQNPOS_SUP || |
bp->pos == EQNPOS_TO) ? "^" : "_"); |
bp->pos == EQNPOS_TO) ? "^" : "_"); |
p->flags |= TERMP_NOSPACE; |
|
child = child->next; |
child = child->next; |
if (child != NULL) { |
if (child != NULL) { |
|
p->flags |= TERMP_NOSPACE; |
eqn_box(p, child); |
eqn_box(p, child); |
if (bp->pos == EQNPOS_FROMTO || |
if (bp->pos == EQNPOS_FROMTO || |
bp->pos == EQNPOS_SUBSUP) { |
bp->pos == EQNPOS_SUBSUP) { |