You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

322 lines
7.9 KiB
Plaintext

// Sizes used across the template.
#let script-size = 7.97224pt
#let footnote-size = 8.50012pt
#let small-size = 9.24994pt
#let normal-size = 10.00002pt
#let large-size = 11.74988pt
#let definition-counter = counter("definition")
#let theorem-counter = counter("theorem")
// This function gets your whole document as its `body` and formats
// it as an article in the style of the American Mathematical Society.
#let ams-article(
// The article's title.
title: [Paper title],
// An array of authors. For each author you can specify a name,
// department, organization, location, and email. Everything but
// but the name is optional.
authors: (),
// Your article's abstract. Can be omitted if you don't have one.
abstract: none,
// The article's paper size. Also affects the margins.
paper-size: "us-letter",
// The result of a call to the `bibliography` function or `none`.
bibliography: none,
// The document's content.
body,
) = {
// Formats the author's names in a list with commas and a
// final "and".
let names = authors.map(author => author.name)
let author-string = if authors.len() == 2 {
names.join(" and ")
} else {
names.join(", ", last: ", and ")
}
// Set document metadata.
set document(title: title, author: names)
// Set the body font. AMS uses the LaTeX font.
set text(size: normal-size, font: "New Computer Modern")
// set text(size: normal-size, font: "Fira Sans")
// show math.equation: set text(font: "Fira Math")
// Configure the page.
set page(
paper: paper-size,
// The margins depend on the paper size.
margin: (
top: 3cm,
left: 3.5cm,
right: 3.5cm,
bottom: 3cm,
),
// The page header should show the page number and list of
// authors, except on the first page. The page number is on
// the left for even pages and on the right for odd pages.
header-ascent: 18pt,
header: context {
let i = counter(page).get().first()
if i == 1 { return }
set text(size: script-size)
align(center)[
#upper(title)
]
},
// On the first page, the footer should contain the page number.
footer-descent: 12pt,
footer: context {
let i = counter(page).get().first()
align(center, text(size: script-size, [#i]))
}
)
// Configure headings.
set heading(numbering: "1.")
show heading: it => {
// Create the heading numbering.
let number = if it.numbering != none {
counter(heading).display(it.numbering)
h(7pt, weak: true)
}
// Level 1 headings are centered and smallcaps.
// The other ones are run-in.
set text(size: normal-size, weight: 400)
set par(first-line-indent: 0em)
if it.level == 1 {
// set align(center)
set text(size: 20pt)
smallcaps[
#v(18pt, weak: true)
#number
#it.body
#v(normal-size, weak: true)
]
counter(figure.where(kind: "definition")).update(0)
counter(figure.where(kind: "theorem")).update(0)
} else {
if it.level == 2 {
set text(size: 14pt)
v(16pt, weak: true)
number
let styled = if it.level <= 3 { strong } else { emph }
styled(it.body + [. ])
h(7pt, weak: true)
} else {
set text(size: 12pt)
v(16pt, weak: true)
number
let styled = if it.level <= 3 { strong } else { emph }
styled(it.body + [. ])
h(7pt, weak: true)
}
}
}
// Configure lists and links.
set list(indent: 1em, body-indent: 5pt)
set enum(indent: 1em, body-indent: 5pt)
show link: it => {
// Set the link color to blue.
let blue2 = color.mix((blue, 50%), (black, 50%))
// let blue2 = color.mix((blue, 10%), (white, 75%))
set text(blue2)
// Underline the link.
underline(offset: 1pt, stroke: blue2, it)
// box(fill: blue2, outset: (x: 2pt, y: 2pt), radius: 2pt, text(fill: navy, it))
}
set strong(delta: 200)
// Configure equations.
show math.equation: set block(below: 8pt, above: 9pt)
show math.equation: set text(weight: 400)
// show raw: it => box(
// fill: luma(93%),
// radius: 4pt,
// inset: 4pt,
// it
// )
// Configure citation and bibliography styles.
set std.bibliography(style: "springer-mathphys", title: [References])
set figure(gap: 17pt)
show figure: set block(above: 12.5pt, below: 15pt)
show figure: it => {
// Customize the figure's caption.
show figure.caption: caption => {
smallcaps(caption.supplement)
if caption.numbering != none {
[ ]
numbering(caption.numbering, ..caption.counter.at(it.location()))
}
[. ]
caption.body
}
// We want a bit of space around tables and images.
show selector.or(table, image): pad.with(x: 23pt)
// Display the figure's body and caption.
it
}
// Definitions
show figure.where(kind: "definition"): set align(start)
show figure.where(kind: "definition"): it => block(spacing: 11.5pt, {
strong({
it.supplement
if it.numbering != none {
[ ]
it.counter.display(it.numbering)
}
[.]
})
[ ]
it.body
})
// Definitions
show figure.where(kind: "theorem"): set align(start)
show figure.where(kind: "theorem"): it => block(spacing: 11.5pt, {
strong({
it.supplement
if it.numbering != none {
[ ]
it.counter.display(it.numbering)
}
[.]
})
[ ]
emph(it.body)
})
// Display the title and authors.
v(35pt, weak: true)
align(center, smallcaps({
text(size: 18pt, weight: 600, title)
v(25pt, weak: true)
// text(authors.map(author => link(author.url, author.name)).join(", "))
text(author-string)
}))
// Configure paragraph properties.
set par(spacing: 1em, leading: 1em, justify: true)
// Display the abstract
if abstract != none {
v(20pt, weak: true)
// set text(script-size)
show: pad.with(x: 35pt)
smallcaps[Abstract. ]
abstract
}
// Display the article's contents.
v(29pt, weak: true)
body
// Display the bibliography, if any is given.
if bibliography != none {
show std.bibliography: set text(footnote-size)
show std.bibliography: set block(above: 11pt)
show std.bibliography: pad.with(x: 0.5pt)
bibliography
}
// Display details about the authors at the end.
// v(12pt, weak: true)
// show: pad.with(x: 11.5pt)
// set par(first-line-indent: 0pt)
// set text(script-size)
// for author in authors {
// let keys = ("department", "organization", "location")
// let dept-str = keys
// .filter(key => key in author)
// .map(key => author.at(key))
// .join(", ")
// smallcaps(dept-str)
// linebreak()
// if "email" in author [
// _Email address:_ #link("mailto:" + author.email) \
// ]
// if "url" in author [
// _URL:_ #link(author.url)
// ]
// v(12pt, weak: true)
// }
}
#let definition(body, numbered: true) = figure(
body,
kind: "definition",
supplement: [Definition],
numbering: if numbered { n => [#n] }
)
#let theorem(body, numbered: true) = figure(
body,
kind: "theorem",
supplement: [Theorem],
numbering: if numbered { n => [#n] }
)
#let proposition(body, numbered: true) = figure(
body,
kind: "theorem",
supplement: [Proposition],
numbering: if numbered { n => [#n] }
)
#let todo(msg: "", body) = grid(
rows: 2,
box(stroke: orange, fill: orange, inset: 3pt)[
#set text(fill: white, font: "Noto Sans")
#if msg != "" [
`TODO:` #text(size: footnote-size, msg)
] else [
`TODO`
]
],
box(stroke: orange, inset: 5pt, body)
)
// And a function for a proof.
#let proof(body) = block(spacing: 11.5pt, {
emph[Proof.]
[ ]
body
h(1fr)
// Add a word-joiner so that the proof square and the last word before the
// 1fr spacing are kept together.
sym.wj
// Add a non-breaking space to ensure a minimum amount of space between the
// text and the proof square.
sym.space.nobreak
$square.stroked$
})