Skip to content

Instantly share code, notes, and snippets.

@HeMuling
Last active July 7, 2024 13:40
Show Gist options
  • Save HeMuling/a492b55e70167a1b0873dbd176976c97 to your computer and use it in GitHub Desktop.
Save HeMuling/a492b55e70167a1b0873dbd176976c97 to your computer and use it in GitHub Desktop.
Useful Typst Code: Adjust the page number style, set the starting page number, and customize the heading and outline styles.
// set differnet name for different levels of title
#set heading(numbering: (..numbers) => {
let level = numbers.pos().len()
if (level == 1) {
return numbering("第一部分", numbers.pos().at(level - 1))
} else if (level == 2) {
return numbering("第一章", numbers.pos().at(level - 1))
} else if (level == 3) {
return numbering("1.1", numbers.pos().at(level - 2), numbers.pos().at(level - 1))
} else {
return numbering("1.1.1", numbers.pos().at(level - 3), numbers.pos().at(level - 2), numbers.pos().at(level - 1))
}}
)
// customize title format by defining functions
#let hd1(in_text) = {
text(size: 18pt)[
#align(center)[
#heading(level: 1)[#in_text]
#v(10pt)
]
]
}
#let hd2(in_text) = {
text(size: 16pt)[
#align(center)[
#heading(level: 2)[#in_text]
#v(5pt)
]
]
}
#let hd3(in_text) = {
text(size: 14pt)[
#align(left)[
#heading(level: 3)[#in_text]
]
]
}
#let hd4(in_text) = {
text(size: 12pt)[
#align(left)[
#heading(level: 4)[#in_text]
]
]
}
# use function
#outline()
#hd1("野外实习报告")
#hd2("实习目的")
#hd3("峨眉山食物")
#hd4("野外实习目的")
// suppose a json file in format:
// {
// "1": {
// "phylum": "Tracheophyta",
// "genus": "Selaginella",
// "species": "moellendorffii",
// "infraspecies": "",
// "family": "Selaginellaceae",
// "kingdom": "Plantae",
// "class": "Lycopodiopsida",
// "order": "Selaginellales",
// "name": "江南卷柏"
// },
// "2": {
// "phylum": "Tracheophyta",
// "genus": "Heterostemma",
// "species": "wallichii",
// "infraspecies": "",
// "family": "Apocynaceae",
// "kingdom": "Plantae",
// "class": "Magnoliopsida",
// "order": "Gentianales",
// "name": "醉魂藤"
// },
// ...
// }
// get json content according to id
#let Plant(id) = {
let name = json("plant.json").at(id).name
let genus = json("plant.json").at(id).genus
let species = json("plant.json").at(id).species
let latin_name = text(style: "oblique", font: "Arial")[#genus #species]
text()[#name (#latin_name)]
}
// use the context we get with image
#let PlantIMG(id, ext_caption) = {
figure(
image("img/植物/标本制作/"+ id + ".JPG", width: 95%), // this should be your image file name, which contains id
caption: [
#Plant(id)\
#ext_caption
],
supplement: none
)
}
// use example
#PlantIMG("1", lorem(20))
#PlantIMG("2", lorem(20))
#PlantIMG("3", lorem(20))
// Set outline Title
#align(center)[
#v(100pt)
#text(size: 25pt)[
目录
]
]
// Change outline style
#show outline.entry.where(
level: 1,
): it => {
text(size: 16pt)[#it]
}
#show outline.entry.where(
level: 2,
): it => {
v(2pt, weak: false)
text(size: 15pt)[#it]
}
#show outline.entry.where(
level: 3,
): it => {
text(size: 14pt)[#it]
}
#show outline.entry.where(
level: 4,
): it => {
text(size: 13pt)[#it]
}
// Set default properties
#outline(
title: text(size: 20pt)[],
indent: 2em
)
// for better showing
#set page(
height: 0.5cm,
width: 3cm,
)
#set text(size: 2pt)
#align(center + horizon)[
First page
]
#pagebreak()
// set this page to the first page to use 'i' style
#set page(
numbering: (..numbers) => {
return numbering("i", counter(page).get().at(0) - 1)
},
)
// use odd or even page numbers
#set page(footer: locate(
loc => if calc.even(loc.page()) {
align(right, numbering("i", counter(page).get().at(0) - 1));
} else {
align(left, numbering("i", counter(page).get().at(0) - 1));
}
))
= First level title
#align(center + horizon)[
Second page
]
#pagebreak()
== Second level title
#align(center + horizon)[
Third page
]
#pagebreak()
// set this page the first page to use '1' style page number
#set page(
numbering: (..numbers) => {
return numbering("1", counter(page).get().at(0) - 3)
},
)
// odd or even page numbers
#set page(footer: locate(
loc => if calc.even(loc.page()) {
align(right, numbering("1", counter(page).get().at(0) - 3));
} else {
align(left, numbering("1", counter(page).get().at(0) - 3));
}
))
=== Third level title
#align(center + horizon)[
4th page
]
#pagebreak()
#align(center + horizon)[
5th page
]
#pagebreak()
#outline()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment