Changelog
What has changed in each version of examy, newest first. Before updating, read the version’s breaking changes: they can make an exam written for an earlier version look different or fail to compile.
1.1.0 — 2026-11-09
Added
embed-metadataattaches data for grading tools such as Gradescope to the PDF: the rubrics ("rubric", asexamy-rubric.json), where each question, its answer boxes, and the name block's lines are on the page ("question-regions", asexamy-regions.json, also left as<examy-regions>), or both (true). Withauto, the regions always, and the rubrics only when solutions are shown.--input embed-metadata=..sets it from the command line.- Questions, parts, and subparts can go inside
#columns(..). A question's text outside the columns stays across the page. Points and rubrics in a margin go in the page's margin from any column, stacked there, in a page's own columns too;frheights share what is left of their column; and a#pagebreak()inside the columns splits them, and the same columns go on on the next page.
Breaking changes
- The rubric data,
<examy-rubric>, has a new format:(format, exam-name, rubrics)instead of(exam, questions). Each rubric gives its question'saddress,display-name,level,points, andbonus-pointsinstead ofnumberandtitle, andpointscounts only the points given to it directly, not its parts'. See the manual's "Exam metadata" page for the whole format.
Fixed
#pagebreak(to: "odd")and#pagebreak(to: "even")between or inside questions keep theirto.#set pagebreak(weak: true)and#set colbreak(weak: true)apply to breaks between or inside questions.- The text of every question, part, and subpart is a paragraph, in the PDF's tags, so that a screen reader reads each one on its own, and for
parrules. It was one only when the exam drew something in the margin beside it, or the text had a paragraph break: soshow parrules andfirst-line-indent: (all: true)now apply to every question, not only to some.
1.0.0 — 2026-10-28
Breaking changes
points-tableis a function now. Write#points-table()instead of#points-table.num-pointsandnum-questionsare functions that return a number, and need context: write#context num-points()to show it, or compute with it, as in#context calc.ceil(num-points() * .6).maketitleandname-blockuse the document's font instead of DejaVu Sans Mono. To keep the old look, set the font around them, e.g.#{ set text(font: "DejaVu Sans Mono"); maketitle() }.- An answer box with no
heightfits its content instead of always being 2cm tall. Give it aheightto keep room to write below a prompt. question,partandsubpartno longer takesolution:. Write#solution[..]in the body, where it should be drawn.show-solutionsistrueorfalse(trueby default);noneis no longer accepted.examis a function, not an elembic element, soe.set_(exam, ..)ande.show_(exam, ..)no longer apply to it.
Added
- Documentation site, https://siefkenj.github.io/typst-examy/, with a guide, a reference, and a playground for writing an exam in the browser.
#show: exammakes the rest of the document the exam, andexamtakes anyconfigoption:#show: exam.with(show-solutions: true).- Rubrics:
rubricitems and groups, drawn in the margin or after each question withshow-rubrics, with a dotted line from where each item is written (rubric-trace, or an item's owntrace),rubric-listfor a grading guide, and the rubrics as data (<examy-rubric>) to export as JSON. - Points: badges in the margin or at the end (
points-position), drawn bypoints-formatandbonus-points-format; totals of parts (points-show-totals); points tables by question, part, subpart or page (granularity), vertical, with Score and Bonus rows, split over several rows of columns; points per page (num-points-page(),page-score-box); and bonus and practice totals (num-points(intent: "bonus")). - Numbering:
numberingandnumbering-full, andstringsto translate the words examy prints. Aconfigrule inside an exam can number some questions differently, e.g. a "Bonus 1." section. - Answer boxes: set rules (
#show: e.set_(answer-box, ..)),stroke,fill,radius,outsetandclip, a fractional width (width: 1fr), andconfigoptions for every box's size and look (answer-box-*). Solutions in a box with noheighttake no space, so the key lays out like the exam. - Solutions:
otherwise:, shown in a solution's place on the exam, and their owncolorandbackground-color. - Multiple choice: labels in the bubbles (
enumerate,choices-enumerate),correct:by label (correct: "C"), and options for the bubbles' size, outline, spacing, label font and colors, and for the layout of everychoices(choices-inline,choices-columns,choices-gap). - A
configrule inside an exam can changenumbering,points-format,bonus-points-format,points-position,points-show-totals, therubric-*options andindentfor the questions after it, e.g.#show: e.set_(config, points-position: "end")before a section of the exam. - Questions:
height,indent(andconfig'sindent), and a warning in red where a question is drawn that no exam lays out. durationcan be content, shown as written:duration: [1 h 50 min].- Every function checks its arguments, and an error names the argument and the types it takes.
- Template:
typst init @preview/examy.
Changed
- The badge of bonus points reads "(2 bonus points)".
- A points table labels each column as a reference to its question reads, and links to it.
answer-box'ssolution:is drawn like a#solution[..]at the end of the box, and no longer stretches to fill a box of set height.
Deprecated
answer-box'sdefault_heightanddefault_width: usedefault-heightanddefault-width.presets.utoronto.name_fields: usepresets.utoronto.name-fields.solution'sboxed: ignored. Solutions are always drawn in a box.config'sshow-rubricand--input show-rubric=..: useshow-rubrics.config'ssolution-text-color: usesolution-color.
Fixed
- In a document with several exams, such as an exam and its key in one bundle, point counts, points tables and references are about their own exam.
- A set rule inside a question no longer hides the parts after it from the exam.
- A reference in a question's text after one of its parts, between questions, or after the exam reads as from there:
@subis "(a) i" in question 1's text after part (a), not "i". num-points-pagein a page footer no longer slows down a long exam.- Many fixes to the layout of points badges, question numbers, answer boxes, solutions and equations.
0.4.0 — 2026-10-05
- Multiple-choice bubbles:
choice,choices. - Solutions in an answer box widen automatically to fill it.
- Fixed the spacing of points on a question with no body.
0.3.0 — 2026-09-19
franswer boxes on the same page share the leftover space equally.
0.2.0 — 2026-07-14
- Redesign of the package.