From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from scc-mailout-kit-02.scc.kit.edu (scc-mailout-kit-02.scc.kit.edu [129.13.231.82]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTP id e94504c7 for ; Sat, 9 Feb 2019 16:06:57 -0500 (EST) Received: from asta-nat.asta.uni-karlsruhe.de ([172.22.63.82] helo=hekate.usta.de) by scc-mailout-kit-02.scc.kit.edu with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (envelope-from ) id 1gsZpv-0005Oc-Ne; Sat, 09 Feb 2019 22:06:57 +0100 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.77) (envelope-from ) id 1gsZpv-000374-Iw; Sat, 09 Feb 2019 22:06:55 +0100 Received: from athene.usta.de ([172.24.96.10]) by donnerwolke.usta.de with esmtp (Exim 4.84_2) (envelope-from ) id 1gsZpv-0004hS-Da; Sat, 09 Feb 2019 22:06:55 +0100 Received: from localhost (athene.usta.de [local]) by athene.usta.de (OpenSMTPD) with ESMTPA id c80a3fb3; Sat, 9 Feb 2019 22:06:55 +0100 (CET) Date: Sat, 9 Feb 2019 22:06:55 +0100 From: Ingo Schwarze To: "Anthony J. Bentley" Cc: tech@mandoc.bsd.lv Subject: Re: table borders don't span entire width Message-ID: <20190209210655.GI37934@athene.usta.de> References: <29630.1549662225@desktop.ajb.soy> <20190208220221.GF20044@athene.usta.de> X-Mailinglist: mandoc-tech Reply-To: tech@mandoc.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190208220221.GF20044@athene.usta.de> User-Agent: Mutt/1.8.0 (2017-02-23) Hi, Ingo Schwarze wrote on Fri, Feb 08, 2019 at 11:02:21PM +0100: > Anthony J. Bentley wrote on Fri, Feb 08, 2019 at 02:43:45PM -0700: >> I tried out an example from The Awk Programming Language. >> The tbl(7) source it generates looks in part like this: >> >> .TS >> center; >> n n n n. >> _ _ _ _ >> 2173 77.1 13765 53.6 >> = = = = >> .TE >> >> groff creates solid lines as in the book: >> >> --------------------------- >> 2173 77.1 13765 53.6 >> --------------------------- >> >> But mandoc breaks the lines between cells: >> >> ---- ---- ----- ---- >> 2173 77.1 13765 53.6 >> ==== ==== ===== ==== > That looks like a bug. > Here is what the tbl(7) manual page says: > > If a data cell contains only the single character '_' or '=', > a single or double horizontal line is drawn across the cell, > joining its neighbours. If a data cells contains only the two > character sequence '\_' or '\=', a single or double horizontal > line is drawn inside the cell, not joining its neighbours. Fixed with the commit below. More testing is welcome. Yours, Ingo Log Message: ----------- The horizontal line in a data cell containing only "_" or "=" connects to the horizontally adjacent vertical line or cell; fixing a bug reported by bentley@. Modified Files: -------------- mandoc: tbl_term.c Revision Data ------------- Index: tbl_term.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/tbl_term.c,v retrieving revision 1.67 retrieving revision 1.68 diff -Ltbl_term.c -Ltbl_term.c -u -p -r1.67 -r1.68 --- tbl_term.c +++ tbl_term.c @@ -166,7 +166,7 @@ term_tbl(struct termp *tp, const struct size_t save_offset; size_t coloff, tsz; int hspans, ic, more; - int dvert, fc, horiz, line, uvert; + int dvert, fc, horiz, lhori, rhori, uvert; /* Inhibit printing of spaces: we do padding ourselves. */ @@ -325,11 +325,13 @@ term_tbl(struct termp *tp, const struct (horiz || (IS_HORIZ(sp->layout->first) && !IS_HORIZ(sp->prev->layout->first)))) uvert = sp->prev->layout->vert; - line = sp->pos == TBL_SPAN_DHORIZ || + rhori = sp->pos == TBL_SPAN_DHORIZ || + (sp->first != NULL && sp->first->pos == TBL_DATA_DHORIZ) || sp->layout->first->pos == TBL_CELL_DHORIZ ? 2 : sp->pos == TBL_SPAN_HORIZ || + (sp->first != NULL && sp->first->pos == TBL_DATA_HORIZ) || sp->layout->first->pos == TBL_CELL_HORIZ ? 1 : 0; - fc = BUP * uvert + BDOWN * dvert + BRIGHT * line; + fc = BUP * uvert + BDOWN * dvert + BRIGHT * rhori; if (uvert > 0 || dvert > 0 || (horiz && sp->opts->lvert)) { (*tp->advance)(tp, tp->tcols->offset); tp->viscol = tp->tcol->offset; @@ -402,6 +404,15 @@ term_tbl(struct termp *tp, const struct cpn = cpn->next; } + lhori = (cp != NULL && + cp->pos == TBL_CELL_DHORIZ) || + (dp != NULL && + dp->pos == TBL_DATA_DHORIZ) ? 2 : + (cp != NULL && + cp->pos == TBL_CELL_HORIZ) || + (dp != NULL && + dp->pos == TBL_DATA_HORIZ) ? 1 : 0; + /* * Skip later cells in a span, * figure out whether to start a span, @@ -454,57 +465,36 @@ term_tbl(struct termp *tp, const struct } while (tp->viscol < tp->tcol->rmargin + tp->tbl.cols[ic].spacing / 2) - tbl_direct_border(tp, fc, 1); + tbl_direct_border(tp, + BHORIZ * lhori, 1); if (tp->tcol + 1 == tp->tcols + tp->lasttcol) continue; - if (cp != NULL) { - switch (cp->pos) { - case TBL_CELL_HORIZ: - fc = BLEFT; - break; - case TBL_CELL_DHORIZ: - fc = BLEFT * 2; - break; - default: - fc = 0; - break; - } + if (cp != NULL) cp = cp->next; - } - if (cp != NULL) { - switch (cp->pos) { - case TBL_CELL_HORIZ: - fc += BRIGHT; - break; - case TBL_CELL_DHORIZ: - fc += BRIGHT * 2; - break; - default: - break; - } - } + + rhori = (cp != NULL && + cp->pos == TBL_CELL_DHORIZ) || + (dp != NULL && + dp->pos == TBL_DATA_DHORIZ) ? 2 : + (cp != NULL && + cp->pos == TBL_CELL_HORIZ) || + (dp != NULL && + dp->pos == TBL_DATA_HORIZ) ? 1 : 0; + if (tp->tbl.cols[ic].spacing) - tbl_direct_border(tp, fc + + tbl_direct_border(tp, + BLEFT * lhori + BRIGHT * rhori + BUP * uvert + BDOWN * dvert, 1); if (tp->enc == TERMENC_UTF8) uvert = dvert = 0; - if (fc != 0) { - if (cp != NULL && - cp->pos == TBL_CELL_HORIZ) - fc = BHORIZ; - else if (cp != NULL && - cp->pos == TBL_CELL_DHORIZ) - fc = BHORIZ * 2; - else - fc = 0; - } if (tp->tbl.cols[ic].spacing > 2 && - (uvert > 1 || dvert > 1 || fc != 0)) - tbl_direct_border(tp, fc + + (uvert > 1 || dvert > 1 || rhori)) + tbl_direct_border(tp, + BHORIZ * rhori + BUP * (uvert > 1) + BDOWN * (dvert > 1), 1); } @@ -528,20 +518,27 @@ term_tbl(struct termp *tp, const struct (horiz || (IS_HORIZ(sp->layout->last) && !IS_HORIZ(sp->prev->layout->last)))) uvert = sp->prev->layout->last->vert; - line = sp->pos == TBL_SPAN_DHORIZ || + lhori = sp->pos == TBL_SPAN_DHORIZ || + (sp->last != NULL && + sp->last->pos == TBL_DATA_DHORIZ && + sp->last->layout->col + 1 == sp->opts->cols) || (sp->layout->last->pos == TBL_CELL_DHORIZ && sp->layout->last->col + 1 == sp->opts->cols) ? 2 : sp->pos == TBL_SPAN_HORIZ || + (sp->last != NULL && + sp->last->pos == TBL_DATA_HORIZ && + sp->last->layout->col + 1 == sp->opts->cols) || (sp->layout->last->pos == TBL_CELL_HORIZ && sp->layout->last->col + 1 == sp->opts->cols) ? 1 : 0; - fc = BUP * uvert + BDOWN * dvert + BLEFT * line; + fc = BUP * uvert + BDOWN * dvert + BLEFT * lhori; if (uvert > 0 || dvert > 0 || (horiz && sp->opts->rvert)) { if (horiz == 0 && (IS_HORIZ(sp->layout->last) == 0 || sp->layout->last->col + 1 < sp->opts->cols)) { tp->tcol++; - (*tp->advance)(tp, - tp->tcol->offset > tp->viscol ? - tp->tcol->offset - tp->viscol : 1); + do { + tbl_direct_border(tp, + BHORIZ * lhori, 1); + } while (tp->viscol < tp->tcol->offset); } tbl_direct_border(tp, fc, 1); } -- To unsubscribe send an email to tech+unsubscribe@mandoc.bsd.lv