---
title: Pax Markdown
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]
---

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]].

## 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).
