tech@mandoc.bsd.lv
 help / color / mirror / Atom feed
From: Ingo Schwarze <schwarze@usta.de>
To: "Anthony J. Bentley" <anthony@anjbe.name>
Cc: tech@mandoc.bsd.lv
Subject: Re: tbl center box should center whole table
Date: Thu, 31 Jan 2019 17:15:09 +0100	[thread overview]
Message-ID: <20190131161509.GC64104@athene.usta.de> (raw)
In-Reply-To: <18017.1548754737@desktop.ajb.soy>

Hi Anthony,

Anthony J. Bentley wrote on Tue, Jan 29, 2019 at 02:38:57AM -0700:

> From fceux(6):

... which is an mdoc(7) document.

> .TS
> center box;
> cb | cb, cb | c.
> NES Gamepad     Keyboard
> =
> \(ua    Keypad Up
> \(da    Keypad Down
> \(<-    Keypad Left
> \(->    Keypad Right
> A       F
> B       D
> Select  S
> Start   Enter
> .TE
> 
>                            +------------+--------------+
>                            |NES Gamepad |   Keyboard   |
>      +============+==============+
>      |    ^       |  Keypad Up   |
>      |    v       | Keypad Down  |
>      |    <-      | Keypad Left  |
>      |    ->      | Keypad Right |
>      |     A      |      F       |
>      |     B      |      D       |
>      |  Select    |      S       |
>      |   Start    |    Enter     |
>      +------------+--------------+
> 
> groff(1) centers the whole table, and tbl(7)'s description seems to
> apply to the whole table:
> 
>      center  Center the table instead of left-adjusting it.  For GNU
>              compatibility, this may also be invoked with centre.

Absolutely, thanks for reporting the bug, which i fixed with the
following commit.

Yours,
  Ingo


Log Message:
-----------
Fix tbl(7) centering in mdoc(7) documents.

Since resetting of offsets works quite differently in the mdoc(7) 
and man(7) formatters, the tbl(7) formatter needs to save the global
offset on entry and restore it on exit.  The additional indentation
needed for table centering has to be added to its own offset variable
and applied to each line of the table, rather than only to the first.

Bug found by bentley@ in emulators/fceux(6).

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.66
retrieving revision 1.67
diff -Ltbl_term.c -Ltbl_term.c -u -p -r1.66 -r1.67
--- tbl_term.c
+++ tbl_term.c
@@ -1,7 +1,7 @@
 /*	$Id$ */
 /*
  * Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2019 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -163,6 +163,7 @@ term_tbl(struct termp *tp, const struct 
 	const struct tbl_cell	*cp, *cpn, *cpp, *cps;
 	const struct tbl_dat	*dp;
 	static size_t		 offset;
+	size_t		 	 save_offset;
 	size_t			 coloff, tsz;
 	int			 hspans, ic, more;
 	int			 dvert, fc, horiz, line, uvert;
@@ -170,6 +171,7 @@ term_tbl(struct termp *tp, const struct 
 	/* Inhibit printing of spaces: we do padding ourselves. */
 
 	tp->flags |= TERMP_NOSPACE | TERMP_NONOSPACE;
+	save_offset = tp->tcol->offset;
 
 	/*
 	 * The first time we're invoked for a given table block,
@@ -211,8 +213,9 @@ term_tbl(struct termp *tp, const struct 
 				tsz += tp->tbl.cols[sp->opts->cols - 1].width;
 			if (offset + tsz > tp->tcol->rmargin)
 				tsz -= 1;
-			tp->tcol->offset = offset + tp->tcol->rmargin > tsz ?
+			offset = offset + tp->tcol->rmargin > tsz ?
 			    (offset + tp->tcol->rmargin - tsz) / 2 : 0;
+			tp->tcol->offset = offset;
 		}
 
 		/* Horizontal frame at the start of boxed tables. */
@@ -227,6 +230,7 @@ term_tbl(struct termp *tp, const struct 
 	/* Set up the columns. */
 
 	tp->flags |= TERMP_MULTICOL;
+	tp->tcol->offset = offset;
 	horiz = 0;
 	switch (sp->pos) {
 	case TBL_SPAN_HORIZ:
@@ -567,12 +571,12 @@ term_tbl(struct termp *tp, const struct 
 		assert(tp->tbl.cols);
 		free(tp->tbl.cols);
 		tp->tbl.cols = NULL;
-		tp->tcol->offset = offset;
 	} else if (horiz == 0 && sp->opts->opts & TBL_OPT_ALLBOX &&
 	    (sp->next == NULL || sp->next->pos == TBL_SPAN_DATA ||
 	     sp->next->next != NULL))
 		tbl_hrule(tp, sp, sp->next, TBL_OPT_ALLBOX);
 
+	tp->tcol->offset = save_offset;
 	tp->flags &= ~TERMP_NONOSPACE;
 }
 
--
 To unsubscribe send an email to tech+unsubscribe@mandoc.bsd.lv

      reply	other threads:[~2019-01-31 16:15 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-29  9:38 Anthony J. Bentley
2019-01-31 16:15 ` Ingo Schwarze [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190131161509.GC64104@athene.usta.de \
    --to=schwarze@usta.de \
    --cc=anthony@anjbe.name \
    --cc=tech@mandoc.bsd.lv \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).