]> git.cameronkatri.com Git - mandoc.git/blobdiff - eqn_term.c
Delete a sentence pointing to "the Predefined Strings subsection
[mandoc.git] / eqn_term.c
index fde0aca0ede69f85932eb991374d3307d1a007b0..3e27233b30f9ef1192c472dd3f9be80f045d0744 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: eqn_term.c,v 1.12 2017/07/07 19:06:31 schwarze Exp $ */
+/*     $Id: eqn_term.c,v 1.19 2018/12/13 05:23:38 schwarze Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
 #include <sys/types.h>
 
 #include <assert.h>
+#include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
-#include "mandoc.h"
+#include "eqn.h"
 #include "out.h"
 #include "term.h"
 
@@ -40,10 +41,10 @@ static void eqn_box(struct termp *, const struct eqn_box *);
 
 
 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;
 }
 
@@ -51,6 +52,7 @@ static void
 eqn_box(struct termp *p, const struct eqn_box *bp)
 {
        const struct eqn_box *child;
+       const char *cp;
        int delim;
 
        /* Delimiters around this box? */
@@ -67,7 +69,16 @@ eqn_box(struct termp *p, const struct eqn_box *bp)
             ((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) ||
+                   (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;
                term_word(p, bp->left != NULL ? bp->left : "(");
                p->flags |= TERMP_NOSPACE;
@@ -80,13 +91,22 @@ eqn_box(struct termp *p, const struct eqn_box *bp)
        if (bp->font != EQNFONT_NONE)
                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);
+               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. */
 
        if (bp->pos == EQNPOS_SQRT) {
-               term_word(p, "sqrt");
+               term_word(p, "\\(sr");
                if (bp->first != NULL) {
                        p->flags |= TERMP_NOSPACE;
                        eqn_box(p, bp->first);
@@ -98,9 +118,9 @@ eqn_box(struct termp *p, const struct eqn_box *bp)
                term_word(p, bp->pos == EQNPOS_OVER ? "/" :
                    (bp->pos == EQNPOS_SUP ||
                     bp->pos == EQNPOS_TO) ? "^" : "_");
-               p->flags |= TERMP_NOSPACE;
                child = child->next;
                if (child != NULL) {
+                       p->flags |= TERMP_NOSPACE;
                        eqn_box(p, child);
                        if (bp->pos == EQNPOS_FROMTO ||
                            bp->pos == EQNPOS_SUBSUP) {