+}
+
+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 table *t = table_create (1, n_footnotes, 0, 0, 0, 0);
+
+ for (size_t i = 0; i < n_footnotes; i++)
+ {
+ table_text_format (t, 0, i, 0, "%s. %s", f[i]->marker, f[i]->content);
+ table_add_style (t, 0, i, f[i]->style);
+ }
+ render_pager_add_table (p, t, 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 table *tab = table_create (1, 1, 0, 0, 0, 0);
+ table_text (tab, 0, 0, 0, t->content);
+ for (size_t i = 0; i < t->n_footnotes; i++)
+ table_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, min_width);
+}
+
+static void
+add_layers_page (struct render_pager *p,
+ const struct table_item_layers *layers, int min_width)
+{
+ if (!layers)
+ return;
+
+ struct table *tab = table_create (1, layers->n_layers, 0, 0, 0, 0);
+ for (size_t i = 0; i < layers->n_layers; i++)
+ {
+ const struct table_item_layer *layer = &layers->layers[i];
+ table_text (tab, 0, i, 0, layer->content);
+ for (size_t j = 0; j < layer->n_footnotes; j++)
+ table_add_footnote (tab, 0, i, layer->footnotes[j]);
+ }
+ if (layers->style)
+ tab->styles[0] = area_style_clone (tab->container, layers->style);
+ render_pager_add_table (p, tab, 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_layers_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);
+