hebstr-doc : Example Document

Multi-format Quarto extension

Author

hebstr

Published

May 4, 2026

1 Typography and headings

This document exercises every capability declared in _extension.yml, so quarto render example.qmd validates the extension in one shot. Only hebstr-doc-html is declared on main; Typst and DOCX outputs land once those formats are validated.

The body font is Luciole (sans-serif, designed for low-vision readers). Inline code() uses Fira Code with programming ligatures.

1.1 Level 2 heading

Headings are numbered down to level 4 (number-depth: 4). The cross-reference title delimiter is a literal dot (e.g. Figure 1.1).

1.1.1 Level 3 heading

Paragraph with emphasis, strong emphasis, a link to the Quarto docs, and an internal reference to Section 3.

1.1.1.1 Level 4 heading

Deepest numbered level.

2 Lists

Unordered:

  • First item
  • Second item with a nested block:
    • Nested bullet one
    • Nested bullet two
  • Third item

Ordered:

  1. Initialise the R session
  2. Load the tidyverse
  3. Render the document

3 Figure

Figure 1 comes from ggplot2 on the palmerpenguins dataset, with the shared knitr chunk options from _extension.yml (echo: false, message: false, warning: false).

Figure 1. Bill length vs flipper length by species (palmerpenguins).

The HTML output wraps figures in lightbox; click the image to enlarge.

4 Table

The chunk below is a simple aggregation rendered as a Markdown table. tbl-cap-location: top puts the caption above the table; tbl-title: "Table" is language-neutral.

library(dplyr)

palmerpenguins::penguins |>
  count(species) |>
  rename(Sp = species)
#> # A tibble: 3 × 2
#>   Sp            n
#>   <fct>     <int>
#> 1 Adelie      152
#> 2 Chinstrap    68
#> 3 Gentoo      124

5 Code block

The chunk below sets echo: true (overriding the default) to exercise syntax highlighting, code folding, and the copy-on-hover button (HTML), plus the code.tmTheme TextMate theme that Typst applies via #set raw(theme: …) in template.typ.

Code
library(dplyr)

palmerpenguins::penguins |>
  filter(!is.na(body_mass_g)) |>
  group_by(species, island) |>
  summarise(
    n = n(),
    mean_mass_g = mean(body_mass_g),
    .groups = "drop"
  ) |>
  arrange(desc(mean_mass_g))

6 Code window

The blocks below exercise the mcanouil/quarto-code-window filter declared in the YAML front matter. The extension sets style: default (plain filename header, no traffic lights or window chrome; see _extension.yml); with auto-filename: true, blocks without an explicit filename= show the language name as the header label.

6.1 Auto-generated filename (language name)

def greet(name: str) -> str:
    return f"Hello, {name}!"
penguins |>
  dplyr::count(species)
quarto add hebstr/quarto-hebstr-doc --no-prompt
quarto render example.qmd

7 Injected script

The block below is not an inline chunk. It holds the content of scripts/demo_penguins.R, injected via the script shortcode (in-tree filters/add-code-files.lua). The shortcode reads the file and emits the populated code block with the cell-code class, so Quarto’s code-fold wraps it in a foldable <details> element (collapsed by default); clicking the filename header expands it. filters/add-code-files.js rewrites the <summary> text to the filename (derived from shafayetShafee/add-code-files, MIT).

This is the canonical pattern for hebstr-doc: inline chunks render as code-window, externalised scripts render as foldable script blocks.

Code
library(dplyr)
library(palmerpenguins)

penguins |>
  filter(!is.na(body_mass_g)) |>
  group_by(species) |>
  summarise(
    n = n(),
    mean_mass_g = mean(body_mass_g),
    .groups = "drop"
  )

7.1 Tabset

Tabs use the .panel-tabset div class; tab-background from theme-light.scss / theme-dark.scss sets the panel fill.

palmerpenguins::penguins |>
  dplyr::filter(species == "Adelie") |>
  dplyr::select(island, bill_length_mm, flipper_length_mm, body_mass_g) |>
  head(5)
#> # A tibble: 5 × 4
#>   island    bill_length_mm flipper_length_mm body_mass_g
#>   <fct>              <dbl>             <int>       <int>
#> 1 Torgersen           39.1               181        3750
#> 2 Torgersen           39.5               186        3800
#> 3 Torgersen           40.3               195        3250
#> 4 Torgersen           NA                  NA          NA
#> 5 Torgersen           36.7               193        3450
palmerpenguins::penguins |>
  dplyr::filter(species == "Chinstrap") |>
  dplyr::select(island, bill_length_mm, flipper_length_mm, body_mass_g) |>
  head(5)
#> # A tibble: 5 × 4
#>   island bill_length_mm flipper_length_mm body_mass_g
#>   <fct>           <dbl>             <int>       <int>
#> 1 Dream            46.5               192        3500
#> 2 Dream            50                 196        3900
#> 3 Dream            51.3               193        3650
#> 4 Dream            45.4               188        3525
#> 5 Dream            52.7               197        3725
palmerpenguins::penguins |>
  dplyr::filter(species == "Gentoo") |>
  dplyr::select(island, bill_length_mm, flipper_length_mm, body_mass_g) |>
  head(5)
#> # A tibble: 5 × 4
#>   island bill_length_mm flipper_length_mm body_mass_g
#>   <fct>           <dbl>             <int>       <int>
#> 1 Biscoe           46.1               211        4500
#> 2 Biscoe           50                 230        5700
#> 3 Biscoe           48.7               210        4450
#> 4 Biscoe           50                 218        5700
#> 5 Biscoe           47.6               215        5400

8 Equation

Inline math: \(y = \beta_0 + \beta_1 x + \varepsilon\).

Display math with a cross-reference target (Equation 1):

\[ \hat{\beta} = (X^\top X)^{-1} X^\top y \tag{1}\]

Textual equations (Equation 2):

\[ \frac {\text{upper text}} {\text{lower text}} \text{ beside text} \tag{2}\]

9 Callouts

Callouts use callout-appearance: simple.

NoteA note callout.
NoteLe note callout.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis posuere ligula sit amet lacinia. Duis dignissim pellentesque magna, rhoncus congue sapien finibus mollis. Ut eu sem laoreet, vehicula ipsum in, convallis erat. Vestibulum magna sem, blandit pulvinar augue sit amet, auctor malesuada sapien. Nullam faucibus leo eget eros hendrerit, non laoreet ipsum lacinia. Curabitur cursus diam elit, non tempus ante volutpat a. Quisque hendrerit blandit purus non fringilla. Integer sit amet elit viverra ante dapibus semper. Vestibulum viverra rutrum enim, at luctus enim posuere eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

TipA tip callout.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis posuere ligula sit amet lacinia. Duis dignissim pellentesque magna, rhoncus congue sapien finibus mollis. Ut eu sem laoreet, vehicula ipsum in, convallis erat. Vestibulum magna sem, blandit pulvinar augue sit amet, auctor malesuada sapien. Nullam faucibus leo eget eros hendrerit, non laoreet ipsum lacinia. Curabitur cursus diam elit, non tempus ante volutpat a. Quisque hendrerit blandit purus non fringilla. Integer sit amet elit viverra ante dapibus semper. Vestibulum viverra rutrum enim, at luctus enim posuere eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

CautionA caution callout.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis posuere ligula sit amet lacinia. Duis dignissim pellentesque magna, rhoncus congue sapien finibus mollis. Ut eu sem laoreet, vehicula ipsum in, convallis erat. Vestibulum magna sem, blandit pulvinar augue sit amet, auctor malesuada sapien. Nullam faucibus leo eget eros hendrerit, non laoreet ipsum lacinia. Curabitur cursus diam elit, non tempus ante volutpat a. Quisque hendrerit blandit purus non fringilla. Integer sit amet elit viverra ante dapibus semper. Vestibulum viverra rutrum enim, at luctus enim posuere eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

WarningA warning callout.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis posuere ligula sit amet lacinia. Duis dignissim pellentesque magna, rhoncus congue sapien finibus mollis. Ut eu sem laoreet, vehicula ipsum in, convallis erat. Vestibulum magna sem, blandit pulvinar augue sit amet, auctor malesuada sapien. Nullam faucibus leo eget eros hendrerit, non laoreet ipsum lacinia. Curabitur cursus diam elit, non tempus ante volutpat a. Quisque hendrerit blandit purus non fringilla. Integer sit amet elit viverra ante dapibus semper. Vestibulum viverra rutrum enim, at luctus enim posuere eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

ImportantA important callout.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis posuere ligula sit amet lacinia. Duis dignissim pellentesque magna, rhoncus congue sapien finibus mollis. Ut eu sem laoreet, vehicula ipsum in, convallis erat. Vestibulum magna sem, blandit pulvinar augue sit amet, auctor malesuada sapien. Nullam faucibus leo eget eros hendrerit, non laoreet ipsum lacinia. Curabitur cursus diam elit, non tempus ante volutpat a. Quisque hendrerit blandit purus non fringilla. Integer sit amet elit viverra ante dapibus semper. Vestibulum viverra rutrum enim, at luctus enim posuere eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

10 Block quote

A citation.

— author

11 Cross-references

 


Session

Code
sessioninfo::session_info(pkgs = "attached")
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.6.0 (2026-04-24)
#>  os       Ubuntu 24.04.4 LTS
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language (EN)
#>  collate  C.UTF-8
#>  ctype    C.UTF-8
#>  tz       UTC
#>  date     2026-05-04
#>  pandoc   3.1.3 @ /usr/bin/ (via rmarkdown)
#>  quarto   1.9.37 @ /usr/local/bin/quarto
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package * version date (UTC) lib source
#>  dplyr   * 1.2.1   2026-04-03 [1] any (@1.2.1)
#>  ggplot2 * 4.0.3   2026-04-22 [1] any (@4.0.3)
#> 
#>  [1] /home/runner/work/_temp/Library
#>  [2] /opt/R/4.6.0/lib/R/site-library
#>  [3] /opt/R/4.6.0/lib/R/library
#>  * ── Packages attached to the search path.
#> 
#> ──────────────────────────────────────────────────────────────────────────────