- struct tab_table *tab = tab_create (1, 1);
- tab_text (tab, 0, 0, 0, t->content);
- for (size_t i = 0; i < t->n_footnotes; i++)
- tab_add_footnote (tab, 0, 0, t->footnotes[i]);
- if (t->style)
- tab->styles[0] = area_style_clone (tab->container, t->style);
- render_pager_add_table (p, &tab->table, min_width);
-}
-
-/* Creates and returns a new render_pager for rendering TABLE_ITEM on the
- device with the given PARAMS. */
-struct render_pager *
-render_pager_create (const struct render_params *params,
- const struct table_item *table_item)
-{
- const struct table *table = table_item_get_table (table_item);
-
- struct render_pager *p = xzalloc (sizeof *p);
- p->params = params;
-
- struct render_page *page = render_page_create (params, table_ref (table), 0);
- struct render_break b;
- render_break_init (&b, page, H);
- struct render_page *subpage = render_break_next (&b, p->params->size[H]);
- int title_width = subpage ? subpage->cp[H][2 * subpage->n[H] + 1] : 0;
- render_page_unref (subpage);
- render_break_destroy (&b);
-
- /* Title. */
- add_text_page (p, table_item_get_title (table_item), title_width);
-
- /* Layers. */
- add_text_page (p, table_item_get_layers (table_item), title_width);
-
- /* Body. */
- render_pager_add_table (p, table_ref (table_item_get_table (table_item)), 0);
-
- /* Caption. */
- add_text_page (p, table_item_get_caption (table_item), 0);
-
- /* Footnotes. */
- add_footnote_page (p, table_item);
+ /* Create the pager. */
+ struct render_pager *p = xmalloc (sizeof *p);
+ *p = (struct render_pager) { .params = params, .scale = scale };
+ render_pager_add_table (p, title, body_width);
+ render_pager_add_table (p, layers, body_width);
+ p->pages[p->n_pages++] = body_page;
+ render_pager_add_table (p, caption, 0);
+ render_pager_add_table (p, footnotes, 0);
+ assert (p->n_pages <= sizeof p->pages / sizeof *p->pages);
+
+ /* If we're shrinking tables to fit the page length, then adjust the scale
+ factor.
+
+ XXX This will sometimes shrink more than needed, because adjusting the
+ scale factor allows for cells to be "wider", which means that sometimes
+ they won't break across as much vertical space, thus shrinking the table
+ vertically more than the scale would imply. Shrinking only as much as
+ necessary would require an iterative search. */
+ if (pt->look->shrink_to_fit[V] && params->ops->scale)
+ {
+ int total_height = 0;
+ for (size_t i = 0; i < p->n_pages; i++)
+ total_height += table_width (p->pages[i], V);
+ if (total_height * p->scale >= params->size[V])
+ p->scale *= params->size[V] / (double) total_height;
+ }