Notes.typ
Footnotes + Endnotes + Custom notes for Typst typesetting.
Install / Use
/learn @tudborg/Notes.typREADME
notes.typ
Footnotes, endnotes, notes.

See example.pdf for the example PDF.
Usage
Quickstart
The easiest way to use this library is to place the notes.typ file
somewhere where you can import it, and do
#import "notes.typ": note, notes
at the top of your document.
Then, anywhere you want to place a note, do
- This is an *important* point #note[My note goes here]
// ...
// and where you want to render the notes:
#notes()
Footnotes
If you want to always collect notes at the bottom of the page, you simply
call #notes in your footer:
#set page(
footer: [
This is my footer.
#notes()
]
)
Custom note rendering
The notes function is a sane-defaults function for displaying notes at
the bottom of a section / page.
You probably want to define your own by creating a function that a calls
render_notes.
You can use the notes function as a starting point:
#import "notes.typ": note, render_notes
// ...
#let notes(
size: 8pt,
font: "Roboto",
line: line(length: 100%, stroke: 1pt + gray),
padding: (top: 3mm),
alignment: bottom,
numberings: "1",
group: note_default_group,
reset: true,
reset_counter: false
) = {
let render(notes) = {
if notes.len() > 0 {
set align(alignment)
block(breakable: false, pad(..padding, {
if line != none { line }
set text(size: size, font: font)
for note in notes {
[/ #text(font: "Roboto Mono")[[#numbering(numberings, note.index)]]: #note.text]
}
}))
}
}
render_notes(group: group, reset: reset, reset_counter: reset_counter, render)
}
To customize the note marker, you can define your own note function
with the display argument set as you prefer:
#let mynote = note.with(
display: (note) => {
super(text(weight: "bold", fill: orange, note.index))
}
)
Advanced Usage
Reset note counter after each render of notes
#let mynotes = notes.with(reset_counter: true)
Two different note sets
If you want two different sets of note tracking states, you can define your own "group" name.
The typical use-case might be footnotes + endnotes.
#let footnote = note.with(group: "footnote")
#let show_footnotes = notes.with(group: "footnote")
#let endnote = note.with(group: "endnote")
#let show_endnotes = notes.with(group: "endnote")
And then use then as normal
- I want to add something at the bottom of the page #footnote[My Footnote]
- I want to add something to the end of the document #endnote[My Endnote]
And your page footer could be
#set page(footer: show_footnotes)
while at the bottom of your document you have a call to
#show_endnotes()
Related Skills
node-connect
352.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
111.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
352.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
352.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
