Not sure if there’s an easy way to share complete typst projects, but here is a MWE:
// main.typ
#import "assets/template.typ": *
#set text(lang: "en")
#show: tech-doc
#set document(
date: datetime(day: 4, month: 2, year: 2026),
title: [Title],
author: "ISOREX",
keywords: ("a", "b", "c"),
)
#let version = [0.1]
#align(center)[
#title()
]
#author-info(version: "0.6")
== Abstract
#lorem(100)
= Chapter 1
#lorem(100) @ref-b
#figure(
rect(), caption: []
)
#lorem(100)
#pagebreak()
// #bibliography("assets/references.yml") // <-- multiple bibliographies not yet supported
#show: appendix
#include "app-1.typ"
// app-1.typ
#import "assets/template.typ": *
#set text(lang: "en")
#show: tech-doc
#set document(
date: datetime(day: 7, month: 1, year: 2026),
title: [Project M],
description: [Calculations],
author: "ISOREX",
)
#title-page(version: "0.1")
#set page(numbering: "I")
#outline(depth: 2)
#pagebreak()
#set page(numbering: "1")
#counter(page).update(1)
#set math.equation(
numbering: "(1)",
supplement: "Eq."
)
#show ref: it => {
// provide custom reference for equations
if it.element != none and it.element.func() == math.equation {
// optional: wrap inside link, so whole label is linked
link(it.target)[#it]
} else {
it
}
}
#set heading(numbering: "1.")
= Chapter 1
#lorem(100) @ref-a
#figure(
rect(), caption: []
)
#bibliography("assets/references.yml")
// assets/template.typ
#let tech-doc(doc) = {
// Prevents table from breaking across pages
show table: set block(breakable: false)
// Add appendix to outline
show outline.entry: it => {
if it.element.supplement != [Appendix] { return it }
[Appendix #it.prefix(): #it.inner()]
}
show "+-": "±"
show table.cell.where(y: 0): strong
doc
}
#let author-info(version: "0.1") = {
set table(stroke: 0pt)
table(
columns: (1fr,) * 4,
[Author], [#context document.author.first()], [ID], [012345],
[Start date], [02/02/2026], [End date], [03/07/2026],
[Version],
[#version],
[Date of issue],
[#context document.date.display("[day]/[month]/[year]")],
)
}
#let title-page(version: "0.1") = {
let subtitle(content) = {
set text(size: 20pt, style: "italic")
block[#content]
}
show title: set text(size: 32pt)
align(center + horizon)[
#title[#context document.title]
#subtitle[#context document.description ]
]
align(bottom)[
#author-info(version: version)
]
pagebreak()
}
// Appendix
#let appendix(body) = {
set heading(numbering: "A.1.", supplement: [Appendix])
// Reset heading counter
counter(heading).update(0)
// Equation numbering
let numbering-eq = (..n) => {
let h1 = counter(heading).get().first()
numbering("(A.1a)", h1, ..n)
}
set math.equation(numbering: numbering-eq)
// Figure and Table numbering
let numbering-fig = n => {
let h1 = counter(heading).get().first()
numbering("A.1", h1, n)
}
set figure(numbering: numbering-fig)
// isappendix.update(true) // <-- where is this used?
body
}
// assets/references.yml
ref-a:
type: web
author:
- Wikipedia
title: Reference A
url:
value: https://en.wikipedia.org/wiki/some-reference-a
date: 2026-01-07
ref-b:
type: web
author:
- Wikipedia
title: Reference B
url:
value: https://en.wikipedia.org/wiki/some-reference-b
date: 2026-01-07
I did notice that figures do have their numbering updated, but headings do not. The outline issue is also present here:
Bibliographies also do not work yet.