A typst template for use in MLA formats.
#let mla(
  title: "Paper Title",
  author: none,
  professor: none,
  date: none,
  course: none,
  bibliography-file: none,
  body
) = {
  // Set document metdata.
  set document(
    title: title,
    author: author.firstname + " " + author.lastname
  )
  
  // Configure the page.
  set page(
    paper: "us-letter",
    header: align(
      right + horizon,
      [
        #v(0.5in)
        #author.lastname
        #context(counter(page).display("1"))
      ]
    ),
    margin: 1in
  )
  
  // Set paragraph properties.
  set par(
    first-line-indent: 0.5in,
    justify: false, 
    leading: 2em
  )
  set par( 
    spacing: 2em 
  )

  // Set the body font.
  set text(
    font: "Liberation Serif",
    size: 12pt,
  )

  // Configure headings.
  set heading(numbering: "1.1.a.")
  show heading: set block(spacing: 2em)
  show heading: it => {
    set text(size: 12pt)
    set par(first-line-indent: 0in)
    
    // Create the heading numbering.
    let number = if it.numbering != none {
      counter(heading).display(it.numbering)
      h(6pt, weak: true)
    }
    
    // Don't number the conclusion
    let is-conclusion = it.body in ([conclusion], [Conclusion], [CONCLUSION])
    v(2em)
    if it.level == 1 and is-conclusion == true {
      block[#text(weight: "bold")[#it.body]]
    } else if it.level == 1 and is-conclusion == false {
      block[#text(weight: "bold")[#number #it.body]]
    } else if it.level == 2 {
      block[#text(weight: "semibold")[#number #it.body]]
    } else if it.level == 3 {
      block[#text(weight: "medium")[#number #it.body]]
    }
    v(2em)
  }

  // configure block quotes
  set quote(block: true)
  show quote: set pad(left: 0.5in)
  show quote: set block(spacing: 2em)

  // configure tables
  show figure.where(kind: table): it => {
    set block(spacing: 1em)
    set par(
      first-line-indent: 0in,
      leading: 1em
    )
    set table(stroke: none, align: center, row-gutter: 1em)
    strong([Table #it.counter.display(it.numbering) #linebreak()])
    it.caption.body
    it.body
    it.supplement
  }

  // configure illustrations
  show figure.where(kind: image): it => {
    set block(spacing: 1em)
    set par(
      first-line-indent: 0in,
      leading: 1em
    )
    it.body
     align(
       center,
       [Fig. #it.counter.display(it.numbering)\. #it.caption.body]
     )
    
  }

  // MLA boilerplate
  align(left,
    stack(
      dir:ttb,
      spacing: 2em,
      [#author.firstname #author.lastname],
      ..if professor != none { (professor,) } else { () },
      course,
      date
    )
  )
  
  // Display the paper's title.
  align(center, title)

  // Display the paper's contents.
  body

  // Display the bibliography, if any is given.
  if bibliography-file != none {
    pagebreak()
    align(center, "Works Cited")
    show bibliography: set par(
      first-line-indent: 0in,
      hanging-indent: 0.5in
    )
    bibliography(
      bibliography-file, title:none, style: "mla"
    )
  }
}