home

String Worldsheet Topologies

A moving string sweeps out a two-dimensional worldsheet. String perturbation theory sums over worldsheet topologies, classified for connected orientable surfaces by genus gg and number of boundaries bb through the Euler characteristic χ=2−2g−b\chi = 2 - 2g - b: the sphere and torus are closed-string worldsheets, the disk and annulus open-string ones. Each surface is weighted by gs−χg_s^{-\chi} in the string coupling gsg_s, so every added handle costs a factor gs2g_s^2 and every added boundary a factor gsg_s.

Topology expansion: David Tong, String Theory, section 6.


String Worldsheet Topologies

Download

PNG PDF SVG

Code

string-worldsheet-topologies.typ (130 lines)
#import "@preview/cetz:0.5.3": canvas, draw
#let label-size = 12pt
#let paragraph-size = 14pt
#let heading-size = 16pt

#let card_body(title, body, caption) = block(
  width: 100%,
  inset: 12pt,
  radius: 8pt,
  fill: rgb("#cdd3da"),
  breakable: false,
)[
  #text(size: heading-size, weight: "bold", title)
  #v(8pt)
  // Measure unconstrained artwork before scaling, including content wider than its card.
  #layout(size => {
    let artwork = text(size: label-size, body)
    std.scale(size.width / measure(artwork).width * 100%, reflow: true, artwork)
  })
  #v(7pt)
  #text(size: paragraph-size, caption)
]

#let card-grid(columns: 2, ..cards) = layout(size => {
  let rows = cards
    .pos()
    .chunks(columns)
    .map(row => {
      let ratios = row.map(card => {
        let bounds = measure(text(size: label-size, card.at(1)))
        bounds.width / bounds.height
      })
      let available = size.width - 12pt * (row.len() - 1) - 24pt * row.len()
      grid(
        columns: ratios.map(ratio => 24pt + available * ratio / ratios.sum()),
        gutter: 12pt,
        ..row.map(args => card_body(..args)),
      )
    })
  stack(dir: ttb, spacing: 12pt, ..rows)
})

#let takeaway(body) = block(
  width: 100%,
  inset: 12pt,
  radius: 6pt,
  fill: rgb("#c6d8d2"),
  breakable: false,
  text(size: paragraph-size, body),
)

#set page(width: 780pt, height: auto, margin: 22pt, fill: none)
#set text(font: "Avenir Next", size: paragraph-size, fill: rgb("#19324f"))
#set par(leading: 0.55em)

#let worldsheet(kind) = canvas(
  length: if kind == "sphere" { 2.9cm } else { 3.35cm },
  {
    let (blue, teal, radius) = (rgb("#377db5"), rgb("#008580"), 1.65)
    if kind == "sphere" {
      draw.circle((0, 0), radius: radius, fill: rgb("#bfd0de"), stroke: blue + 1pt)
      // Equator: dashed back half, solid front half.
      for (start, stroke) in ((0deg, (paint: blue, dash: "dashed")), (180deg, blue + 1pt)) {
        draw.arc(
          (0, 0),
          radius: (radius, .5),
          start: start,
          stop: start + 180deg,
          anchor: "origin",
          stroke: stroke,
        )
      }
    } else if kind == "torus" {
      draw.boolean(
        draw.circle((0, 0), radius: (2, 1.3)),
        draw.circle((0, .1), radius: (.85, .4)),
        fill: rgb("#bfd0de"),
        stroke: blue + 1pt,
      )
      draw.arc(
        (0, -.1),
        radius: (.9, .6),
        start: 15deg,
        stop: 165deg,
        anchor: "origin",
        stroke: blue + 1pt,
      )
    } else {
      // Teal outlines are worldsheet boundaries.
      let style = (fill: rgb("#bfd5cc"), stroke: teal + 2pt)
      if kind == "disk" {
        draw.circle((0, 0), radius: radius, ..style)
        draw.content((0, 0), [one boundary])
      } else {
        draw.boolean(draw.circle((0, 0), radius: radius), draw.circle((0, 0), radius: .8), ..style)
      }
    }
    let (genus, boundaries) = (sphere: (0, 0), torus: (1, 0), disk: (0, 1), annulus: (0, 2)).at(
      kind,
    )
    draw.content((0, -2.15), $g=#genus, b=#boundaries, chi=#(2 - 2 * genus - boundaries)$)
  },
)

A moving string sweeps out a two-dimensional worldsheet. Perturbation theory sums over surface topologies; adding a handle or a boundary changes the contribution.
#v(14pt)
#card-grid(
  (
    [Closed sector: sphere],
    worldsheet("sphere"),
    [No handles and no boundaries. External closed-string insertions would be marked points on this surface; none are drawn here.],
  ),
  (
    [Closed sector: torus],
    worldsheet("torus"),
    [Add one handle to obtain the next closed-string loop topology. The central opening is a handle, not a boundary edge.],
  ),
  (
    [Open sector: disk],
    worldsheet("disk"),
    [The edge is a true worldsheet boundary, traced by open-string endpoints. The interior is a two-dimensional surface.],
  ),
  (
    [Open sector: annulus],
    worldsheet("annulus"),
    [Add a second boundary. The annulus is topologically a cylinder; its inner rim is a boundary, not a handle.],
  ),
)
#v(12pt)
#takeaway[*Count handles and boundary components:* $chi=2-2g-b$ for a connected orientable surface. $g$ is genus (handle count); $b$ counts boundaries. Shown are unpunctured oriented topologies; nonorientable surfaces are outside this comparison.]