---
title: Pax Markdown
canonical_url: https://paxabyssi.com/wiki/Pax_Abyssi_Wiki:Pax_Markdown
markdown_url: https://paxabyssi.com/wiki/Pax_Abyssi_Wiki:Pax_Markdown.md
type: wiki-page
namespace: Pax Abyssi Wiki
revision_id: 549
revision_view: stable
last_updated: 2026-09-27
license: CC BY-SA 4.0
license_url: https://creativecommons.org/licenses/by-sa/4.0/
summary: The writing format of every wiki page, article and forum post on paxabyssi.com, with its frontmatter, links, maths and directives.
categories:
  - Help
  - Style guides
---

# Pax Markdown

> Source: https://paxabyssi.com/wiki/Pax_Abyssi_Wiki:Pax_Markdown
>
> Licence: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). Text by Pax Abyssi Wiki contributors; history at https://paxabyssi.com/wiki/Pax_Abyssi_Wiki:Pax_Markdown/history
>
> Revision 549, 27 September 2026

Every wiki page, article, forum post and edit on paxabyssi.com is written
in Pax Markdown: CommonMark and GitHub Flavored Markdown, with maths, a YAML
frontmatter block, wikilinks and a small closed set of directives. This
page is the writer's reference; the house style rules are on
[Pax Abyssi Wiki:Style guide](https://paxabyssi.com/wiki/Pax_Abyssi_Wiki:Style_guide.md).

## At a glance

| You want              | Write                                                                                       |
| --------------------- | ------------------------------------------------------------------------------------------- |
| A link to a wiki page | `[[Tau Ceti]]`, `[[Tau Ceti e\|the planet]]`, `[[Tau Ceti e#Atmosphere]]`, `[[exoplanet]]s` |
| A link elsewhere      | `[NASA Exoplanet Archive](https://exoplanetarchive.ipac.caltech.edu)`                       |
| Maths                 | `$T_\mathrm{eq}$` inline, `$$` on its own lines for a display block                         |
| An image              | `::figure{src="File:Name.avif" alt="What it shows" caption="One sentence."}`                |
| A grid of images      | `:::gallery` with list items `- File:Name.avif \| alt text \| caption`                      |
| A boxed aside         | `:::callout{type=science title="Why it glows"}` ... `:::`                                   |
| Hidden text           | `:::spoiler{title="Campaign ending"}` ... `:::`                                             |
| A pull quote          | `:::pullquote` ... `:::`                                                                    |
| A table of data       | `:::data-table{caption="..."}` with a YAML body, or `::data-table{dataset=ships}`           |
| A live sim number     | `:sim{ref=ship.corvette.mass_t unit=t}`                                                     |
| A citation            | `:cite[sudarsky2000]` or `:cite[sudarsky2000, burrows2001]`                                 |
| The web orrery        | `::orrery{system=tau-ceti focus=e}`                                                         |
| A video               | `::youtube{id=dQw4w9WgXcQ title="A flyby"}`                                                 |
| A footnote            | `text[^1]` and, on its own line, `[^1]: The note.`                                          |

Raw HTML is not rendered: `<div>` shows as the text `<div>`.

## Frontmatter

A page starts with YAML between two `---` lines. The first line of the file
must be `---`.

```yaml
---
title: Hot Jupiter
summary: A gas giant so close to its star that its year lasts days.
science_status: [observed, sim]
categories: [Gas giants, Planet classes]
aliases: [Hot Jupiters, Roaster]
infobox:
  type: planet_class
  image: File:Hot_Jupiter_sim.avif
  host_star: "[[51 Pegasi]]"
sim:
  entity: planet_class.GGH
refs:
  - id: sudarsky2000
    type: article-journal
    author: [{family: Sudarsky, given: David}, {family: Burrows, given: Adam}]
    title: "Albedo and Reflection Spectra of Extrasolar Giant Planets"
    container-title: The Astrophysical Journal
    volume: 538
    page: 885-903
    issued: 2000
    DOI: 10.1086/309060
---
```

- `categories` puts the page in those categories (names follow title rules,
  so `Gas giants` and `gas_giants` are the same category). A single category
  may be written as a plain string.
- `aliases` create redirects to the page. `redirect: Target#Section` turns
  the page itself into a redirect.
- Wikilinks inside `infobox` values are real links, and `File:` values in
  `infobox`, `image` and `hero` count as uses of that file.
- `refs` is a list of CSL-JSON entries; each needs a text `id`. The site
  numbers them in the order you first cite them and prints the References
  list at the end. Do not write a References section yourself.
- YAML here follows version 1.2: `yes`, `no` and `on` are plain words,
  `2026-09-27` stays text, and a repeated key is an error.

## Text

CommonMark with the GitHub extensions: `*emphasis*`, `**strong**`,
`` `code` ``, lists, `> quotes`, fenced code blocks, `---` rules, tables,
task lists (`- [ ] item`), strikethrough with two tildes (`~~gone~~`),
footnotes and bare URLs that become links.

Tables need a header row and a delimiter row with at least one `|` or `:`:

```markdown
| Body | a (AU) | Period (d) |
|------|-------:|-----------:|
| [[Earth]] | 1.00 | 365.26 |
```

Cells past the header's count are dropped. Number columns are set in mono
and right-aligned automatically.

## Links

**Wikilinks** point at wiki pages by title:

- `[[Tau Ceti]]` links to `/wiki/Tau_Ceti`.
- `[[Tau Ceti e|the planet]]` shows "the planet".
- `[[Tau Ceti e#Atmosphere]]` links to a section; the anchor is the section
  heading as the site slugs it (`#atmosphere`). `[[#Orbit]]` links to a
  section of the same page.
- `[[exoplanet]]s` shows "exoplanets": lower-case letters straight after the
  brackets join the link text.
- Namespaces: `[[Talk:Tau Ceti]]`, `[[User:Name]]`, `[[File:Name.avif]]` (the
  file's page), `[[Pax Abyssi Wiki:Style guide]]`, `[[Draft:...]]`,
  `[[Template:...]]`, `[[Special:RecentChanges]]`. `[[:Category:Stars]]` links
  to a category page; `[[Category:Stars]]` works too but warns, because
  categories are set in the frontmatter.
- Titles follow MediaWiki rules: spaces and underscores are the same, the
  first letter is capitalised for you, and `# < > [ ] | { }` cannot appear.
  A link to a page that does not exist yet shows in red.
- Inside a table cell, write the pipe as `\|`: `[[Tau Ceti\|HD 10700]]`.
- The link text is plain: `[[Page|*text*]]` shows the asterisks.

**Ordinary links** use `[text](url)`, `<https://...>` or a bare URL. Only
`http`, `https` and `mailto` links are allowed; anything else is an error
and is removed. Links off the site carry `rel="nofollow ugc noopener"` on
the wiki and forum.

**Images** written as `![alt](url)` are not used: add the image to the
media library and use `::figure`, so every image carries its credit and
licence.

## Headings

`## Section`, `### Subsection`. The page title comes from the frontmatter,
so start sections at `##`. Each heading gets an anchor made the GitHub way:
lower case, punctuation removed, spaces to hyphens, a `-1`, `-2` suffix for
repeats. `## Mass and radius` becomes `#mass-and-radius`.

## Maths

`$...$` inline and a `$$` fence for display maths:

```markdown
The equilibrium temperature $T_\mathrm{eq}$ is

$$
T_\mathrm{eq} = T_\star \sqrt{\frac{R_\star}{2a}}\,(1 - A)^{1/4}
$$
```

Maths is rendered with KaTeX. Underscores and asterisks inside maths are
safe. A dollar sign starts maths, so write money as `\$5`.

## Directives

Directives add what Markdown lacks. There are three forms:

| Form      | Syntax                                                           | Used for                                                                               |
| --------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| Text      | `:name[label]{attributes}` inside a sentence                     | `:sim`, `:cite`                                                                        |
| Leaf      | `::name[label]{attributes}` alone on a line                      | `::figure`, `::data-table`, `::orrery`, `::youtube`                                    |
| Container | `:::name[label]{attributes}`, content, then a closing `:::` line | `:::callout`, `:::spoiler`, `:::pullquote`, `:::figure`, `:::gallery`, `:::data-table` |

Attributes: `key=value`, `key="value with spaces"` or `key='value'`,
separated by spaces. Values cannot contain `<`, `>`, `=` or a backtick unless
quoted. A leaf or container line must hold nothing after the closing `}`.

Nesting: a closing line closes the innermost open container with at least as
many colons, so give the outer container more colons:

```markdown
::::callout{type=science title="Outer"}
:::figure{src="File:Inner.avif" alt="..."}
The inner figure's caption.
:::
::::
```

A colon followed by a word with no brackets or braces (`10:30`,
`File:Name.avif` in prose) is plain text. An unknown directive, or a known
one in the wrong form (`::callout`), is an error: the editor preview shows a
red box and the published page shows nothing.

### figure

```markdown
::figure{src="File:Hot_Jupiter_sim.avif" size=wide alt="A gas giant glowing red on its dayside" caption="A hot Jupiter from the sim."}

:::figure{src="File:Transit.avif" alt="A light curve with a dip"}
A caption with *emphasis*, a [[Transit method|link]] and maths $\Delta F$.
:::
```

- `src` (required): a `File:` title from the media library.
- `alt` (required): what the image shows, for readers who cannot see it.
  `alt=""` marks a purely decorative image.
- `caption`: one or two sentences; a container body or a `[label]` also
  works and may hold links and maths. Without one, the media page's caption
  is used.
- `size`: `normal` (the text column, default), `medium` (a narrower inset,
  for portraits and discs), `wide` (1040 px in articles) or `full` (the
  window width in articles).
- The credit and licence line always comes from the media page. `credit`,
  `licence` and `source` attributes are errors.
- Figures are numbered in order: Figure 1, Figure 2.

### gallery

```markdown
:::gallery{caption="Three giants from the same generator."}
- File:Ice_giant.avif | A blue ice giant with faint cloud streaks | Ice giant
- File:Green_giant.avif | A green giant with soft bands | Green giant
::figure{src="File:Ringed.avif" alt="A ringed giant at a low angle"}
:::
```

Each list item is `File:Name | alt text | caption` (alt is required). Leaf
`::figure` lines work too. `size` defaults to `wide`.

### callout

```markdown
:::callout{type=sim title="In Pax Abyssi"}
How the sim generates this, with honest status.
:::
```

`type` is `note` (default), `warning`, `science`, `sim` (shown as "In the
sim") or `lore`. `title` replaces the default label; `:::callout[Title]` also
works.

### spoiler

`:::spoiler{title="Campaign ending"}` ... `:::`. Collapsed until the reader
opens it; works without JavaScript.

### pullquote

`:::pullquote{attribution="Name, role"}` ... `:::`. At most one per 1,200
words.

### data-table

Inline data, as a YAML body in a container:

```markdown
:::data-table{caption="Inner planets" provenance=observed}
- {name: Mercury, mass_earth: 0.055, radius_earth: 0.383}
- {name: Venus, mass_earth: 0.815, radius_earth: 0.949}
:::
```

or with explicit columns (labels, units, alignment):

```markdown
:::data-table{caption="Sudarsky classes" provenance=model}
columns:
  - class
  - {key: teq, label: Temperature, unit: K, align: right}
rows:
  - [I, "< 150"]
  - [II, "~250"]
:::
```

The body is YAML, not Markdown: `#` lines are YAML comments and links are
not followed. Cells are plain values.

A dataset from the current sim build, as a leaf:

```markdown
::data-table{dataset=ships columns="name,mass_t,thrust_kN" where="class=corvette" sort=-mass_t limit=10}
```

`columns` picks and orders columns, `where` keeps rows with `key=value` or
`key!=value` (comma-separated, all must hold), `sort` orders by a column
(`-` for descending), `limit` caps the rows. `provenance` is `catalogue`,
`sim`, `fiction`, `observed` or `model` and prints the matching tag.

### sim

`:sim{ref=ship.corvette.mass_t unit=t}` prints the value from the current
build, with the build in a tooltip. `digits=1` fixes the decimals.
`:sim[about 3,000]{ref=...}` shows the label if the value is unavailable.

### cite

`:cite[sudarsky2000]`, `:cite[sudarsky2000, burrows2001]` (a semicolon or
`@id` also work). Each id must be in the frontmatter `refs`. Citations show
as [1] or [1, 2] and link to the References list.

### orrery

`::orrery{system=tau-ceti focus=e height=480}` embeds the web orrery for a
system (`system` is the orrery's slug; `height` in pixels, 100 to 9999).

### youtube

`::youtube{id=dQw4w9WgXcQ title="A flyby" start=30}`. Nothing is fetched
from YouTube until the reader presses play, and then only from
youtube-nocookie.com.

## House style checks

The editor and the save checks enforce the house style:

- **No em dashes, ever** (U+2014). Use a hyphen, a colon, a comma pair or
  two sentences. Code and frontmatter are not exempt.
- An en dash (U+2013) with a space on either side is a dash in disguise and
  is flagged. A plain hyphen is safest everywhere.
- The copy checks also flag the stock writing tropes from the house style
  table: the
  antithesis twin (saying what a thing is not before what it is), empty
  intensifiers, inflated nouns and verbs, hook fragments, the reflective
  closer and the "if you are this or that" address.

## Messages you may see

| Code                      | Severity | Meaning                                                                        |
| ------------------------- | -------- | ------------------------------------------------------------------------------ |
| `frontmatter-unclosed`    | error    | The opening `---` has no closing `---` line                                    |
| `frontmatter-yaml`        | error    | The frontmatter is not valid YAML (reported on line 1)                         |
| `frontmatter-not-mapping` | error    | The frontmatter is a list or a value, not `key: value` lines                   |
| `refs-invalid`            | error    | `refs` is not a list, or an entry has no text `id`                             |
| `refs-duplicate`          | error    | Two refs share an id                                                           |
| `ref-unused`              | warning  | A ref is never cited                                                           |
| `categories-invalid`      | error    | A category is not a list of valid names                                        |
| `em-dash`                 | error    | An em dash                                                                     |
| `en-dash`                 | warning  | An en dash used as a dash                                                      |
| `unknown-directive`       | error    | No directive has that name                                                     |
| `directive-kind`          | error    | A directive written in the wrong form (`::callout`)                            |
| `directive-unclosed`      | error    | A container has no closing `:::` line                                          |
| `missing-attribute`       | error    | A required attribute is missing (`src`, `ref`, `system`, `id`, `dataset`)      |
| `invalid-attribute`       | error    | An attribute value is not allowed (`size=huge`, a bad `File:` title)           |
| `unknown-attribute`       | warning  | The directive has no such attribute                                            |
| `figure-missing-alt`      | error    | A figure or gallery item has no alt text                                       |
| `credit-override`         | error    | A figure sets its own credit or licence                                        |
| `cite-unknown`            | error    | A citation id is not in `refs` (or there are no refs)                          |
| `cite-empty`              | error    | `:cite[]` with no id                                                           |
| `unsafe-url`              | error    | A link uses a scheme other than http, https or mailto                          |
| `image-syntax`            | error    | A Markdown image; use `::figure`                                               |
| `invalid-title`           | error    | A wikilink target breaks the title rules                                       |
| `category-link`           | warning  | `[[Category:X]]` links to the category page; set categories in the frontmatter |
| `data-table-invalid`      | error    | A data table body is empty, not YAML, or not a table                           |

Lines and columns count from 1; columns count characters (an emoji is one).

Categories: [Help](https://paxabyssi.com/wiki/Category:Help.md), [Style guides](https://paxabyssi.com/wiki/Category:Style_guides.md)
