fix: exam report targets and objectives
This commit is contained in:
@@ -117,8 +117,8 @@
|
||||
(
|
||||
number: 1,
|
||||
level: 1,
|
||||
objectives: ("lo-sample-met",),
|
||||
objective-texts: (),
|
||||
targets: ("t-sample-met",),
|
||||
measured: (),
|
||||
correct: true,
|
||||
credit: 1.0,
|
||||
bonus: false,
|
||||
@@ -131,8 +131,11 @@
|
||||
(
|
||||
number: 2,
|
||||
level: 3,
|
||||
objectives: ("lo-sample-gap",),
|
||||
objective-texts: ([A sample objective to work on.],),
|
||||
targets: ("t-sample-gap",),
|
||||
measured: ((
|
||||
objective: [A sample objective to work on.],
|
||||
target: [A sample learning target under it.],
|
||||
),),
|
||||
correct: false,
|
||||
credit: 0.0,
|
||||
bonus: false,
|
||||
@@ -149,11 +152,11 @@
|
||||
(
|
||||
lecture: "L1.1",
|
||||
title: "Enthalpy",
|
||||
objectives-missed: 2,
|
||||
targets-missed: 2,
|
||||
questions-missed: 3,
|
||||
questions: (2, 14, 15),
|
||||
slides: (12, 13),
|
||||
objectives: ([A sample objective to work on.], [A second one from the same lecture.]),
|
||||
targets: ([A sample learning target to work on.], [A second one from the same lecture.]),
|
||||
),
|
||||
),
|
||||
study: (
|
||||
@@ -537,9 +540,9 @@
|
||||
= What the exam measured, objective by objective
|
||||
|
||||
#explain[
|
||||
Each line shows something the course asked you to do, just as it appears in the syllabus. *Q* tells you how many questions measured that skill. *You* shows the share you got right, and *class* shows the same for everyone else.
|
||||
Each line is one learning objective, just as it appears in the syllabus. *Q* counts every question on this exam that measured any part of it, so a line usually rests on several questions rather than one. *You* shows the share you got right, and *class* shows the same for everyone else.
|
||||
|
||||
The symbol in the first column is a summary. The mark you should focus on is #text(fill: thin-color, weight: "bold")[?], which means there were not enough questions to draw any conclusions about that line. On exams with many objectives, most lines will have this mark, since one question cannot show if you really know something or just guessed. These lines are not good or bad news. Instead, look for groups of lines that point in the same direction, and check the next two sections, which organize them for you.
|
||||
The symbol in the first column is the summary. A #text(fill: thin-color, weight: "bold")[?] means this exam did not ask enough about that objective to say anything either way, which is a fact about the exam and not about you. Nothing on this page is broken down question by question; for that, see which lectures to go back to, and the notes on the ones you missed.
|
||||
]
|
||||
|
||||
// The objective text is the only thing in this table that wants width, so it
|
||||
@@ -658,10 +661,10 @@
|
||||
// body is a stack, so the title, the provenance line, and the objectives are one
|
||||
// step apart and no paragraph contributes spacing of its own.
|
||||
#let lecture-entry(index, lecture) = {
|
||||
let count = lecture.at("objectives-missed", default: 0)
|
||||
let count = lecture.at("targets-missed", default: 0)
|
||||
let numbers = lecture.at("questions", default: ())
|
||||
let slides = lecture.at("slides", default: ())
|
||||
let objectives = lecture.at("objectives", default: ())
|
||||
let targets = lecture.at("targets", default: ())
|
||||
|
||||
let parts = ()
|
||||
|
||||
@@ -690,10 +693,14 @@
|
||||
parts.push(text(size: size-meta, fill: luma(115))[#trail.join(" · ")])
|
||||
}
|
||||
|
||||
// The learning targets, not the objectives they belong to. This section
|
||||
// answers "what do I go and restudy", and a target is the grain that can be
|
||||
// acted on: it names one performance rather than a whole claim.
|
||||
//
|
||||
// A real list rather than a middot glued to the front of a paragraph, so the
|
||||
// second line of a long objective indents under the first instead of running
|
||||
// second line of a long target indents under the first instead of running
|
||||
// back to the margin.
|
||||
if objectives.len() > 0 {
|
||||
if targets.len() > 0 {
|
||||
parts.push({
|
||||
set text(size: size-small, fill: luma(80))
|
||||
list(
|
||||
@@ -701,7 +708,7 @@
|
||||
body-indent: 0.45em,
|
||||
spacing: step * 0.7,
|
||||
marker: text(fill: luma(165))[·],
|
||||
..objectives.map(objective => markup(objective)),
|
||||
..targets.map(target => markup(target)),
|
||||
)
|
||||
})
|
||||
}
|
||||
@@ -714,7 +721,7 @@
|
||||
rank(index + 1, if index == 0 { bad-color } else if count > 1 { mid-color } else { accent }),
|
||||
pad(right: prose-pad-inset)[#stack(dir: ttb, spacing: step, ..parts)],
|
||||
text(size: size-micro, fill: luma(105))[
|
||||
#count #plural(count, "objective", "objectives")
|
||||
#count #plural(count, "target", "targets")
|
||||
],
|
||||
)
|
||||
]
|
||||
@@ -727,7 +734,7 @@
|
||||
= Which lectures to go back to
|
||||
|
||||
#explain[
|
||||
Each question connects to the lecture it came from. If you sort the lectures by how many different objectives were missed, you get a clear order to review, starting with the most challenging. When one lecture covers several objectives, it often means an early idea was unclear, and fixing that is usually the easiest way to help.
|
||||
Each question connects to the lecture it came from. Sorting the lectures by how many separate things went wrong in each gives you an order to work through, hardest first. Under each lecture are the specific skills the questions were testing, so you can go to the part of it you need rather than rewatching the whole thing. Several from one lecture usually means an early idea did not land, and fixing that one is the cheapest repair.
|
||||
]
|
||||
|
||||
#for (index, lecture) in review-lectures.enumerate() [
|
||||
@@ -856,11 +863,37 @@
|
||||
#let note-entry(q) = {
|
||||
let parts = ()
|
||||
|
||||
let texts = q.at("objective-texts", default: ())
|
||||
if texts.len() > 0 {
|
||||
parts.push(text(fill: luma(21.57%))[
|
||||
#text(weight: "bold")[Measuring:] #texts.map(t => markup(t)).join([; ])
|
||||
])
|
||||
// Both tiers. The target is what this question actually asked, which is the
|
||||
// thing to practise; the objective is the row it counted toward in the table
|
||||
// above, which is how a student tells whether one slip cost them a claim. The
|
||||
// objective is absent when the two would be the same sentence.
|
||||
let measured = q.at("measured", default: ())
|
||||
if measured.len() > 0 {
|
||||
parts.push({
|
||||
set text(fill: luma(21.57%))
|
||||
stack(
|
||||
dir: ttb,
|
||||
spacing: step * 0.45,
|
||||
..measured.map(m => {
|
||||
let objective = m.at("objective", default: none)
|
||||
let target = [
|
||||
#text(weight: "bold")[This question asked you to:] #markup(m.target)
|
||||
]
|
||||
if objective == none {
|
||||
target
|
||||
} else {
|
||||
stack(
|
||||
dir: ttb,
|
||||
spacing: step * 0.3,
|
||||
target,
|
||||
text(size: size-small, fill: luma(110))[
|
||||
Counts toward: #markup(objective)
|
||||
],
|
||||
)
|
||||
}
|
||||
}),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
// The diagnosis carries full body size. It is the sentence worth reading
|
||||
|
||||
Reference in New Issue
Block a user