Every key Tachyonn understands, with its synonyms, what it maps to and the value
you get when you say nothing. This is the exhaustive list — the
cheat sheet is the short version, and the pages around this
one explain each area in prose.
Kept honest by a test
A test in the repo (tests/docs_reference.rs) reads the parser's source and
fails the build if a key it accepts is missing from this page. If you can write
it in a .tac, it is documented here.
| Scope | Where you write it | What it affects |
|---|
| Project | tac.config in any parent folder | every .tac under it |
| Theme | a .tt file (or a built-in preset via theme:) | every deck using that theme |
| Deck | the === … === at the top of the file | that deck |
| Slide | a === … === right after the ## / # | that slide only |
Precedence, weakest to strongest: default.tt → tac.config → theme → deck
frontmatter → per-slide frontmatter. Anything you leave out keeps the value from
the layer before.
Style keys (the second table below) work in all four scopes. Deck keys work
in the first three. Per-slide keys only inside a slide's own block.
A tac.config can also hold macro definitions (<<[<name> …]), and they
cascade the same way — a slide defined once at the top of a course is available
to every deck under it with a plain >>[<name>]. See
the cheatsheet.
Content and structure of the deck itself — not style.
| Key (synonyms) | Default | What it does |
|---|
title | (empty) | Deck title. Feeds the cover and the {title} footer token |
subtitle | — | Shown under the title on the cover |
author | — | Shown on the cover; {author} footer token |
date | — | Metadata only: the {date} footer token |
description | — | Metadata only: the {description} footer token. Not cover text — use coverBody: |
theme | default | Built-in preset (default, dark, physics) or a path to a .tt file |
cover | true | false suppresses the automatically generated cover slide |
coverVariant / coverLayout | centered | centered · image-bg · image-title · split · stacked · minimal |
coverImage | — | Image or video for the cover (a video plays muted, looping) |
coverBody / coverContent | — | Body of the automatic cover. Each occurrence is one line of .tac; repeat the key for more lines (an empty one starts a paragraph) |
sectionVariant | centered | centered · toc · toc-side · number · backdrop · color-block · bigtype |
tocHeading | section | What sits beside the index on toc-side: section · deck · none |
transition | slide | Deck-wide transition family: slide · slide-in · slide-out-in · fade · zoom · none |
texMacro / texMacros / macro | — | A global TeX macro (\newcommand{\R}{\mathbb{R}}). Repeat the key to add more |
imageMaxWidth / imageMaxSize | 1920 | Largest side (px) an embedded raster image may have. Also switches on the re-encode of opaque PNGs to JPEG, which is where most of a PDF's weight goes. off embeds every image untouched |
imageQuality | 82 | JPEG quality (1–100) used when an image is re-encoded |
css | — | A raw CSS rule. Repeat the key to add more |
cssFile / cssFiles | — | Load .css file(s) next to the .tac (comma-separated) |
footer.left footer.center footer.right | — | Footer slots: text with {tokens} or an image ![logo.png] |
Footer text tokens: {page} {total} {title} {subtitle} {author}
{date} {description}.
Each one sets a CSS custom property. Valid in tac.config, in a theme, in the
deck frontmatter and in a single slide's block.
| Key (synonyms) | CSS variable | Default |
|---|
accent / accentColor | --tac-accent | #FF5F1F |
color / textColor | --tac-text | #1c1c28 |
headingColor / titleColor | --tac-heading | #FF5F1F |
mutedColor | --tac-text-muted | #6b7280 |
borderColor | --tac-border | #e5e7eb |
background / bg | (the slide background) | #ffffff |
overlay / scrim | --tac-bg-overlay | (none) — dark, light, a number like 0.6, or any CSS color |
| Key (synonyms) | CSS variable | Default |
|---|
font / fontSans | --tac-font-sans | Atkinson Hyperlegible, sans-serif |
headingFont / titleFont / fontHeading | --tac-font-heading | Momo Trust Display, sans-serif |
fontMono / fontCode | --tac-font-mono | JetBrains Mono, monospace |
textSize / fontSize | --tac-text-size | 1.8rem |
titleSize | --tac-title-size | 2.5rem |
lineHeight | --tac-line-height | 1.8 |
| Key (synonyms) | CSS variable | Default |
|---|
slidePadding / padding | --tac-slide-padding | 4rem 5rem |
slidePaddingTop / paddingTop | --tac-slide-padding-top | 2.5rem |
valign / verticalAlign | --tac-valign | center — accepts top · center · bottom · between · around |
reveal / revealMode / clickMode | --tac-reveal-collapse | reserve (1fr) — a hidden >[n]{…} block keeps its space, so the layout never moves between clicks. push (0fr) collapses it instead. See Animations |
| Key (synonyms) | CSS variable | Default |
|---|
coverTitleSize | --tac-cover-title-size | 4rem |
coverSplitWidth / coverSplit / splitWidth | --tac-cover-split-width | 50% — width on split, height on stacked |
coverBodySize | --tac-cover-body-size | 1.4rem |
coverBodyGap | --tac-cover-body-gap | 1.6rem |
| Key (synonyms) | CSS variable | Default |
|---|
sectionSize | --tac-section-size | 3.4rem |
sectionBlockColor / sectionBlockBg | --tac-section-block-bg | var(--tac-accent) |
sectionBlockTextColor / sectionOnBlock | --tac-section-on-block | #1c1c28 |
sectionBlockSize | --tac-section-block-size | 5rem |
sectionBigTypeSize / bigTypeSize | --tac-section-bigtype-size | 7rem |
kickerSize | --tac-section-kicker-size | 1.5rem |
kickerColor | --tac-section-kicker-color | var(--tac-text-muted) |
kickerFont | --tac-section-kicker-font | (the deck font) |
| Key (synonyms) | CSS variable | Default |
|---|
bigNumberSize | --tac-big-number-size | 15rem |
quoteSize | --tac-quote-size | 2.6rem |
quoteWidth | --tac-quote-width | 70% — width of the quotation box, as a fraction of the slide |
| Key (synonyms) | CSS variable | Default |
|---|
iconSize | --tac-icon-size | 1em — relative to the surrounding text |
iconColor | --tac-icon-color | (inherits) — the icon takes the color of wherever it sits |
| Key (synonyms) | CSS variable | Default |
|---|
footerFont | --tac-footer-font | (the deck font) |
footerSize / footerTextSize | --tac-footer-size | 13px |
footerColor | --tac-footer-color | var(--tac-text-muted) |
| Key (synonyms) | CSS variable | Default |
|---|
progress / progressBar | --tac-progress-position | bottom — bottom · top · none |
progressColor | --tac-progress-color | var(--tac-accent) |
| Key (synonyms) | CSS variable | Default |
|---|
transitionDuration | --tac-trans-dur | 0.5s |
transitionShift / transitionDistance | --tac-trans-shift | 10% — travel of slide-in / slide-out-in |
magicDuration / magicMoveDuration | --tac-magic-duration | 0.5s |
| Key (synonyms) | CSS variable | Default |
|---|
laser / laserMode / pointer | --tac-laser-mode | arrow — arrow · dot · ring |
laserColor / pointerColor | --tac-laser-color | #FF5F1F |
laserTrail / pointerTrail | --tac-laser-trail | off — on leaves a fading trail (dot/ring only) |
| Key (synonyms) | Effect |
|---|
class / classes | Extra CSS classes on the slide root |
theme: NAME (as a style key, per slide) | Adds the class theme-NAME |
any key starting with -- | Passed through verbatim as a CSS custom property |
Only inside a slide's own === … ===, right after the ## (or #).
| Key (synonyms) | Default | What it does |
|---|
layout | from the heading | Switches the layout (same names as /layout[…]) |
title | inherited | Overrides the title; none / false / empty removes it |
transition | the deck's | Transition into this slide (this is how magic is asked for) |
notes | — | Speaker notes for this slide (same as /notes[…]) |
time / duration | — | Presenter target for this slide: seconds (90) or M:SS / H:MM:SS |
footer | from the layout | true / false forces the footer on or off here |
footer.left footer.center footer.right | the deck's | Overrides one footer slot on this slide |
variant | from the deck | On a cover: its cover variant. On a #: that divider's variant |
image / coverImage | — | Cover image for a cover / title slide |
kicker / overline / eyebrow | — | Short overline above a # divider's title |
toc | true | false keeps this section out of both indexes: the one on the dividers and the T modal |
Every style key from the previous section also works here, applied to this slide
alone.
Variables with no friendly key. Set them with their own name (any key starting
with -- passes straight through) in a theme, the deck, or one slide.
| Variable | Default | Controls |
|---|
--tac-title-gap | 1.8rem | Space below a slide title |
--tac-column-gap | 3rem | Gap between columns / image and text |
--tac-grid-gap | 1.2rem | Gap between grid cards |
--tac-section-padding | 0 5rem | Section-divider padding |
--tac-cover-subtitle-size | 2rem | Cover subtitle |
--tac-cover-meta-size | 1.3rem | Cover author / date |
--tac-cover-padding | 4rem 6rem | Cover & quote padding |
--tac-big-number-label-size | 2rem | Big-number label |
--tac-quote-cite-size | 1.6rem | Quote attribution |
--tac-callout-standard | #3b9ad9 | ### box, standard variant |
--tac-callout-alert | var(--tac-accent) | ###<alert> box |
--tac-callout-example | #2a8a82 | ###<example> box |
--tac-callout-<name> | — | Defines your own ###<name> variant |
--tac-bg-dark | #f3f4f6 | Shaded surface behind panels |
--tac-code-bg | #1e1e1e | Code block background |
--tac-footer-height | 32px | Footer height |
--tac-footer-padding | 28px | Footer left/right padding |
--tac-progress-height | 3px | Progress bar thickness |
--tac-cover-overlay | linear-gradient(rgba(0,0,0,.45), rgba(0,0,0,.45)) | Scrim over image-bg covers |
--tac-cover-on-image | #ffffff | Text color over a cover image |
--tac-cover-image-width | 60% | Image width on image-title |
--tac-cover-image-height | 40vh | Image height on image-title |
--tac-section-overlay | linear-gradient(rgba(0,0,0,.45), rgba(0,0,0,.45)) | Scrim on backdrop dividers |
--tac-section-on-image | #ffffff | Text color on backdrop dividers |
--tac-section-number-size | 6rem | Numeral on number dividers |
--tac-section-kicker-gap | 0.5em | Space between kicker and title |
--tac-section-block-width | 78% | Text column width on color-block |
--tac-section-block-padding | 0 8% | Side padding on color-block |
--tac-section-block-rise | 6vh | How far above the middle the color-block text sits |
--tac-section-bigtype-padding | 0 6% 8vh | Padding on bigtype dividers |
--tac-toc-active | var(--tac-heading) | Current section in the index |
--tac-toc-muted | var(--tac-text-muted) | The other sections |
--tac-toc-size | 2rem | Index entry size |
--tac-toc-gap | 0.6em | Vertical gap between entries |
--tac-toc-index-display | none | inline-block shows the 1. 2. 3. numbers |
Valid inside a .tt file (and, where noted, in the frontmatter too).
| Key | Default | What it does |
|---|
name | default | Display name of the theme (informational) |
coverLayout / coverVariant | centered | Default cover variant for decks using the theme |
sectionVariant | centered | Default section-divider variant |
tocHeading | section | Default toc-side heading |
texMacro | — | Ships a macro pack with the theme (the deck's own macros win) |
footer.<layout> | see below | Whether that layout shows the footer |
Footer visibility defaults per layout: title false · section false ·
media false · big-number false · quote true · standard true ·
two-column true · three-column true · grid true · code-window
true · image-and-text true.