alice-in-metamorpov/formatting.typ

188 lines
3.9 KiB
Plaintext

#import "variables.typ": *
#let template-shared(content) = [
// Page style
#set page(
"us-trade",
margin: (
inside: 0.75in,
outside: 0.5in,
top: 0.75in + font-size-small
)
)
// Font style
#set text(
size: font-size,
font: font-body,
)
// Paragraph style
#set par(
first-line-indent: 1em,
justify: true
)
// Number chapters
#set heading(
numbering: (book, ..chapters) => (
let num = chapters.pos(),
if num.len() > 0 {
return "Chapter " + numbering("I.", num.at(0))
} else {
return none
}
)
)
#content
]
#let template-chapter-start(content) = [
// Ignore book headings
#show heading.where(level:1): it => [
#return
]
// Chapter heading style
#show heading.where(level:2): it => [
// Always start the next chapter on a recto page
#pagebreak(to: "odd")
#set align(center)
#let num = " "
#let has-numbering = it.numbering != none
// Get the chapter number from the heading counter
#if has-numbering {
num = counter(heading).display(it.numbering)
}
// Chapter number formatting
#show num: num => {
set text(
size: font-size-large,
weight: "light",
fill: luma(128)
)
smallcaps[#num]
}
// Space the chapter header from the top of the page
#pad(
top: 1in,
bottom: 1in,
{
if has-numbering {
num
}
linebreak()
set text(font: font-title)
it.body
}
)
]
#content
]
#let template-page-header(content) = [
#set page(
header: context [
#let titles = selector(heading.where(level:1))
#let past-titles = query(titles.before(here()))
#let chapters = selector(heading.where(level: 2))
#let past-chapters = query(chapters.before(here()))
#let this-page = here().page()
// Skip pages before the first chapter, fix the page number
#let is-before-first-chapter = past-chapters.len() == 0
#if is-before-first-chapter [
#counter(page).update(1)
#return
]
// Skip pages where a new chapter starts
#let future-chapters = query(chapters.after(here()))
#let is-during-last-chapter = future-chapters.len() == 0
#if not is-during-last-chapter [
#let next-chapter-page = future-chapters.first().location().page()
#let is-chapter-start = next-chapter-page == this-page
#if is-chapter-start [
#return
]
]
// De-emphasize titles
#let header-title(content) = {
set text(
size: font-size-small,
weight: "light",
fill: luma(128)
)
smallcaps[#content]
}
#set align(horizon)
#let is-recto = calc.odd(here().page())
#if is-recto [
#set align(right)
#header-title[#past-chapters.last().body]
#h(1em)
#counter(page).display()
] else [
#counter(page).display()
#h(1em)
#header-title[#past-titles.last().body]
]
],
header-ascent: 0%
)
#content
]
#let template-outline(content) = [
#set align(horizon)
// De-emphasize each chapter number
#show outline.entry: it => {
let books = query(selector(heading.where(level: 1))) // I'm so confused why there are nine of these :(
show regex("Chapter [^\.]*."): num => [
#set text(
size: font-size-small,
fill: luma(128)
)
#smallcaps[#num]
]
it
}
#content
]
#let insert(
content,
verso-header: ""
) = [
#show: template-shared
#show: template-chapter-start
#show: template-page-header
#content
]
#let insert-outline(
start-label,
end-label: <end>
) = [
#show: template-shared
#show: template-outline
#pagebreak()
#outline(
title: none,
target: selector(heading.where(level: 2).after(start-label)).before(end-label)
)
]