← Back to all sparks
T

tabular

INFRA · APIS
Velocity2.5

Render Tables, Listings, and Figures for Clinical Submissions

tabular went from clinical tables to complete TFL output in under two months.

r-packagesclinical-trialsdocument-renderingtypstregulatory-submissions
Current state
tabular renders pre-summarised clinical tables, figures and listings to RTF, LaTeX, HTML, PDF, DOCX, Markdown and now Typst from one immutable verb pipeline, with no external SAS or Java runtime. It arrived in June 2026 as a CRAN submission candidate, added figure() a month later to cover the F in TFL, and has spent the 0.3.x line on speed, font resolution and toolchain diagnostics.
Where it's heading
The work is converging on backend parity — one spec should render the same wherever you emit it. Recent notes are almost entirely gap-closing between targets: bold column headers and page-width correction on LaTeX, cell margins on DOCX, group-separator blank rows re-expressed as discardable space so a page never ends on a stray gap, whitespace collapsing honoured on Typst. Diagnostics are keeping pace, with check_latex() probing through kpsewhich and check_typst() auditing the compiler and font chain.
Prediction
With both toolchain checkers in place, the friction that remains is environmental rather than featural, and the notes point to further parity and packaging fixes rather than another backend. Whether Typst becomes the default PDF path instead of LaTeX is not something these notes settle.

Recent moves

  1. 27d ago

    Test-only fix for the CRAN macOS arm64 check

    A patch whose own notes state package code is unchanged: a check_latex() test that probes TinyTeX off the PATH now skips on CRAN, where a TinyTeX root can exist without a working TeX behind it. Housekeeping to keep the CRAN check green.

    View source ↗
  2. 1mo ago

    Typst backend, check_typst(), and 11-24% faster rendering

    Another rendering target rather than another output type: emit() gains a standalone Typst document backend, with check_typst() to audit the compiler and font chain. Alongside it, as_grid() and emit() get 11-24% faster by parsing markup once per distinct string and dropping quadratic row assembly.

    View source ↗
  3. 1mo ago

    figure() completes the T, F and L of TFL output

    ⚡ SPARK

    The release that made the package's name honest: figure() renders the F in TFL to every backend, wrapping a ggplot, a base-R plot, a drawing function or an image file in the same submission chrome as a table. Before this, tabular covered two of the three deliverable types a study report needs.

    View source ↗
  4. 2mo ago

    First release: clinical table rendering without SAS or Java

    ⚡ SPARK

    The package's first release and CRAN submission candidate, establishing native rendering of pre-summarised clinical tables and listings to five formats from one immutable verb pipeline. Everything since has been widening the output surface and closing gaps between backends.

    View source ↗