I want to generate ~40 pages with a quite complicated background which is the same for all pages. My current approach is very slow and has a large resulting pdf file.
There is a workaround to compile the background first and use the image function to include it which makes is a lot faster and the resulting file is small.
Is there a way to achieve this without a 2 step process?
Here my current typst document:
#let text_top = "Niedersächsiche Landesrunde der 64. Mathematik-Olympiade"
#let text_bottom = "21./22. Februar 2025"
#let names = ("Test Firstname Lastname",) * 200
#import "@preview/curvly:0.1.0"
#import "@preview/cetz:0.4.2"
#set page(margin: 0mm)
#set text(
font: "Liberation Serif"
)
#let inner = 34mm
#let middle = 42.8mm
#let outer = 56.7mm
#let stroke_var = (dash: "dashed", thickness: 0.2mm)
#let button() = {
cetz.canvas({
import cetz.draw: *
arc((0,0), radius: middle, start: 30deg, delta: 30deg, stroke: stroke_var, anchor: "origin")
arc((0,0), radius: middle, start: 120deg, delta: 30deg, stroke: stroke_var, anchor: "origin")
arc((0,0), radius: middle, start: 210deg, delta: 30deg, stroke: stroke_var, anchor: "origin")
arc((0,0), radius: middle, start: 300deg, delta: 30deg, stroke: stroke_var, anchor: "origin")
arc((0,0), radius: outer, start: 30deg, delta: 30deg, stroke: stroke_var, anchor: "origin")
arc((0,0), radius: outer, start: 120deg, delta: 30deg, stroke: stroke_var, anchor: "origin")
arc((0,0), radius: outer, start: 210deg, delta: 30deg, stroke: stroke_var, anchor: "origin")
arc((0,0), radius: outer, start: 300deg, delta: 30deg, stroke: stroke_var, anchor: "origin")
circle((0, 0), radius: inner, stroke: stroke_var)
rect((-middle, -middle), (middle, middle), stroke: stroke_var)
//content((0,0), image("mologo-grey.pdf", width: middle))
content((0,0mm), context {
let l_top = measure([#text_top]).width
let l_bottom = measure([#text_bottom]).width
let both = l_top + l_bottom
curvly.text-on-circle(text_top,text_bottom, 50mm, l_top * 0.9 / both * 360deg, l_bottom * 0.9 / both * 360deg)
})
}, padding: (-4mm, 0mm), debug: false)}
#let button_name(name) = {
cetz.canvas({
import cetz.draw: *
hide(arc((0,0), radius: outer, start: 30deg, delta: 30deg, stroke: stroke_var, anchor: "origin"), bounds: true)
hide(arc((0,0), radius: outer, start: 120deg, delta: 30deg, stroke: stroke_var, anchor: "origin"), bounds: true)
hide(arc((0,0), radius: outer, start: 210deg, delta: 30deg, stroke: stroke_var, anchor: "origin"), bounds: true)
hide(arc((0,0), radius: outer, start: 300deg, delta: 30deg, stroke: stroke_var, anchor: "origin"), bounds: true)
content((0,0), context {
set align(center + horizon)
block(width: 0.95 * middle, text(name, size: 15pt, lang: "de", hyphenate: false, weight: "bold"))
})
}, padding: (-4mm, 0mm), debug: false)}
#let background = [
#columns(2)[
#button()
#button()
#button()
#colbreak()
#button()
#button()
#button()
]
]
// Precompiled background, is fast and small file size
// #set page(background: image("test-14.pdf"))
// Slow and large pdf file
#set page(background: background)
#let buttons(names) = {
let len = names.len()
names.chunks(6, exact: false).map(
names => place(dx: 1.4mm, dy: 8mm)[#columns(2)[
#button_name(names.at(0, default: ""))
#button_name(names.at(2, default: ""))
#button_name(names.at(4, default: ""))
#colbreak()
#button_name(names.at(1, default: ""))
#button_name(names.at(3, default: ""))
#button_name(names.at(5, default: ""))
]]
).join(pagebreak())
}
#buttons(names)

