Files
curriculum-project-hub/render/src/elements/lemma.typ
T
sjfhsjfh c17af60bb0 feat(render): rebuild typst render package cph-render (WU-2)
Single entry `display(info, target, parts)` over an ordered parts array, the
frozen contract the generated typst driver calls. Per-kind dispatch for
segment/example/lemma/sop; student/teacher matrix derived internally from
`target` (student hides example solution + lemma proof; teacher shows all).
Content-field values are consumed as already-evaluated content (driver
`include`s them ⇒ module body, ADR-0006), never imported/stringified. Optional
fields (lemma proof, example source) handled gracefully; unknown kind/target
degrade without crashing. Zero @preview deps (CI-robust); CJK + math styled.
Smoke compiles to non-empty student/teacher PDFs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 01:33:40 +08:00

35 lines
979 B
Typst

// lemma: a stated result, optionally with a proof.
//
// Contract fields:
// content: `stmt` (required), `proof` (optional)
// scalar: none
//
// Numbered "定理 N" via the shared lemma-counter.
// student: show `stmt`, HIDE `proof`.
// teacher: show both (when `proof` is present).
// `proof` may be absent (key omitted) — handled gracefully.
#import "../fonts.typ"
#import "common.typ": element-box, tag-line, divider, lemma-counter, hue-of
#let display-lemma(part, show-proof: true) = {
let theme = oklch(70%, 0.08, hue-of.lemma * 1deg)
lemma-counter.step()
element-box(hue-of.lemma, {
// Statement
tag-line(context [定理 #lemma-counter.display()])
set text(font: fonts.accent)
part.stmt
// Proof: only when requested AND actually provided.
let proof = part.at("proof", default: none)
if show-proof and proof != none {
divider(theme)
tag-line[证明]
set text(font: fonts.accent)
proof
}
})
}