Home

Print & Pages

Usage

Start with these tokens when customizing print output:

  • --page-width, --page-height, and --page-margin-* for page size and margins

  • --page-top-*-content and --page-bottom-*-content for running headers/footers

  • --page-margin-font-family and --page-margin-font-size for margin box typography

  • --page-border-* tokens for header/footer rules

  • --page1-* overrides to customize the first page

Margin box content can reference injected metadata variables like --document-title, --document-authors, and --document-date.

Tokens

Page Size and Margins

TokenDescriptionDefault Value
--page-widthPage width210mm
--page-heightPage height297mm
--page-margin-verticalVertical margins (top/bottom)1.5cm
--page-margin-horizontalHorizontal margins (left/right)2cm
--page-margin-topTop marginvar(--page-margin-vertical)
--page-margin-rightRight marginvar(--page-margin-horizontal)
--page-margin-bottomBottom marginvar(--page-margin-vertical)
--page-margin-leftLeft marginvar(--page-margin-horizontal)
--page-content-heightComputed content height (read by JS)calc(var(--page-height) - var(--page-margin-top) - var(--page-margin-bottom) - var(--page-padding-top) - var(--page-padding-bottom))
--page-content-widthComputed content width (read by JS)calc(var(--page-width) - var(--page-margin-left) - var(--page-margin-right))

Page Padding

Padding controls the gap between the main content and the margin boxes.

TokenDescriptionDefault Value
--page-paddingBase padding above/below content0.5cm
--page-padding-topTop padding overridevar(--page-padding)
--page-padding-bottomBottom padding overridevar(--page-padding)

Margin Box Styling

TokenDescriptionDefault Value
--page-margin-font-familyFont family for margin boxesvar(--font-family-sans)
--page-margin-font-sizeFont size for margin boxes8pt
--page-margin-line-heightLine height for margin boxesvar(--line-height-tight)
--page-margin-colorText color for margin boxesvar(--text-color-secondary)
--page-margin-paddingPadding inside margin boxes0

Margin Box Content

TokenDescriptionDefault Value
--page-top-left-contentTop-left contentnone
--page-top-center-contentTop-center contentnone
--page-top-right-contentTop-right contentnone
--page-bottom-left-contentBottom-left contentnone
--page-bottom-center-contentBottom-center contentnone
--page-bottom-right-contentBottom-right contentnone

First Page Content

TokenDescriptionDefault Value
--page1-top-left-contentFirst page top-left contentvar(--page-top-left-content)
--page1-top-center-contentFirst page top-center contentvar(--page-top-center-content)
--page1-top-right-contentFirst page top-right contentvar(--page-top-right-content)
--page1-bottom-left-contentFirst page bottom-left contentvar(--page-bottom-left-content)
--page1-bottom-center-contentFirst page bottom-center contentvar(--page-bottom-center-content)
--page1-bottom-right-contentFirst page bottom-right contentvar(--page-bottom-right-content)

Margin Box Borders

Level 1: Global Border Tokens

TokenDescriptionDefault Value
--page-border-styleBorder style for all marginssolid
--page-border-colorBorder color for all marginsvar(--border-color-default)
--page-border-narrowBorder width for center boxesinitial
--page-border-wideBorder width for left/center/right boxesinitial
--page-border-fullBorder width including corner boxesinitial

Level 2: Horizontal Borders

TokenDescriptionDefault Value
--page-horizontal-border-styleBorder style for top/bottomvar(--page-border-style)
--page-horizontal-border-colorBorder color for top/bottomvar(--page-border-color)
--page-horizontal-border-narrowNarrow border for top/bottomvar(--page-border-narrow)
--page-horizontal-border-wideWide border for top/bottomvar(--page-border-wide)
--page-horizontal-border-fullFull border for top/bottomvar(--page-border-full)

Level 3: Specific Top/Bottom Borders

TokenDescriptionDefault Value
--page-top-border-styleBorder style for top marginsvar(--page-horizontal-border-style)
--page-top-border-colorBorder color for top marginsvar(--page-horizontal-border-color)
--page-top-border-narrowNarrow border for top marginsvar(--page-horizontal-border-narrow)
--page-top-border-wideWide border for top marginsvar(--page-horizontal-border-wide)
--page-top-border-fullFull border for top marginsvar(--page-horizontal-border-full)
--page-bottom-border-styleBorder style for bottom marginsvar(--page-horizontal-border-style)
--page-bottom-border-colorBorder color for bottom marginsvar(--page-horizontal-border-color)
--page-bottom-border-narrowNarrow border for bottom marginsvar(--page-horizontal-border-narrow)
--page-bottom-border-wideWide border for bottom marginsvar(--page-horizontal-border-wide)
--page-bottom-border-fullFull border for bottom marginsvar(--page-horizontal-border-full)

First Page Border Tokens

First-page border tokens mirror the regular hierarchy:

  • Level 1: --page1-border-*

  • Level 2: --page1-horizontal-border-*

  • Level 3: --page1-top-border-* and --page1-bottom-border-*

Page Layout Tokens

TokenDescriptionDefault Value
--page-displayPage container displayflex
--page-flex-directionPage container directioncolumn
--page-section-gapGap between page sections0
--page-justify-contentVertical alignment of contentflex-start
--page-align-itemsHorizontal alignment of contentstretch

Available Content Variables

Stencila injects metadata variables into the document <head> that can be used in margin box content:

Variable NameDescriptionExample
--document-titleMain document title"Climate Change Impacts"
--document-authorsDocument authors"Smith, J. & Jones, M."
--document-doiDigital Object Identifier"10.1234/example.5678"
--document-datePublication or modification date"2025-09-27"

Examples

Basic Page Numbers

:root {
  --page-bottom-right-content: counter(page);
}

Academic Article Headers

:root {
  --page-top-left-content: var(--document-authors);
  --page-top-right-content: var(--document-title);
  --page-bottom-left-content: "DOI: " var(--document-doi);
  --page-bottom-right-content: "Page " counter(page);

  --page-border-wide: 1px;
}

Border Span Examples

Narrow Border (Center Only)

:root {
  --page-border-narrow: 1px;
  --page-top-center-content: var(--document-title);
  --page-bottom-center-content: counter(page);
}

Full Border (Including Corners)

:root {
  --page-border-full: 1px;
  --page-top-center-content: var(--document-title);
  --page-bottom-center-content: counter(page);
}

First Page Different

:root {
  /* Regular page margins */
  --page-top-left-content: var(--document-authors);
  --page-top-right-content: var(--document-title);
  --page-bottom-right-content: counter(page);

  /* Override just the first page */
  --page1-top-left-content: none;
  --page1-top-right-content: none;
  --page1-bottom-right-content: none;

  /* Remove first-page borders */
  --page1-border-wide: initial;
}

Different Left/Right Pages

@media print {
  @page :left {
    @top-left {
      content: counter(page);
      font-family: var(--page-margin-font-family);
      font-size: var(--page-margin-font-size);
    }

    @top-right {
      content: string(article-title);
      font-family: var(--page-margin-font-family);
      font-size: var(--page-margin-font-size);
      font-style: italic;
    }
  }

  @page :right {
    @top-left {
      content: string(section-title);
      font-family: var(--page-margin-font-family);
      font-size: var(--page-margin-font-size);
      font-style: italic;
    }

    @top-right {
      content: counter(page);
      font-family: var(--page-margin-font-family);
      font-size: var(--page-margin-font-size);
    }
  }
}

Tips

Margin boxes: Margin content tokens default to none, so set only the boxes you want (--page-top-*-content, --page-bottom-*-content).

Page size: Use --page-width and --page-height to switch between formats like A4 and Letter.

First page overrides: Use --page1-* tokens to change the title page without custom selectors.

Borders: Use the base --page-border-* tokens for global rules, then override per-box only when needed.

© 2026 Stencila