+}
+
+static void
+add_footnote_page (struct render_pager *p, const struct table_item *item)
+{
+ const struct footnote **f;
+ size_t n_footnotes = table_collect_footnotes (item, &f);
+ if (!n_footnotes)
+ return;
+
+ struct tab_table *t = tab_create (2, n_footnotes);
+
+ for (size_t i = 0; i < n_footnotes; i++)
+ if (f[i])
+ {
+ tab_text_format (t, 0, i, TAB_LEFT, "%s.", f[i]->marker);
+ tab_text (t, 1, i, TAB_LEFT, f[i]->content);
+ if (f[i]->style)
+ {
+ tab_add_style (t, 0, i, f[i]->style);
+ tab_add_style (t, 1, i, f[i]->style);
+ }
+ }
+ render_pager_add_table (p, &t->table, 0);
+
+ free (f);
+}
+
+static void
+add_text_page (struct render_pager *p, const struct table_item_text *t,
+ int min_width)
+{
+ if (!t)
+ return;
+
+ 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);
+
+ render_pager_start_page (p);
+