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"
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
- name: Check typst formatting
@ -62,7 +62,7 @@ jobs:
# more control anyway.
- name: "Download Typst"
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"
mv "typst-x86_64-unknown-linux-musl/typst" .
rm "typst-x86_64-unknown-linux-musl.tar.xz"

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
= Floats
#definition()
@ -33,11 +33,7 @@ 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: \
#note([The following only applies to floats that consist of 32 bits. We won't encounter any others today.])
#align(
center,
box(
inset: 2mm,
cetz.canvas({
#align(center, box(inset: 2mm, cetz.canvas({
import cetz.draw: *
let chars = (
@ -96,9 +92,7 @@ Floats represent a subset of the real numbers, and are interpreted as follows: \
line((3.10, y), (9.4, y))
content((6.3, y - 0.2), [fraction])
}),
),
)
})))
- The first bit denotes the sign of the float's value
We'll label it $s$. \

View File

@ -1,6 +1,6 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
#import "@preview/cetz-plot:0.1.0": plot, chart
#import "@preview/cetz:0.4.2"
#import "@preview/cetz-plot:0.1.2": chart, plot
= Integers and Floats
@ -44,19 +44,11 @@ This allows us to improve the average error of our linear approximation:
{
let domain = (0, 1)
plot.add(
f1,
domain: domain,
label: $log(1+x)$,
style: (stroke: ogrape),
)
plot.add(f1, domain: domain, label: $log(1+x)$, style: (
stroke: ogrape,
))
plot.add(
f2,
domain: domain,
label: $x$,
style: (stroke: oblue),
)
plot.add(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)
plot.add(
f1,
domain: domain,
label: $log(1+x)$,
style: (stroke: ogrape),
)
plot.add(f1, domain: domain, label: $log(1+x)$, style: (
stroke: ogrape,
))
plot.add(
f2,
domain: domain,
label: $x$,
style: (stroke: oblue),
)
plot.add(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)
#note(
type: "Note",
[
#note(type: "Note", [
"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.
],
)
])
#pagebreak()
@ -149,12 +130,11 @@ $
Let $E$ and $F$ be the exponent and float bits of $x_f$. \
We then have:
$
log_2(x_f)
&= log_2 ( 2^(E-127) times (1 + (F) / (2^23)) ) \
&= E - 127 + log_2(1 + F / (2^23)) \
log_2(x_f) & = log_2 ( 2^(E-127) times (1 + (F) / (2^23)) ) \
& = E - 127 + log_2(1 + F / (2^23)) \
& approx E-127 + F / (2^23) + epsilon \
&= 1 / (2^23)(2^23 E + F) - 127 + epsilon \
&= 1 / (2^23)(x_i) - 127 + epsilon
& = 1 / (2^23)(2^23 E + F) - 127 + epsilon \
& = 1 / (2^23)(x_i) - 127 + epsilon
$
])

View File

@ -1,5 +1,5 @@
#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.
@ -7,17 +7,15 @@
#let tm = sym.times.circle
#let graphgrid(inner_content) = {
align(
center,
box(
inset: 3mm,
cetz.canvas({
align(center, box(inset: 3mm, cetz.canvas({
import cetz.draw: *
let x = 5.25
grid(
(0, 0), (x, x), step: 0.75,
stroke: luma(100) + 0.3mm
(0, 0),
(x, x),
step: 0.75,
stroke: luma(100) + 0.3mm,
)
if (inner_content != none) {
@ -33,9 +31,7 @@
(x + 0.25, 0),
stroke: 0.75mm + black,
)
}),
),
)
})))
}
/// Adds extra padding to an equation.
@ -48,23 +44,16 @@
/// Note that there are newlines between the $ and content,
/// this gives us display math (which is what we want when using this macro)
#let eqnbox(eqn) = {
align(
center,
box(
align(center, box(
inset: 3mm,
eqn,
),
)
))
}
#let dotline(a, b) = {
cetz.draw.line(
a,
b,
stroke: (
cetz.draw.line(a, b, stroke: (
dash: "dashed",
thickness: 0.5mm,
paint: ored,
),
)
))
}

View File

@ -1,21 +1,18 @@
#import "@local/handout:0.1.0": *
#import "../macros.typ": *
#import "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
= Tropical Polynomials
#definition()
A _polynomial_ is an expression formed by adding and multiplying numbers and a variable $x$. \
Every polynomial can be written as
#align(
center,
box(
#align(center, box(
inset: 3mm,
$
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$. \
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()
A _tropical_ polynomial is a polynomial that uses tropical addition and multiplication. \
In other words, it is an expression of the form
#align(
center,
box(
#align(center, box(
inset: 3mm,
$
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.
#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))
#solution([
$f(x) = min(2x , 1+x, 4)$, which looks like:
$f(x) = min(2x, 1+x, 4)$, which looks like:
#graphgrid({
import cetz.draw: *
@ -90,15 +84,12 @@ Draw a graph of the tropical polynomial $f(x) = x^2 #tp 1x #tp 4$. \
#problem()
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
#align(
center,
box(
#align(center, box(
inset: 3mm,
$
x^2 #tp 1x #tp 4 = (x #tp r)(x #tp s)
$,
),
)
))
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([
We (tropically) factor out $-2$ to get
#eqnbox($
#eqnbox(
$
f(x) = -2(x^2 #tp 2x #tp 10)
$)
$,
)
by the same process as the previous problem, we get
#eqnbox($
#eqnbox(
$
f(x) = -2(x #tp 2)(x #tp 8)
$)
$,
)
])
#v(1fr)
@ -236,11 +231,11 @@ Graph $f(x) = 1x^2 #tp 3x #tp 5$.
#problem()
Find a factorization of $f$ in the form $a(x #tp r)(x#tp s)$.
#solution(
eqnbox($
#solution(eqnbox(
$
f(x) = 1x^2 #tp 3 x #tp 5 = 1(x #tp 2)^2
$),
)
$,
))
#v(1fr)
@ -263,8 +258,7 @@ Graph $f(x) = 2x^2 #tp 4x #tp 4$.
#if_no_solutions(graphgrid(none))
#solution(
graphgrid({
#solution(graphgrid({
import cetz.draw: *
let step = 0.75
@ -278,8 +272,7 @@ Graph $f(x) = 2x^2 #tp 4x #tp 4$.
(7.5 * step, 4 * step),
stroke: 1mm + oblue,
)
}),
)
}))
#problem()
@ -325,7 +318,7 @@ Find a formula for $B$ in terms of $a$, $b$, and $c$. \
#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
- $min(r,s) = b-a$, and
- $min(r, s) = b-a$, and
- $r + s = c - a$
#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
$
accent(f, macron)(x)
&= a x^2 #tp ((a+c)/2)x #tp c \
&= a(x #tp (c-a)/2)^2
accent(f, macron)(x) & = a x^2 #tp ((a+c)/2)x #tp c \
& = a(x #tp (c-a)/2)^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 "../macros.typ": *
#import "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
= Tropical Cubic Polynomials
@ -131,15 +131,12 @@ Using the last three problems, find formulas for $B$ and $C$ in terms of $a$, $b
#problem()
What are the roots of the following polynomial?
#align(
center,
box(
#align(center, 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
$,
),
)
))
#solution([
We have
@ -169,9 +166,8 @@ Find a formula for each $C_i$ in terms of $c_0, c_1, ..., c_n$.
#solution([
$
A_j
&= 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) )
A_j & = 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) )
$
#v(2mm)

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
= The Signature-Cost Theorem
@ -7,9 +7,7 @@
First, we'll associate a _cost_ to each type of symmetry in orbifold notation:
#v(4mm)
#align(
center,
table(
#align(center, table(
stroke: (1pt, 1pt),
align: center,
columns: (auto, auto, auto, auto),
@ -22,8 +20,7 @@ First, we'll associate a _cost_ to each type of symmetry in orbifold notation:
[$(n-1) / n$],
[#sym.convolve`n`],
[$(n-1) / (2n)$],
),
)
))
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 "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
#show: handout.with(
title: [Warm-Up: Big-Tac-Toe],
@ -75,9 +75,7 @@ How does your strategy change? \
#if extra_boards {
pagebreak()
align(
center,
grid(
align(center, grid(
stroke: none,
align: center,
columns: (1fr, 1fr),
@ -85,6 +83,5 @@ How does your strategy change? \
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 "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
#show: handout.with(
@ -43,10 +43,7 @@ Now, consider the set of six-sided dice below:
- Die $E$: $0, 5, 5, 5, 5, 5$
On average, which die beats each of the others? Draw a diagram.
#solution(
align(
center,
cetz.canvas({
#solution(align(center, cetz.canvas({
import cetz.draw: *
let s = 0.8 // Scale
@ -95,9 +92,7 @@ On average, which die beats each of the others? Draw a diagram.
content(c, text(fill: white, size: t, [*C*]))
content(d, text(fill: white, size: t, [*D*]))
content(e, text(fill: white, size: t, [*E*]))
}),
),
)
})))
#v(1fr)

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
#show: handout.with(
title: [Warm-Up: What's an AST?],
@ -18,9 +18,7 @@ You may detach the string as you hang the painting, but it must be re-attached o
#v(2mm)
#align(
center,
cetz.canvas({
#align(center, cetz.canvas({
import cetz.draw: *
let s = 2.5
@ -69,8 +67,7 @@ You may detach the string as you hang the painting, but it must be re-attached o
)
circle((0.66 * s, 0.66 * s), radius: 0.07 * s, fill: white)
}),
)
}))
#solution([
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 "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
#show: handout.with(
title: [Warm-Up: Passing Balls],
@ -78,10 +78,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
let i = 1
for p in pts {
circle(
p,
radius: radius * s,
fill: if i == 1 {
circle(p, radius: radius * s, fill: if i == 1 {
ored
} else if i == 2 {
ogreen
@ -89,12 +86,9 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
oorange
} else if i == 4 {
oblue
} else { white },
)
} else { white })
content(
p,
text(
content(p, text(
fill: if i <= 4 {
white
} else {
@ -102,8 +96,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
},
size: t,
[*#i*],
),
)
))
i = i + 1
}
}),
@ -118,10 +111,7 @@ 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
circle(
p,
radius: radius * s,
fill: if l == 1 {
circle(p, radius: radius * s, fill: if l == 1 {
ored
} else if l == 2 {
ogreen
@ -129,12 +119,9 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
oorange
} else if l == 4 {
oblue
} else { white },
)
} else { white })
content(
p,
text(
content(p, text(
fill: if l <= 4 {
white
} else {
@ -142,8 +129,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
},
size: t,
[*#l*],
),
)
))
i = i + 1
}
}),
@ -158,10 +144,7 @@ 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
circle(
p,
radius: radius * s,
fill: if l == 1 {
circle(p, radius: radius * s, fill: if l == 1 {
oblue
} else if l == 2 {
oorange
@ -169,12 +152,9 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
ored
} else if l == 4 {
ogreen
} else { white },
)
} else { white })
content(
p,
text(
content(p, text(
fill: if l <= 4 {
white
} else {
@ -182,8 +162,7 @@ Participant 1 has a black ball. Which balls are held by participants 2, 3, and 4
},
size: t,
[*#l*],
),
)
))
i = i + 1
}
}),

View File

@ -1,5 +1,5 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
#show: handout.with(
title: [Warm-Up: What's an AST?],
@ -24,9 +24,7 @@ respecting the order of operations $[and, times, div, +, -]$.
#v(2mm)
#align(
center,
cetz.canvas({
#align(center, cetz.canvas({
import cetz.draw: *
// spell:off
@ -70,5 +68,4 @@ respecting the order of operations $[and, times, div, +, -]$.
line("bb", "bba")
line("bb", "bbb")
// spell:on
}),
)
}))

View File

@ -1,14 +1,12 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
#import "@preview/cetz:0.4.2"
#show: handout.with(
title: [Warm-Up: Wild Tic-Tac-Toe],
by: "Mark",
)
#let ttt = align(
center,
cetz.canvas({
#let ttt = align(center, cetz.canvas({
import cetz.draw: *
let s = 0.7 // scale
@ -17,8 +15,7 @@
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))
}),
)
}))
#problem()