Introducing sheetstorm:0.4.0: A template for assignment sheets

Hi,
I wanted to share a project of mine: sheetstorm, a template for assignment sheets.

When converting my university workflow to Typst, I noticed there are some but not many packages that target homework submissions etc, so this is my take on the matter. I think its main selling points are:

  • Sane minimal default layout with “vanilla” look
  • Very customizable and well-documented
  • Actively maintained and improved (because heavily dogfooded)
  • Multi-language capability (I use it for English and German, more languages can be added)
  • Cool built-in features: theorem/proof environments, TODO warnings, score box, …

If you’re interested, any feedback and/or contribution is more than welcome!

GitHub: GitHub - rabuu/sheetstorm: A Typst template for assignment sheets
Universe: sheetstorm – Typst Universe

Little showcase

#import "@preview/sheetstorm:0.4.0": *

#show: assignment.with(
  course: smallcaps[Sheetstorm 101],
  title: "Assignment Example",
  authors: (
    (name: "John Doe", id: 123456),
    (name: "Erika Mustermann", id: 654321),
  ),
  info-box-enabled: true,
  score-box-enabled: true,
  // Here you can customize the layout of the page, the header, the widgets.
  // Look at the parameters of the `assignment` function.
)

#task(name: "Introduction")[
  This is #link("https://github.com/rabuu/sheetstorm")[`sheetstorm`],
  a template library that provides a sane default layout for assignment submissions
  with the option of customizability.

  Here you would write down your solutions for the first task:
  #lorem(30)
]

#task(name: "Subtasks", label: "task-subtasks", points: (1, 2))[
  + _What is the color of a banana?_ #subtask-label("banana", display: "a)")

    A banana is *yellow*.

  + _Solve the following equations for $x$._
    + $x^2 = 4 ==> x = plus.minus 2$
    + $x = "color of banana" ==> x = "yellow"$, see @banana.
]

#task(points: 11)[
  Another task but without a name.
  You can reference tasks from above where you set a label, for example @task-subtasks.

  Then you can do some cool math. You could, for example, try to proof that:
  $ forall n gt.eq 0: sum_(i=0)^n i = (n dot (n+1))/2 $

  #proof[
    It is easy to see that the statement is true for the number $0$:
    $sum_(i=0)^0 i = 0 = (0 dot 1)/2$.
    Let's assume that the statement is true for some $n$. It follows:
    $
      sum_(i=0)^(n+1) i & = sum_(i=0)^n i + (n+1)
                          = (n dot (n+1)) / 2 + (n + 1)
                          = (n^2 + n) / 2 + (2n + 2)/2 \
                        & = (n^2 + 3n + 2) / 2
                          = ((n+1) dot (n+2)) / 2
    $
  ]
]

#task(points: 1, bonus: true)[
  #theorem(name: "Very smart formula", label: "example-theorem")[
    Let $x$ be a natural number. Then:
    $ x + 1 + 1 = x + 2 $
  ]
  #proof[The proof of @example-theorem is trivial.]

  #lorem(50)
]

6 Likes

Thx for ur project !
I encounter two issues:

  1. the user manual in github readme is an invalid PDF file
  2. there are no final visual result of every function in ur manual
  3. sorry to say, that I couldn’t see cool features on the project’s cover, just grid, table, heading, par, formula, etc
Partitioned cookie or storage access was provided to “file:///home/Downloads/manual.pdf”
because it is loaded in the third-party context and dynamic state partitioning is enabled. pdf.mjs:10872:22
...
Invalid or corrupted PDF file.

PDF.js v5.2.183 (build: 3f1ecc1ba)
Message: Invalid PDF structure. viewer.mjs:14063:13