6  Conditions and Loops

6.1 Lesson

6.1.1 Goal

In this lesson, we will build the following PDF:

6.1.2 Assets

Starter file

#let col-width = 1cm
#set page(columns: 2)
Recording file

#let col-width = 1cm
#set page(columns: 2)


#let highlighted-grid-number(highlighed-nmbr) = {
  block(
    breakable: false,
    grid(
      columns: range(7).map(x => col-width),
      row-gutter: 0.1cm,
      column-gutter: 0.1cm,
      ..range(1, 31).map(nmbr => {
        let fill-color = if (nmbr == highlighed-nmbr) { green } else { gray }
        circle(fill: fill-color, width: 100%)[
          #set align(center + horizon)

          #nmbr
        ]
      })
    ),
  )
}

#range(1, 30).map(highlighted-grid-number).join([])

#{
  for nmbr in range(1, 30) {
    highlighted-grid-number(nmbr)
  }
}

6.2 Exercise

In the exercises you will create the following PDF:

Hint:

  • Use rect() function instead of circle()

  • Set height of elements to col-width

  • Use if conditions and Typst calc functions to check if number is even or odd:

    calc.rem(1, 2) = 1
    calc.rem(2, 2) = 0
    calc.rem(3, 2) = 1
    calc.rem(4, 2) = 0
    calc.rem(5, 2) = 1
    calc.rem(6, 2) = 0

6.2.1 Assets

Starter file

#let col-width = 1cm
#set page(columns: 2)

6.3 Exercise Solution

Solution


#let col-width = 1cm
#set page(columns: 2)

#let highlighted-grid-number(cells, highlighed_nmbr) = {
  block(
    breakable: false,
    grid(
      columns: range(7).map(x => col-width),
      row-gutter: 0.1cm,
      column-gutter: 0.1cm,
      ..range(1, 31).map(nmbr => {
        let fill_color = if (calc.rem(nmbr, 2) == 0) { red } else { blue }
        let text_color = if (calc.rem(nmbr, 2) == 0) { black } else { white }
        let fn_element = if (calc.rem(nmbr, 2) == 0) { circle } else { rect }
        fn_element(fill: fill_color, width: 100%, height: col-width)[
          #set align(center + horizon)

          #text(size: 12pt, weight: "bold", fill: text_color)[#nmbr]
        ]
      })
    ),
  )
}

#{
  for nmbr in range(1, 30) {
    highlighted-grid-number(30, nmbr)
  }
}