Universe

Write markdown-like tables easily.

Example

Have a look at the source here.

image

Usage

You can simply copy the markdown table and paste it in tablem function.

#import "@preview/tablem:0.2.0": tablem, three-line-table

#tablem[
  | *Name* | *Location* | *Height* | *Score* |
  | ------ | ---------- | -------- | ------- |
  | John   | Second St. | 180 cm   | 5       |
  | Wally  | Third Av.  | 160 cm   | 10      |
]

And you can use custom render function.

#import "@preview/tablem:0.2.0": tablem, three-line-table

#let three-line-table = tablem.with(
  render: (columns: auto, ..args) => {
    table(
      columns: columns,
      stroke: none,
      align: center + horizon,
      table.hline(y: 0),
      table.hline(y: 1, stroke: .5pt),
      ..args,
      table.hline(),
    )
  }
)

#three-line-table[
  | *Name* | *Location* | *Height* | *Score* |
  | ------ | ---------- | -------- | ------- |
  | John   | Second St. | 180 cm   | 5       |
  | Wally  | Third Av.  | 160 cm   | 10      |
]

image

Cell merging

Tablem supports both horizontal and vertical cell merging. You can merge cells using either < (or empty cell) for horizontal merging, and ^ (or empty cell) for vertical merging.

Horizontal Cell Merging

Here’s an example of horizontal cell merging:

#three-line-table[
  | Substance             | Subcritical °C | Supercritical °C |
  | --------------------- | -------------- | ---------------- |
  | Hydrochloric Acid     | 12.0           | 92.1             |
  | Sodium Myreth Sulfate | 16.6           | 104              |
  | Potassium Hydroxide   | 24.7           | <                |
]

You can also use empty cells instead of <:

  | Potassium Hydroxide   | 24.7           |                  |

Both syntaxes will produce the same result where “24.7” spans across two columns.

image

Vertical and Combined Cell Merging

You can merge cells vertically using ^ or empty cells, and even combine horizontal and vertical merging.

#tablem(ignore-second-row: false)[
  | Soldier | Hero       | <        | Soldier |
  | Guard   | Horizontal | <        | Guard   |
  | ^       | Soldier    | Soldier  | ^       |
  | Soldier | Gate       | <        | Soldier |
]

image

tablem function

#let tablem(
  render: table,
  ignore-second-row: true,
  use-table-header: true,
  ..args,
  body
) = { .. }

Arguments:

  • render: [(columns: int, ..args) => { .. }] — Custom render function, default to be table, receiving a integer-type columns, which is the count of first row. ..args is the combination of args of tablem function and children genenerated from body.
  • ignore-second-row: [boolean] — Whether to ignore the second row (something like |---|). Default to be true.
  • use-table-header: [boolean] — Whether to use table.header wrapper for the first row. Default to be true.
  • args: [any] — Some arguments you want to pass to render function.
  • body: [content] — The markdown-like table. There should be no extra line breaks in it.

License

This project is licensed under the MIT License.