Update cetz & ci

This commit is contained in:
2025-09-23 23:29:06 -07:00
parent 121780df6c
commit e5b0053465
17 changed files with 393 additions and 483 deletions

View File

@ -26,7 +26,7 @@ jobs:
- name: "Download Typstyle" - name: "Download Typstyle"
run: | run: |
wget -q "https://github.com/Enter-tainer/typstyle/releases/download/v0.12.14/typstyle-x86_64-unknown-linux-musl" wget -q "https://github.com/Enter-tainer/typstyle/releases/download/v0.13.17/typstyle-x86_64-unknown-linux-musl"
chmod +x typstyle-x86_64-unknown-linux-musl chmod +x typstyle-x86_64-unknown-linux-musl
- name: Check typst formatting - name: Check typst formatting
@ -62,7 +62,7 @@ jobs:
# more control anyway. # more control anyway.
- name: "Download Typst" - name: "Download Typst"
run: | run: |
wget -q "https://github.com/typst/typst/releases/download/v0.12.0/typst-x86_64-unknown-linux-musl.tar.xz" wget -q "https://github.com/typst/typst/releases/download/v0.13.1/typst-x86_64-unknown-linux-musl.tar.xz"
tar -xf "typst-x86_64-unknown-linux-musl.tar.xz" tar -xf "typst-x86_64-unknown-linux-musl.tar.xz"
mv "typst-x86_64-unknown-linux-musl/typst" . mv "typst-x86_64-unknown-linux-musl/typst" .
rm "typst-x86_64-unknown-linux-musl.tar.xz" rm "typst-x86_64-unknown-linux-musl.tar.xz"

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Floats = Floats
#definition() #definition()
@ -33,72 +33,66 @@ Another way we can interpret a bit string is as a _signed floating-point decimal
Floats represent a subset of the real numbers, and are interpreted as follows: \ Floats represent a subset of the real numbers, and are interpreted as follows: \
#note([The following only applies to floats that consist of 32 bits. We won't encounter any others today.]) #note([The following only applies to floats that consist of 32 bits. We won't encounter any others today.])
#align( #align(center, box(inset: 2mm, cetz.canvas({
center, import cetz.draw: *
box(
inset: 2mm,
cetz.canvas({
import cetz.draw: *
let chars = ( let chars = (
`0`, `0`,
`b`, `b`,
`0`, `0`,
`_`, `_`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`_`, `_`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`_`, `_`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`_`, `_`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
`0`, `0`,
) )
let x = 0 let x = 0
for c in chars { for c in chars {
content((x, 0), c) content((x, 0), c)
x += 0.25 x += 0.25
} }
let y = -0.4 let y = -0.4
line((0.3, y), (0.65, y)) line((0.3, y), (0.65, y))
content((0.45, y - 0.2), [s]) content((0.45, y - 0.2), [s])
line((0.85, y), (2.9, y)) line((0.85, y), (2.9, y))
content((1.9, y - 0.2), [exponent]) content((1.9, y - 0.2), [exponent])
line((3.10, y), (9.4, y)) line((3.10, y), (9.4, y))
content((6.3, y - 0.2), [fraction]) content((6.3, y - 0.2), [fraction])
}), })))
),
)
- The first bit denotes the sign of the float's value - The first bit denotes the sign of the float's value
We'll label it $s$. \ We'll label it $s$. \

View File

@ -1,6 +1,6 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#import "@preview/cetz-plot:0.1.0": plot, chart #import "@preview/cetz-plot:0.1.2": chart, plot
= Integers and Floats = Integers and Floats
@ -44,19 +44,11 @@ This allows us to improve the average error of our linear approximation:
{ {
let domain = (0, 1) let domain = (0, 1)
plot.add( plot.add(f1, domain: domain, label: $log(1+x)$, style: (
f1, stroke: ogrape,
domain: domain, ))
label: $log(1+x)$,
style: (stroke: ogrape),
)
plot.add( plot.add(f2, domain: domain, label: $x$, style: (stroke: oblue))
f2,
domain: domain,
label: $x$,
style: (stroke: oblue),
)
}, },
) )
}) })
@ -90,19 +82,11 @@ This allows us to improve the average error of our linear approximation:
{ {
let domain = (0, 1) let domain = (0, 1)
plot.add( plot.add(f1, domain: domain, label: $log(1+x)$, style: (
f1, stroke: ogrape,
domain: domain, ))
label: $log(1+x)$,
style: (stroke: ogrape),
)
plot.add( plot.add(f2, domain: domain, label: $x$, style: (stroke: oblue))
f2,
domain: domain,
label: $x$,
style: (stroke: oblue),
)
}, },
) )
}) })
@ -120,16 +104,13 @@ We won't bother with this---we'll simply leave the correction term as an opaque
#v(1fr) #v(1fr)
#note( #note(type: "Note", [
type: "Note", "Average error" above is simply the area of the region between the two graphs:
[ $
"Average error" above is simply the area of the region between the two graphs: integral_0^1 abs(#v(1mm) log(1+x)_2 - (x+epsilon) #v(1mm))
$ $
integral_0^1 abs( #v(1mm) log(1+x)_2 - (x+epsilon) #v(1mm)) Feel free to ignore this note, it isn't a critical part of this handout.
$ ])
Feel free to ignore this note, it isn't a critical part of this handout.
],
)
#pagebreak() #pagebreak()
@ -149,12 +130,11 @@ $
Let $E$ and $F$ be the exponent and float bits of $x_f$. \ Let $E$ and $F$ be the exponent and float bits of $x_f$. \
We then have: We then have:
$ $
log_2(x_f) log_2(x_f) & = log_2 ( 2^(E-127) times (1 + (F) / (2^23)) ) \
&= log_2 ( 2^(E-127) times (1 + (F) / (2^23)) ) \ & = E - 127 + log_2(1 + F / (2^23)) \
&= E - 127 + log_2(1 + F / (2^23)) \ & approx E-127 + F / (2^23) + epsilon \
& approx E-127 + F / (2^23) + epsilon \ & = 1 / (2^23)(2^23 E + F) - 127 + epsilon \
&= 1 / (2^23)(2^23 E + F) - 127 + epsilon \ & = 1 / (2^23)(x_i) - 127 + epsilon
&= 1 / (2^23)(x_i) - 127 + epsilon
$ $
]) ])

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
// Shorthand, we'll be using these a lot. // Shorthand, we'll be using these a lot.
@ -7,35 +7,31 @@
#let tm = sym.times.circle #let tm = sym.times.circle
#let graphgrid(inner_content) = { #let graphgrid(inner_content) = {
align( align(center, box(inset: 3mm, cetz.canvas({
center, import cetz.draw: *
box( let x = 5.25
inset: 3mm,
cetz.canvas({
import cetz.draw: *
let x = 5.25
grid( grid(
(0, 0), (x, x), step: 0.75, (0, 0),
stroke: luma(100) + 0.3mm (x, x),
) step: 0.75,
stroke: luma(100) + 0.3mm,
)
if (inner_content != none) { if (inner_content != none) {
inner_content inner_content
} }
mark((0, x + 0.5), (0, x + 1), symbol: ">", fill: black, scale: 1) mark((0, x + 0.5), (0, x + 1), symbol: ">", fill: black, scale: 1)
mark((x + 0.5, 0), (x + 1, 0), symbol: ">", fill: black, scale: 1) mark((x + 0.5, 0), (x + 1, 0), symbol: ">", fill: black, scale: 1)
line( line(
(0, x + 0.25), (0, x + 0.25),
(0, 0), (0, 0),
(x + 0.25, 0), (x + 0.25, 0),
stroke: 0.75mm + black, stroke: 0.75mm + black,
) )
}), })))
),
)
} }
/// Adds extra padding to an equation. /// Adds extra padding to an equation.
@ -48,23 +44,16 @@
/// Note that there are newlines between the $ and content, /// Note that there are newlines between the $ and content,
/// this gives us display math (which is what we want when using this macro) /// this gives us display math (which is what we want when using this macro)
#let eqnbox(eqn) = { #let eqnbox(eqn) = {
align( align(center, box(
center, inset: 3mm,
box( eqn,
inset: 3mm, ))
eqn,
),
)
} }
#let dotline(a, b) = { #let dotline(a, b) = {
cetz.draw.line( cetz.draw.line(a, b, stroke: (
a, dash: "dashed",
b, thickness: 0.5mm,
stroke: ( paint: ored,
dash: "dashed", ))
thickness: 0.5mm,
paint: ored,
),
)
} }

View File

@ -1,21 +1,18 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "../macros.typ": * #import "../macros.typ": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Tropical Polynomials = Tropical Polynomials
#definition() #definition()
A _polynomial_ is an expression formed by adding and multiplying numbers and a variable $x$. \ A _polynomial_ is an expression formed by adding and multiplying numbers and a variable $x$. \
Every polynomial can be written as Every polynomial can be written as
#align( #align(center, box(
center, inset: 3mm,
box( $
inset: 3mm, c_0 + c_1 x + c_2 x^2 + ... + c_n x^n
$ $,
c_0 + c_1 x + c_2 x^2 + ... + c_n x^n ))
$,
),
)
for some nonnegative integer $n$ and coefficients $c_0, c_1, ..., c_n$. \ for some nonnegative integer $n$ and coefficients $c_0, c_1, ..., c_n$. \
The _degree_ of a polynomial is the largest $n$ for which $c_n$ is nonzero. The _degree_ of a polynomial is the largest $n$ for which $c_n$ is nonzero.
@ -43,15 +40,12 @@ In this section, we will analyze tropical polynomials:
#definition() #definition()
A _tropical_ polynomial is a polynomial that uses tropical addition and multiplication. \ A _tropical_ polynomial is a polynomial that uses tropical addition and multiplication. \
In other words, it is an expression of the form In other words, it is an expression of the form
#align( #align(center, box(
center, inset: 3mm,
box( $
inset: 3mm, c_0 #tp (c_1 #tm x) #tp (c_2 #tm x^2) #tp ... #tp (c_n #tm x^n)
$ $,
c_0 #tp (c_1 #tm x) #tp (c_2 #tm x^2) #tp ... #tp (c_n #tm x^n) ))
$,
),
)
where all exponents represent repeated tropical multiplication. where all exponents represent repeated tropical multiplication.
#pagebreak() // MARK: page #pagebreak() // MARK: page
@ -66,7 +60,7 @@ Draw a graph of the tropical polynomial $f(x) = x^2 #tp 1x #tp 4$. \
#if_no_solutions(graphgrid(none)) #if_no_solutions(graphgrid(none))
#solution([ #solution([
$f(x) = min(2x , 1+x, 4)$, which looks like: $f(x) = min(2x, 1+x, 4)$, which looks like:
#graphgrid({ #graphgrid({
import cetz.draw: * import cetz.draw: *
@ -90,15 +84,12 @@ Draw a graph of the tropical polynomial $f(x) = x^2 #tp 1x #tp 4$. \
#problem() #problem()
Now, factor $f(x) = x^2 #tp 1x #tp 4$ into two polynomials with degree 1. \ Now, factor $f(x) = x^2 #tp 1x #tp 4$ into two polynomials with degree 1. \
In other words, find $r$ and $s$ so that In other words, find $r$ and $s$ so that
#align( #align(center, box(
center, inset: 3mm,
box( $
inset: 3mm, x^2 #tp 1x #tp 4 = (x #tp r)(x #tp s)
$ $,
x^2 #tp 1x #tp 4 = (x #tp r)(x #tp s) ))
$,
),
)
we will call $r$ and $s$ the _roots_ of $f$. we will call $r$ and $s$ the _roots_ of $f$.
@ -159,15 +150,19 @@ Find a factorization of $f$ in the form $a(x #tp r)(x#tp s)$.
#solution([ #solution([
We (tropically) factor out $-2$ to get We (tropically) factor out $-2$ to get
#eqnbox($ #eqnbox(
f(x) = -2(x^2 #tp 2x #tp 10) $
$) f(x) = -2(x^2 #tp 2x #tp 10)
$,
)
by the same process as the previous problem, we get by the same process as the previous problem, we get
#eqnbox($ #eqnbox(
f(x) = -2(x #tp 2)(x #tp 8) $
$) f(x) = -2(x #tp 2)(x #tp 8)
$,
)
]) ])
#v(1fr) #v(1fr)
@ -236,11 +231,11 @@ Graph $f(x) = 1x^2 #tp 3x #tp 5$.
#problem() #problem()
Find a factorization of $f$ in the form $a(x #tp r)(x#tp s)$. Find a factorization of $f$ in the form $a(x #tp r)(x#tp s)$.
#solution( #solution(eqnbox(
eqnbox($ $
f(x) = 1x^2 #tp 3 x #tp 5 = 1(x #tp 2)^2 f(x) = 1x^2 #tp 3 x #tp 5 = 1(x #tp 2)^2
$), $,
) ))
#v(1fr) #v(1fr)
@ -263,23 +258,21 @@ Graph $f(x) = 2x^2 #tp 4x #tp 4$.
#if_no_solutions(graphgrid(none)) #if_no_solutions(graphgrid(none))
#solution( #solution(graphgrid({
graphgrid({ import cetz.draw: *
import cetz.draw: * let step = 0.75
let step = 0.75
dotline((0, 2 * step), (3 * step, 8 * step)) dotline((0, 2 * step), (3 * step, 8 * step))
dotline((0, 4 * step), (5 * step, 8 * step)) dotline((0, 4 * step), (5 * step, 8 * step))
dotline((0, 4 * step), (8 * step, 4 * step)) dotline((0, 4 * step), (8 * step, 4 * step))
line( line(
(0, 2 * step), (0, 2 * step),
(1 * step, 4 * step), (1 * step, 4 * step),
(7.5 * step, 4 * step), (7.5 * step, 4 * step),
stroke: 1mm + oblue, stroke: 1mm + oblue,
) )
}), }))
)
#problem() #problem()
@ -325,7 +318,7 @@ Find a formula for $B$ in terms of $a$, $b$, and $c$. \
#solution([ #solution([
If we want to factor $a(x^2 #tp (b-a)x #tp (c-a))$, we need to find $r$ and $s$ so that If we want to factor $a(x^2 #tp (b-a)x #tp (c-a))$, we need to find $r$ and $s$ so that
- $min(r,s) = b-a$, and - $min(r, s) = b-a$, and
- $r + s = c - a$ - $r + s = c - a$
#v(2mm) #v(2mm)
@ -341,9 +334,8 @@ Find a formula for $B$ in terms of $a$, $b$, and $c$. \
*Case 2:* If $b > (a + c #sym.div) 2$, then *Case 2:* If $b > (a + c #sym.div) 2$, then
$ $
accent(f, macron)(x) accent(f, macron)(x) & = a x^2 #tp ((a+c)/2)x #tp c \
&= a x^2 #tp ((a+c)/2)x #tp c \ & = a(x #tp (c-a)/2)^2
&= a(x #tp (c-a)/2)^2
$ $
has the same graph as $f$, and thus $B = (a+c) #sym.div 2$ has the same graph as $f$, and thus $B = (a+c) #sym.div 2$

View File

@ -1,6 +1,6 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "../macros.typ": * #import "../macros.typ": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Tropical Cubic Polynomials = Tropical Cubic Polynomials
@ -131,15 +131,12 @@ Using the last three problems, find formulas for $B$ and $C$ in terms of $a$, $b
#problem() #problem()
What are the roots of the following polynomial? What are the roots of the following polynomial?
#align( #align(center, box(
center, inset: 3mm,
box( $
inset: 3mm, 3 x^6 #tp 4 x^5 #tp 2 x^4 #tp x^3 #tp x^2 #tp 4 x #tp 5
$ $,
3 x^6 #tp 4 x^5 #tp 2 x^4 #tp x^3 #tp x^2 #tp 4 x #tp 5 ))
$,
),
)
#solution([ #solution([
We have We have
@ -169,9 +166,8 @@ Find a formula for each $C_i$ in terms of $c_0, c_1, ..., c_n$.
#solution([ #solution([
$ $
A_j A_j & = min_(l<=j<k)( (a_l - a_k) / (k-l) (k-j) + a_k ) \
&= min_(l<=j<k)( (a_l - a_k) / (k-l) (k-j) + a_k ) \ & = min_(l<=j<k)( a_l (k-j) / (k-l) + a_k (j-l) / (k-l) )
&= min_(l<=j<k)( a_l (k-j) / (k-l) + a_k (j-l) / (k-l) )
$ $
#v(2mm) #v(2mm)

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Wallpaper Symmetries = Wallpaper Symmetries

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Mirror Symmetry = Mirror Symmetry

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= Rotational Symmetry = Rotational Symmetry

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#let pat(img, sol) = { #let pat(img, sol) = {
problem() problem()

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
= The Signature-Cost Theorem = The Signature-Cost Theorem
@ -7,23 +7,20 @@
First, we'll associate a _cost_ to each type of symmetry in orbifold notation: First, we'll associate a _cost_ to each type of symmetry in orbifold notation:
#v(4mm) #v(4mm)
#align( #align(center, table(
center, stroke: (1pt, 1pt),
table( align: center,
stroke: (1pt, 1pt), columns: (auto, auto, auto, auto),
align: center, [*Symbol*], [*Cost*], [*Symbol*], [*Cost*],
columns: (auto, auto, auto, auto), [#sym.circle.small], [2], [#sym.times or #sym.convolve], [1],
[*Symbol*], [*Cost*], [*Symbol*], [*Cost*], [#sym.diamond.stroked.small`2`], [1/2], [#sym.convolve`2`], [1/4],
[#sym.circle.small], [2], [#sym.times or #sym.convolve], [1], [#sym.diamond.stroked.small`3`], [2/3], [#sym.convolve`3`], [1/3],
[#sym.diamond.stroked.small`2`], [1/2], [#sym.convolve`2`], [1/4], [#sym.dots], [#sym.dots], [#sym.dots], [#sym.dots],
[#sym.diamond.stroked.small`3`], [2/3], [#sym.convolve`3`], [1/3], [#sym.diamond.stroked.small`n`],
[#sym.dots], [#sym.dots], [#sym.dots], [#sym.dots], [$(n-1) / n$],
[#sym.diamond.stroked.small`n`], [#sym.convolve`n`],
[$(n-1) / n$], [$(n-1) / (2n)$],
[#sym.convolve`n`], ))
[$(n-1) / (2n)$],
),
)
We then calculate the total "cost" of a signature by adding up the costs of each component. We then calculate the total "cost" of a signature by adding up the costs of each component.

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: Big-Tac-Toe], title: [Warm-Up: Big-Tac-Toe],
@ -75,16 +75,13 @@ How does your strategy change? \
#if extra_boards { #if extra_boards {
pagebreak() pagebreak()
align( align(center, grid(
center, stroke: none,
grid( align: center,
stroke: none, columns: (1fr, 1fr),
align: center, rows: (1fr, 1fr, 1fr),
columns: (1fr, 1fr), btt(0.35), btt(0.35),
rows: (1fr, 1fr, 1fr), btt(0.35), btt(0.35),
btt(0.35), btt(0.35), btt(0.35), btt(0.35),
btt(0.35), btt(0.35), ))
btt(0.35), btt(0.35),
),
)
} }

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
@ -43,61 +43,56 @@ Now, consider the set of six-sided dice below:
- Die $E$: $0, 5, 5, 5, 5, 5$ - Die $E$: $0, 5, 5, 5, 5, 5$
On average, which die beats each of the others? Draw a diagram. On average, which die beats each of the others? Draw a diagram.
#solution( #solution(align(center, cetz.canvas({
align( import cetz.draw: *
center,
cetz.canvas({
import cetz.draw: *
let s = 0.8 // Scale let s = 0.8 // Scale
let t = 13pt * s // text size let t = 13pt * s // text size
let radius = 0.3 * s let radius = 0.3 * s
// Points // Points
let a = (-2 * s, 0.2 * s) let a = (-2 * s, 0.2 * s)
let b = (0 * s, 2 * s) let b = (0 * s, 2 * s)
let c = (2 * s, 0.2 * s) let c = (2 * s, 0.2 * s)
let d = (1.2 * s, -2.1 * s) let d = (1.2 * s, -2.1 * s)
let e = (-1.2 * s, -2.1 * s) let e = (-1.2 * s, -2.1 * s)
set-style( set-style(
stroke: (thickness: 0.6mm * s), stroke: (thickness: 0.6mm * s),
mark: ( mark: (
end: ( end: (
symbol: ">", symbol: ">",
fill: black, fill: black,
offset: radius + (0.025 * s), offset: radius + (0.025 * s),
width: 1.2mm * s, width: 1.2mm * s,
length: 1.2mm * s, length: 1.2mm * s,
), ),
), ),
) )
line(a, b) line(a, b)
line(b, c) line(b, c)
line(c, d) line(c, d)
line(d, e) line(d, e)
line(e, a) line(e, a)
line(a, c) line(a, c)
line(b, d) line(b, d)
line(c, e) line(c, e)
line(d, a) line(d, a)
line(e, b) line(e, b)
circle(a, radius: radius, fill: oblue, stroke: none) circle(a, radius: radius, fill: oblue, stroke: none)
circle(b, radius: radius, fill: oblue, stroke: none) circle(b, radius: radius, fill: oblue, stroke: none)
circle(c, radius: radius, fill: oblue, stroke: none) circle(c, radius: radius, fill: oblue, stroke: none)
circle(d, radius: radius, fill: oblue, stroke: none) circle(d, radius: radius, fill: oblue, stroke: none)
circle(e, radius: radius, fill: oblue, stroke: none) circle(e, radius: radius, fill: oblue, stroke: none)
content(a, text(fill: white, size: t, [*A*])) content(a, text(fill: white, size: t, [*A*]))
content(b, text(fill: white, size: t, [*B*])) content(b, text(fill: white, size: t, [*B*]))
content(c, text(fill: white, size: t, [*C*])) content(c, text(fill: white, size: t, [*C*]))
content(d, text(fill: white, size: t, [*D*])) content(d, text(fill: white, size: t, [*D*]))
content(e, text(fill: white, size: t, [*E*])) content(e, text(fill: white, size: t, [*E*]))
}), })))
),
)
#v(1fr) #v(1fr)

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: What's an AST?], title: [Warm-Up: What's an AST?],
@ -18,59 +18,56 @@ You may detach the string as you hang the painting, but it must be re-attached o
#v(2mm) #v(2mm)
#align( #align(center, cetz.canvas({
center, import cetz.draw: *
cetz.canvas({ let s = 2.5
import cetz.draw: *
let s = 2.5
line( line(
(0 * s, 1 * s), (0 * s, 1 * s),
(2 * s, 1 * s), (2 * s, 1 * s),
(2 * s, 0 * s), (2 * s, 0 * s),
(0 * s, 0 * s), (0 * s, 0 * s),
close: true, close: true,
stroke: (thickness: 0.8mm), stroke: (thickness: 0.8mm),
) )
line( line(
(0.1 * s, 1 * s), (0.1 * s, 1 * s),
(0.5 * s, 1.5 * s), (0.5 * s, 1.5 * s),
(1.5 * s, 1.5 * s), (1.5 * s, 1.5 * s),
(1.9 * s, 1 * s), (1.9 * s, 1 * s),
stroke: (thickness: 0.5mm, dash: "dotted"), stroke: (thickness: 0.5mm, dash: "dotted"),
) )
circle((0.5 * s, 1.5 * s), radius: 0.04 * s, fill: black, stroke: none) circle((0.5 * s, 1.5 * s), radius: 0.04 * s, fill: black, stroke: none)
circle((1.5 * s, 1.5 * s), radius: 0.04 * s, fill: black, stroke: none) circle((1.5 * s, 1.5 * s), radius: 0.04 * s, fill: black, stroke: none)
line( line(
(0.66 * s, 0.66 * s), (0.66 * s, 0.66 * s),
(0.66 * s, 0.35 * s), (0.66 * s, 0.35 * s),
(0.60 * s, 0.1 * s), (0.60 * s, 0.1 * s),
) )
line( line(
(0.72 * s, 0.1 * s), (0.72 * s, 0.1 * s),
(0.66 * s, 0.35 * s), (0.66 * s, 0.35 * s),
) )
line( line(
(0.66 * s, 0.575 * s), (0.66 * s, 0.575 * s),
(0.6 * s, 0.475 * s), (0.6 * s, 0.475 * s),
(0.525 * s, 0.575 * s), (0.525 * s, 0.575 * s),
) )
line( line(
(0.66 * s, 0.575 * s), (0.66 * s, 0.575 * s),
(0.72 * s, 0.475 * s), (0.72 * s, 0.475 * s),
(0.795 * s, 0.575 * s), (0.795 * s, 0.575 * s),
) )
circle((0.66 * s, 0.66 * s), radius: 0.07 * s, fill: white) circle((0.66 * s, 0.66 * s), radius: 0.07 * s, fill: white)
}), }))
)
#solution([ #solution([
Say we have a left nail and a right nail. The path of the string is as follows: Say we have a left nail and a right nail. The path of the string is as follows:

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: Passing Balls], title: [Warm-Up: Passing Balls],
@ -78,32 +78,25 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
let i = 1 let i = 1
for p in pts { for p in pts {
circle( circle(p, radius: radius * s, fill: if i == 1 {
p, ored
radius: radius * s, } else if i == 2 {
fill: if i == 1 { ogreen
ored } else if i == 3 {
} else if i == 2 { oorange
ogreen } else if i == 4 {
} else if i == 3 { oblue
oorange } else { white })
} else if i == 4 {
oblue
} else { white },
)
content( content(p, text(
p, fill: if i <= 4 {
text( white
fill: if i <= 4 { } else {
white black
} else { },
black size: t,
}, [*#i*],
size: t, ))
[*#i*],
),
)
i = i + 1 i = i + 1
} }
}), }),
@ -118,32 +111,25 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
let l = calc.rem(((i - 1) * 5), 12) + 1 let l = calc.rem(((i - 1) * 5), 12) + 1
circle( circle(p, radius: radius * s, fill: if l == 1 {
p, ored
radius: radius * s, } else if l == 2 {
fill: if l == 1 { ogreen
ored } else if l == 3 {
} else if l == 2 { oorange
ogreen } else if l == 4 {
} else if l == 3 { oblue
oorange } else { white })
} else if l == 4 {
oblue
} else { white },
)
content( content(p, text(
p, fill: if l <= 4 {
text( white
fill: if l <= 4 { } else {
white black
} else { },
black size: t,
}, [*#l*],
size: t, ))
[*#l*],
),
)
i = i + 1 i = i + 1
} }
}), }),
@ -158,32 +144,25 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
let l = calc.rem(((i - 1) * 5), 12) + 1 let l = calc.rem(((i - 1) * 5), 12) + 1
circle( circle(p, radius: radius * s, fill: if l == 1 {
p, oblue
radius: radius * s, } else if l == 2 {
fill: if l == 1 { oorange
oblue } else if l == 3 {
} else if l == 2 { ored
oorange } else if l == 4 {
} else if l == 3 { ogreen
ored } else { white })
} else if l == 4 {
ogreen
} else { white },
)
content( content(p, text(
p, fill: if l <= 4 {
text( white
fill: if l <= 4 { } else {
white black
} else { },
black size: t,
}, [*#l*],
size: t, ))
[*#l*],
),
)
i = i + 1 i = i + 1
} }
}), }),

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: What's an AST?], title: [Warm-Up: What's an AST?],
@ -24,51 +24,48 @@ respecting the order of operations $[and, times, div, +, -]$.
#v(2mm) #v(2mm)
#align( #align(center, cetz.canvas({
center, import cetz.draw: *
cetz.canvas({
import cetz.draw: *
// spell:off // spell:off
content((0, 0), $+$, name: "r") content((0, 0), $+$, name: "r")
content((-0.5, -1), $3$, name: "a") content((-0.5, -1), $3$, name: "a")
content((0.5, -1), $div$, name: "b") content((0.5, -1), $div$, name: "b")
content((-0.3, -2), $times$, name: "ba") content((-0.3, -2), $times$, name: "ba")
content((1.3, -2), $and$, name: "bb") content((1.3, -2), $and$, name: "bb")
content((-0.8, -3), $9$, name: "baa") content((-0.8, -3), $9$, name: "baa")
content((0.2, -3), $8$, name: "bab") content((0.2, -3), $8$, name: "bab")
content((0.8, -3), $5$, name: "bba") content((0.8, -3), $5$, name: "bba")
content((1.8, -3), $6$, name: "bbb") content((1.8, -3), $6$, name: "bbb")
// spell:on // spell:on
// Zero-sized arrows are a hack for offset. // Zero-sized arrows are a hack for offset.
set-style( set-style(
stroke: (thickness: 0.3mm), stroke: (thickness: 0.3mm),
mark: ( mark: (
start: ( start: (
symbol: "|", symbol: "|",
offset: 0.25, offset: 0.25,
width: 0mm, width: 0mm,
length: 0mm, length: 0mm,
),
end: (
symbol: "|",
offset: 0.25,
width: 0mm,
length: 0mm,
),
), ),
) end: (
symbol: "|",
offset: 0.25,
width: 0mm,
length: 0mm,
),
),
)
// spell:off // spell:off
line("r", "a") line("r", "a")
line("r", "b") line("r", "b")
line("b", "ba") line("b", "ba")
line("b", "bb") line("b", "bb")
line("ba", "baa") line("ba", "baa")
line("ba", "bab") line("ba", "bab")
line("bb", "bba") line("bb", "bba")
line("bb", "bbb") line("bb", "bbb")
// spell:on // spell:on
}), }))
)

View File

@ -1,24 +1,21 @@
#import "@local/handout:0.1.0": * #import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1" #import "@preview/cetz:0.4.2"
#show: handout.with( #show: handout.with(
title: [Warm-Up: Wild Tic-Tac-Toe], title: [Warm-Up: Wild Tic-Tac-Toe],
by: "Mark", by: "Mark",
) )
#let ttt = align( #let ttt = align(center, cetz.canvas({
center, import cetz.draw: *
cetz.canvas({ let s = 0.7 // scale
import cetz.draw: *
let s = 0.7 // scale
set-style(stroke: (thickness: 0.5mm * s)) set-style(stroke: (thickness: 0.5mm * s))
line((-1 * s, 3 * s), (-1 * s, -3 * s)) line((-1 * s, 3 * s), (-1 * s, -3 * s))
line((1 * s, 3 * s), (1 * s, -3 * s)) line((1 * s, 3 * s), (1 * s, -3 * s))
line((3 * s, -1 * s), (-3 * s, -1 * s)) line((3 * s, -1 * s), (-3 * s, -1 * s))
line((3 * s, 1 * s), (-3 * s, 1 * s)) line((3 * s, 1 * s), (-3 * s, 1 * s))
}), }))
)
#problem() #problem()