render: Center and emphasize table titles. center-titles
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 16 Sep 2014 05:48:00 +0000 (22:48 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 16 Sep 2014 05:48:00 +0000 (22:48 -0700)
Before applying, this needs to distinguish between tables that will be
rendered as one piece (where the title should be centered across the
table) and tables that will be broken up (where the title should be
centered across the first fragment of the table).

src/output/render.c

index d282a8fce68797e0430fc7a95cf86a5c1dbe35dd..0585d2362236889b18e38da7bf35c4cdca119ad4 100644 (file)
@@ -933,6 +933,33 @@ render_page_get_size (const struct render_page *page, enum table_axis axis)
   return page->cp[axis][page->n[axis] * 2 + 1];
 }
 
+/* If PAGE is smaller than SIZE along AXIS, inserts extra space to increase
+   its size to SIZE. */
+void
+render_page_stretch (struct render_page *page, enum table_axis axis,
+                     int size)
+{
+  int extra = size - render_page_get_size (page, axis);
+  if (extra > 0)
+    {
+      int n = page->n[axis];
+      int error = 0;
+      int adjust = 0;
+      int i;
+
+      for (i = 2; i <= 2 * n + 1; i++)
+        {
+          if (!(i & 1))
+            {
+              error += extra;
+              adjust += error / n;
+              error %= n;
+            }
+          page->cp[axis][i] += adjust;
+        }
+    }
+}
+
 int
 render_page_get_best_breakpoint (const struct render_page *page, int height)
 {
@@ -1416,7 +1443,7 @@ struct render_pager
     struct render_break y_break;
   };
 
-static const struct render_page *
+static struct render_page *
 render_pager_add_table (struct render_pager *p, struct table *table)
 {
   struct render_page *page;
@@ -1489,18 +1516,27 @@ render_pager_create (const struct render_params *params,
   const char *caption = table_item_get_caption (table_item);
   const char *title = table_item_get_title (table_item);
   const struct render_page *body_page;
+  struct render_page *title_page;
   struct render_pager *p;
 
   p = xzalloc (sizeof *p);
   p->params = params;
 
   /* Title. */
-  if (title)
-    render_pager_add_table (p, table_from_string (TAB_LEFT, title));
+  title_page = (title
+                ? render_pager_add_table (
+                  p, table_from_string (TAB_CENTER | TAB_EMPH, title))
+                : NULL);
 
   /* Body. */
   body_page = render_pager_add_table (p, table_ref (table_item_get_table (
                                                       table_item)));
+  if (title_page && body_page)
+    {
+      int body_page_size = render_page_get_size (body_page, H);
+      render_page_stretch (title_page, H,
+                           MIN (body_page_size, params->size[H]));
+    }
 
   /* Caption. */
   if (caption)