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)
]

7 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

1 Like

Thank you for the feedback! :)

I can’t reproduce that. Note that the link in the GitHub README doesn’t lead to the raw PDF but its GitHub page. For the PDF itself use this link.

Maybe in a future version. :+1:

Sure, at the end of the day that’s all it is. The “cool” thing about it is how everything’s integrated with the rest of the template. For example, the score box gets automatically generated depending on the tasks you wrote, sums up all the points and takes bonus tasks into account. If that’s useful to you, you can decide for yourself.