118 lines
2.8 KiB
Typst
Executable File
118 lines
2.8 KiB
Typst
Executable File
#import "misc.typ": ored, oblue
|
|
|
|
|
|
/// If false, hide instructor info.
|
|
/// If true, show it.
|
|
///
|
|
/// Solutions are shown by default. This behavior
|
|
/// is less surprising than hiding content by default.
|
|
#let solutions_state = state("solutions_state", true)
|
|
|
|
/// Force solutions to be hidden after this point.
|
|
///
|
|
/// This function produces content that must be
|
|
/// included in the document. If it is not included,
|
|
/// this function will have no effect.
|
|
#let hide_solutions() = {
|
|
return solutions_state.update(x => false)
|
|
}
|
|
|
|
/// Force solutions to be shown after this point.
|
|
///
|
|
/// This function produces content that must be
|
|
/// included in the document. If it is not included,
|
|
/// this function will have no effect.
|
|
#let show_solutions() = {
|
|
return solutions_state.update(x => true)
|
|
}
|
|
|
|
|
|
|
|
/// Reset the solution flag to its default value.
|
|
/// This value is determined by compile flags:
|
|
/// Compile with the following command to hide solutions:
|
|
/// `typst compile main.typ --input show_solutions=false`
|
|
///
|
|
/// Solutions are shown by default.
|
|
///
|
|
/// This function produces content that must be
|
|
/// included in the document. If it is not included,
|
|
/// this function will have no effect.
|
|
#let reset_solutions() = {
|
|
if "show_solutions" in sys.inputs {
|
|
if (
|
|
sys.inputs.show_solutions == "false" or sys.inputs.show_solutions == "no"
|
|
) {
|
|
return solutions_state.update(x => false)
|
|
}
|
|
}
|
|
}
|
|
|
|
#let if_solutions(content) = context {
|
|
if solutions_state.get() { content }
|
|
}
|
|
|
|
#let if_no_solutions(content) = context {
|
|
if not solutions_state.get() { content }
|
|
}
|
|
|
|
#let if_solutions_else(if_yes, if_no) = context {
|
|
if solutions_state.get() { if_yes } else { if_no }
|
|
}
|
|
|
|
#let solution(content) = {
|
|
if_solutions(
|
|
align(
|
|
center,
|
|
stack(
|
|
block(
|
|
width: 100%,
|
|
breakable: false,
|
|
fill: ored,
|
|
stroke: ored + 2pt,
|
|
inset: 1.5mm,
|
|
align(left, text(fill: white, weight: "bold", [Solution:])),
|
|
),
|
|
|
|
block(
|
|
width: 100%,
|
|
height: auto,
|
|
breakable: false,
|
|
fill: ored.lighten(80%).desaturate(10%),
|
|
stroke: ored + 2pt,
|
|
inset: 3mm,
|
|
align(left, content),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
}
|
|
|
|
#let instructornote(content) = {
|
|
if_solutions(
|
|
align(
|
|
center,
|
|
stack(
|
|
block(
|
|
width: 100%,
|
|
breakable: false,
|
|
fill: oblue,
|
|
stroke: oblue + 2pt,
|
|
inset: 1.5mm,
|
|
align(left, text(fill: white, weight: "bold", [Instructor note:])),
|
|
),
|
|
|
|
block(
|
|
width: 100%,
|
|
height: auto,
|
|
breakable: false,
|
|
fill: oblue.lighten(80%).desaturate(10%),
|
|
stroke: oblue + 2pt,
|
|
inset: 3mm,
|
|
align(left, content),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
}
|