Drawing extensive form games with fletcher
This is a short note on how to draw extensive form games in Typst documents. In LaTeX one can use specialized such as xgames, egameps, istgame, and likely many others.
egameps was written by Martin J. Osborne. If you like extensive form games in “A Course in Game Theory” by Martin J. Osborne and Ariel Rubinstein, then you can get exactly the same look using egameps. The main drawback of this package is use of PSTricks. That implies that using modern LaTeX implementations that generate PDF files may be problematic.
On the other hand, istgame and xgames use TikZ and can generate beutiful game trees in PDF files generated in XeLaTeX or luaLaTeX. But you have to use LaTeX to get those to work.
If you prefer Typst as your typesetting engine, you have to use antother solution. The simplest way to draw game trees is to use fletcher as drawing engine. A few simple examples of using fletcher to draw extensive form games in Typst.
Some helper definitions used to highlight branches or put labels inside game-tree branch with short command.
#let pi-thick-red-arrow = (stroke: 2pt + red, marks: (none, (inherit: ">", size: 1.5)))#let pi-thick-blue-arrow = (stroke: 2pt + blue, marks: (none, (inherit: ">", size: 1.5)))#let pi-label-inside = (label-fill: true, label-anchor: "center")A simple extensive form game in Typst.
#diagram( spacing: (20mm, 10mm), node((0,0), [*1*]), edge((-1,1), "->", label: [A]), edge((1,1), "->", label: [B]), node((-1,1),[*2*]), edge((-1.75,2), "->", label: [C]), edge((-0.25,2), "->", label: [D]), node((-1.75,2), [(3, 8)]), node((-0.25,2), [(8, 3)]), node((1,1), [*2*]), edge((0.25, 2), "->", [E]), edge((1.75, 2), "->", [F]), node((0.25,2), [(5, 5)]), node((1.75,2), [*1*]), edge((1.25,3), "->", label: [G]), edge((2.25, 3), "->", label: [H]), node((1.25,3), [(2, 10)]), node((2.25, 3), [(1, 0)]))
Cho-Kreps signalling game is a bit more complex. In this example, I use decission names abbreviated from beer-quiche story, but in Polish. “Los” is actually fate, not nature. I use “piwo” (beer) and “kefir” (instead of quiche) as signals. And final choice is to be “miły” (nice) or “niemiły” (¬nice).
#diagram( spacing: (10mm, 10mm), node((0,0), [*Los*]), edge((-2,0), "->", label: [$p$]), edge((2,0), "->", label: [$1-p$]), node((-2,0), [*S*]), edge((-2,-1), "->", label: [K]), edge((-2,1), "->", label: [P]), node((2,0), [*N*]), edge((2,-1), "->", label: [K]), edge((2,1), "->", label: [P]), node((-2,-1), [*B*]), edge((-3,-2), "->", label: [M], ..pi-label-inside ), edge((-1,-2), "->", label: [$not$M], ..pi-label-inside), edge((2,-1), "dashed"), node((-2,1), [*B*]), edge((-3,2), "->", label: [M], ..pi-label-inside), edge((-1,2), "->", label: [$not$M], ..pi-label-inside), edge((2,1), "dashed"), node((2,-1), [*B*]), edge((3,-2), "->", label: [M],..pi-label-inside), edge((1,-2), "->", label: [$not$M],..pi-label-inside), node((2,1), [*B*]), edge((3,2), "->", label: [M], ..pi-label-inside), edge((1,2), "->", label: [$not$M], ..pi-label-inside), node((-3,-2), [(3, 0)]), node((-1,-2), [(1, 1)]), node((1,-2), [(0, 0)]), node((3,-2), [(2, 1)]), node((-3,2), [(2, 0)]), node((-1,2), [(0, 1)]), node((1,2), [(1, 0)]), node((3,2), [(3, 1)]),)
With helpers defined before, it is possible to quickly highlight some branches with color.
#diagram( spacing: (6mm, 15mm), node((0,0), text(fill: blue)[*A*]), edge((-2,1), ..pi-thick-blue-arrow, label: [K]), edge((2,1), "->", label: [T], ), node((-2,1),text(fill: red)[*B*]), edge((-3,2), ..pi-thick-red-arrow, label: [K]), edge((-1,2), "->", label: [T]), node((2,1), text(fill: red)[*B*]), edge((1,2), "->", label: [K]), edge((3,2), ..pi-thick-red-arrow, label: [T]), node((-3,2), [(3, 1)]), node((-1,2), [(0, 0)]), node((3,2), [(1, 3)]), node((1,2), [(0, 0)]),)