---
date: '2024-11-27'
description: tangent tensors, coordinate changes, metrics, and the bundles that hold them
id: Tensor field
modified: 2026-09-30 09:03:35 GMT-04:00
tags:
  - math
title: Tensor field
created: '2024-11-27'
published: '2024-11-27'
pageLayout: default
slug: thoughts/Tensor-field
permalink: https://aarnphm.xyz/thoughts/Tensor-field.md
generator:
  quartz: v4.6.0
  hostedProvider: Cloudflare
  baseUrl: aarnphm.xyz
full: https://aarnphm.xyz/llms-full.txt
---
A tensor field assigns a tensor to each point of a [[thoughts/manifold]]. The tensor at a point acts on vectors and covectors belonging to that point. Smoothness specifies how these assignments vary across the manifold.

For a smooth manifold $M$, its tangent space $T_xM$ contains the possible velocities of curves through $x$. These spaces form the tangent bundle $TM$. Their [[thoughts/Tensor field#dual|dual spaces]] form the cotangent bundle $T^*M$.

> \[!definition\] Definition 1.
>
> A smooth tensor field of type $(p,q)$ is a smooth section
>
> $$
> T \in \Gamma\!\left((TM)^{\otimes p}\otimes(T^*M)^{\otimes q}\right).
> $$
>
> Thus $T(x)$ belongs to $(T_xM)^{\otimes p}\otimes(T_x^*M)^{\otimes q}$. A section chooses one element of each fiber: if $\pi$ is the bundle projection, then $\pi\circ T=\operatorname{id}_M$.

A scalar field has type $(0,0)$, a vector field has type $(1,0)$, and a one-form has type $(0,1)$. A metric has type $(0,2)$ because it takes two tangent vectors and returns a number. The same tensor-product construction works for a general [[thoughts/Tensor field#vector bundle|vector bundle]] $E$, with $E$ in place of $TM$. [Gualtieri, vector bundles and differential forms](https://www.math.utoronto.ca/mgualt/courses/18-1300/docs/18-1300-notes-vb-dr.pdf).

## via coordinate transitions

In coordinates $x^1,\ldots,x^n$, write a vector field and a one-form as

$$
X=X^i\frac{\partial}{\partial x^i},\qquad \alpha=\alpha_i\,dx^i.
$$

Repeated upper and lower indices are summed. Under a change to coordinates $y^a$, the chain rule gives

$$
\widetilde X^a=\frac{\partial y^a}{\partial x^i}X^i,
\qquad
\widetilde\alpha_a=\frac{\partial x^i}{\partial y^a}\alpha_i.
$$

Each upper tensor index receives the first kind of factor; each lower index receives the second. The factors cancel when a covector acts on a vector, so $\alpha_iX^i=\widetilde\alpha_a\widetilde X^a$. Coordinate descriptions must agree this way on overlaps to define one field. [Choquet-Bruhat, §§I.2–I.3](https://doi.org/10.1093/oso/9780199666454.003.0001).

For example, on the plane the radial field is

$$
X=x\frac{\partial}{\partial x}+y\frac{\partial}{\partial y}
 =r\frac{\partial}{\partial r}.
$$

Here $x=r\cos\theta$ and $y=r\sin\theta$, on a polar coordinate patch with $r>0$. Its Cartesian components are $(x,y)$; its polar components are $(r,0)$. Applied to $f=x^2+y^2=r^2$, both expressions give $X(f)=2r^2$.

See also \[@mcconnell2014applications;@schouten1951tensor\].

---

## appendix

### tensor product

For [[thoughts/Vector space|vector spaces]] $V$ and $W$ over a field $\mathbb F$, the tensor product $V\otimes W$ carries a bilinear map $(v,w)\mapsto v\otimes w$. Its defining property is that every bilinear map $b:V\times W\to Z$ factors through a unique linear map

$$
\widetilde b:V\otimes W\to Z,
\qquad \widetilde b(v\otimes w)=b(v,w).
$$

General tensors are finite sums of such products. With bases $\{e_i\}$ and $\{f_j\}$, the elements $e_i\otimes f_j$ form a basis, giving $\dim(V\otimes W)=\dim V\,\dim W$ in finite dimensions. [Conrad, tensor products and bases](https://math.stanford.edu/~conrad/diffgeomPage/handouts/tensorbasis.pdf).

### metric tensors

At each point $x$ of an $n$-dimensional smooth manifold $M$, the tangent space $T_xM$ is an $n$-dimensional vector space. A metric tensor is a smooth field of symmetric, nondegenerate bilinear forms

$$
g_x:T_xM\times T_xM\to\mathbb R.
$$

Symmetry means $g_x(u,v)=g_x(v,u)$; bilinearity means linearity in each argument. Nondegeneracy means

$$
\bigl[g_x(u,v)=0\text{ for every }v\in T_xM\bigr]\implies u=0.
$$

In coordinates, $g=g_{ij}\,dx^i\otimes dx^j$, where $(g_{ij})$ is symmetric and invertible. A **Riemannian** metric is positive definite, so $g_x(u,u)>0$ whenever $u\ne0$. A **pseudo-Riemannian** metric permits other signatures, counting the positive and negative directions of the form; its signature is constant on each connected component. [Meinrenken, §12](https://www.math.toronto.edu/mein/teaching/LectureNotes/rieall.pdf).

A **Lorentzian** metric has one negative direction and $n-1$ positive directions, or the reverse sign convention. For example, Minkowski space has

$$
g=-dt\otimes dt+dx\otimes dx+dy\otimes dy+dz\otimes dz.
$$

The nonzero vector $u=\partial_t+\partial_x$ satisfies $g(u,u)=0$. It is null and pairs nontrivially with $\partial_t$, since $g(u,\partial_t)=-1$. The metric is nondegenerate because its matrix has determinant $-1$. [Choquet-Bruhat, §I.5](https://doi.org/10.1093/oso/9780199666454.003.0001).

### vector bundle

A real vector bundle consists of a base space $X$, a total space $E$, and a continuous projection $\pi:E\to X$. Each [[thoughts/Tensor field#fiber|fiber]] $E_x=\pi^{-1}(\{x\})$ is a finite-dimensional real vector space.

> \[!tip\] compatibility condition
>
> Each point has an open neighborhood $U\subseteq X$ and a [[thoughts/homeomorphism]]
>
> $$
> \varphi:U\times\mathbb R^k\longrightarrow\pi^{-1}(U)
> $$
>
> such that $\pi(\varphi(x,v))=x$ and $v\mapsto\varphi(x,v)$ is a linear isomorphism onto $E_x$.

For a smooth vector bundle, the base and total space are smooth manifolds and the local trivializations are diffeomorphisms. On overlaps, changes of fiber coordinates have the form $v\mapsto A(x)v$ with $A(x)$ an invertible matrix depending smoothly on $x$. [Kapovitch, vector bundles](https://www.math.utoronto.ca/vtk/1300Fall2015/lecture-nov5.pdf).

![[thoughts/images/MobiusStrip.mp4]]

The Möbius strip illustrates a bundle over a circle. For the Möbius **line bundle**, extend each cross-section to an entire real line: gluing the ends reverses its coordinate, $(0,v)\sim(1,-v)$. The bounded strip shown in the video has interval fibers. [Hatcher, §1.1](https://pi.math.cornell.edu/~hatcher/VBKT/VB.pdf).

#### properties

- The pair $(U,\varphi)$ is a **local trivialization**.[^local-trivial]
- The dimension of $E_x$ is locally constant, hence constant on each connected component of $X$.
- If this dimension is $k$ throughout $X$, the bundle has **rank** $k$.
- The **trivial bundle** is $X\times\mathbb R^k\to X$, with projection $(x,v)\mapsto x$.

[^local-trivial]: The map identifies the bundle over $U$ with a product while preserving the base point and the vector-space operations in each fiber.

### dual

The dual bundle $E^*\to X$ has fiber

$$
E_x^*=\operatorname{Hom}(E_x,\mathbb R).
$$

Thus an element of a dual fiber is a linear function on the corresponding original fiber. Fiberwise evaluation pairs $E^*$ with $E$. Equivalently, $E^*$ is the Hom bundle whose fiber over $x$ is $\operatorname{Hom}(E_x,\mathbb R)$; this is the bundle of fiberwise linear maps from $E$ into the trivial line bundle $X\times\mathbb R$.

### fiber

The **fiber over** $x$ is the preimage $\pi^{-1}(\{x\})$. A **fiber bundle** is the whole structure $(E,B,\pi,F)$: total space $E$, base space $B$, continuous surjection $\pi:E\to B$, and typical fiber $F$.

Local triviality requires an open neighborhood $U$ of every base point and a homeomorphism $\varphi:\pi^{-1}(U)\to U\times F$ satisfying $\operatorname{proj}_1\circ\varphi=\pi$.[^annotation]

[^annotation]: Here $\pi^{-1}(U)$ carries the subspace topology and $U\times F$ the product topology.

<figure class="tikz" data-remark-tikz style=""><span class="tikz-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><annotation encoding="application/x-tex">"\\usepackage{tikz-cd}\n\\begin{document}\n\\begin{tikzcd}\n\\pi^{-1}(U) \\arrow[r, \"\\varphi\"] \\arrow[d, \"\\pi\"'] &#x26; U \\times F \\arrow[ld, \"proj_1\"] \\\\\nU &#x26;\n\\end{tikzcd}\n\\end{document}"</annotation></semantics></math></span><img src="data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxMDEuNjcyNzlwdCIgaGVpZ2h0PSI1MC4xMTIyN3B0IiB2aWV3Qm94PSItNzIgLTcyIDEwMS42NzI3OSA1MC4xMTIyNyI+PGcgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjEuNDMzNjA5MDA4Nzg5MDYsLTQ3LjIxMzg2NzE4NzQ5OTk5KSBzY2FsZSgxLC0xKSI+PGcgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlLXdpZHRoPSIwLjQiPiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTAuODM2NCwtMjEuMzk2NDEpIj4gPGcgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIiB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIHRyYW5zbGF0ZSgtMjEuNDMzNjA5MDA4Nzg5MDYsLTQ3LjIxMzg2NzE4NzQ5OTk5KSBzY2FsZSgtMSwtMSkiPjxnIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuODgyNTUzMTAwNTg1OTM3MywtODEuODY2NjgzOTU5OTYwOTIpIHNjYWxlKDEsLTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYuMjQ1NTEsMC4wKSI+IDxnIHN0cm9rZT0iIzAwMCIgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSB0cmFuc2xhdGUoLTAuODgyNTUzMTAwNTg1OTM3MywtODEuODY2NjgzOTU5OTYwOTIpIHNjYWxlKC0xLC0xKSI+PGcgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSI+IDx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii04MS44NjY2ODM5NTk5NjA5MiIgeD0iLTAuODgyNTUzMTAwNTg1OTM3MyIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjEwIiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj7PgDwvdGV4dD48dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItODUuNDk1NjA1NDY4NzQ5OTkiIHg9IjUuMTc2NTAwMzIwNDM0NTY5IiBmb250LWZhbWlseT0ic2VyaWYiIGZvbnQtc2l6ZT0iNyIgZmlsbD0iYmxhY2siPuKIkjwvdGV4dD48dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItODUuNDk1NjA1NDY4NzQ5OTkiIHg9IjExLjQyNjUyOTg4NDMzODM3NyIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjciIGZpbGw9ImJsYWNrIj4xPC90ZXh0Pjx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii04MS44NjY2ODM5NTk5NjA5MiIgeD0iMTUuOTEyNjQ1MzM5OTY1ODE3IiBmb250LWZhbWlseT0ic2VyaWYiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9ImJsYWNrIj4oPC90ZXh0Pjx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii04MS44NjY2ODM5NTk5NjA5MiIgeD0iMTkuODAxNTQ4MDA0MTUwMzg3IiBmb250LWZhbWlseT0ic2VyaWYiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9ImJsYWNrIiBmb250LXN0eWxlPSJpdGFsaWMiPlU8L3RleHQ+PHRleHQgYWxpZ25tZW50LWJhc2VsaW5lPSJiYXNlbGluZSIgeT0iLTgxLjg2NjY4Mzk1OTk2MDkyIiB4PSIyNy43MTk1Nzc3ODkzMDY2MzQiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSIxMCIgZmlsbD0iYmxhY2siPik8L3RleHQ+PC9nPiA8L2c+IDwvZz48L2c+IDwvZz4gPC9nPjxnIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjEuOTUzODI2OTA0Mjk2ODYsLTgxLjg2NjY4Mzk1OTk2MDkyKSBzY2FsZSgxLC0xKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzLjk3OTgxLDAuMCkiPiA8ZyBzdHJva2U9IiMwMDAiIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkgdHJhbnNsYXRlKDYxLjk1MzgyNjkwNDI5Njg2LC04MS44NjY2ODM5NTk5NjA5Mikgc2NhbGUoLTEsLTEpIj48ZyBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIj4gPHRleHQgYWxpZ25tZW50LWJhc2VsaW5lPSJiYXNlbGluZSIgeT0iLTgxLjg2NjY4Mzk1OTk2MDkyIiB4PSI2MS45NTM4MjY5MDQyOTY4NiIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjEwIiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj5VPC90ZXh0Pjx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii04MS44NjY2ODM5NTk5NjA5MiIgeD0iNzIuMDk0MDI0NjU4MjAzMTEiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSIxMCIgZmlsbD0iYmxhY2siPsOXPC90ZXh0Pjx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii04MS44NjY2ODM5NTk5NjA5MiIgeD0iODIuMDkzOTk3OTU1MzIyMjUiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSIxMCIgZmlsbD0iYmxhY2siIGZvbnQtc3R5bGU9Iml0YWxpYyI+RjwvdGV4dD48L2c+IDwvZz4gPC9nPjwvZz4gPC9nPiA8L2c+PGcgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC44ODI1NTMxMDA1ODU5MzczLC00Ny4yMTM4NjcxODc0OTk5OSkgc2NhbGUoMSwtMSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjk1OTAxLDAuMCkiPiA8ZyBzdHJva2U9IiMwMDAiIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkgdHJhbnNsYXRlKC0wLjg4MjU1MzEwMDU4NTkzNzMsLTQ3LjIxMzg2NzE4NzQ5OTk5KSBzY2FsZSgtMSwtMSkiPjxnIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiPiA8dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItNDcuMjEzODY3MTg3NDk5OTkiIHg9Ii0wLjg4MjU1MzEwMDU4NTkzNzMiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSIxMCIgZmlsbD0iYmxhY2siIGZvbnQtc3R5bGU9Iml0YWxpYyI+VTwvdGV4dD48L2c+IDwvZz4gPC9nPjwvZz4gPC9nPiA8L2c+PGcgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MS45NTM4MjY5MDQyOTY4NiwtNDcuMjEzODY3MTg3NDk5OTkpIHNjYWxlKDEsLTEpIj48L2c+PC9nPjwvZz4gPC9nPiA8ZyBzdHJva2Utd2lkdGg9IjAuMzk5OTgiPiA8cGF0aCBkPSIgTSAtOS41MzQyOSAxNS43NTY0MSBMIDEzLjY2NTczIDE1Ljc1NjQxICAiIGZpbGw9Im5vbmUiPjwvcGF0aD4gPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTMuODY1NywxNS43NTY0MSkiPiA8ZyBzdHJva2UtZGFzaGFycmF5PSJub25lIiBzdHJva2UtZGFzaG9mZnNldD0iMC4wIj4gPGcgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4gPGcgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+IDxwYXRoIGQ9IiBNIC0yLjA3OTg4IDIuMzk5ODYgQyAtMS42OTk4OSAwLjk1OTkyIC0wLjg1MzEzIDAuMjc5OTggMC4wIDAuMCBDIC0wLjg1MzEzIC0wLjI3OTk4IC0xLjY5OTg5IC0wLjk1OTkyIC0yLjA3OTg4IC0yLjM5OTg2ICAiIGZpbGw9Im5vbmUiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz4gIDwvZz4gPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMzY0MTcsMTkuNDcwMjUpIj4gPGcgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIiB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIHRyYW5zbGF0ZSgtMjEuNDMzNjA5MDA4Nzg5MDYsLTQ3LjIxMzg2NzE4NzQ5OTk5KSBzY2FsZSgtMSwtMSkiPjxnIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiPiA8dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItNDcuMjEzODY3MTg3NDk5OTkiIHg9Ii0yMS40MzM2MDkwMDg3ODkwNiIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjciIGZpbGw9ImJsYWNrIiBmb250LXN0eWxlPSJpdGFsaWMiPs+GPC90ZXh0PjwvZz4gPC9nPiA8L2c+PC9nPiA8L2c+IDwvZz4gPGcgc3Ryb2tlLXdpZHRoPSIwLjM5OTk4Ij4gPHBhdGggZD0iIE0gLTMwLjI4NTM0IDYuODk2NjggTCAtMzAuMjg1MzQgLTEwLjMwMzQgICIgZmlsbD0ibm9uZSI+PC9wYXRoPiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgwLjAsLTEuMCwxLjAsMC4wLC0zMC4yODUzNCwtMTAuNTAzMzkpIj4gPGcgc3Ryb2tlLWRhc2hhcnJheT0ibm9uZSIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAuMCI+IDxnIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+IDxnIHN0cm9rZS1saW5lam9pbj0icm91bmQiPiA8cGF0aCBkPSIgTSAtMi4wNzk4OCAyLjM5OTg2IEMgLTEuNjk5ODkgMC45NTk5MiAtMC44NTMxMyAwLjI3OTk4IDAuMCAwLjAgQyAtMC44NTMxMyAtMC4yNzk5OCAtMS42OTk4OSAtMC45NTk5MiAtMi4wNzk4OCAtMi4zOTk4NiAgIiBmaWxsPSJub25lIj48L3BhdGg+IDwvZz4gPC9nPiA8L2c+ICA8L2c+IDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zNy41NjU1NSwtMy40MTAyOCkiPiA8ZyBzdHJva2U9IiMwMDAiIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkgdHJhbnNsYXRlKC0yMS40MzM2MDkwMDg3ODkwNiwtNDcuMjEzODY3MTg3NDk5OTkpIHNjYWxlKC0xLC0xKSI+PGcgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSI+IDx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii00Ny4yMTM4NjcxODc0OTk5OSIgeD0iLTIxLjQzMzYwOTAwODc4OTA2IiBmb250LWZhbWlseT0ic2VyaWYiIGZvbnQtc2l6ZT0iNyIgZmlsbD0iYmxhY2siIGZvbnQtc3R5bGU9Iml0YWxpYyI+z4A8L3RleHQ+PC9nPiA8L2c+IDwvZz48L2c+IDwvZz4gPC9nPiA8ZyBzdHJva2Utd2lkdGg9IjAuMzk5OTgiPiA8cGF0aCBkPSIgTSAxOS41MTE2OSA4LjU2MzM3IEwgLTIxLjQ3MDU4IC0xNC4wMzk2ICAiIGZpbGw9Im5vbmUiPjwvcGF0aD4gPGcgdHJhbnNmb3JtPSJtYXRyaXgoLTAuODc1NjMsLTAuNDgyOTMsMC40ODI5MywtMC44NzU2MywtMjEuNjQ1NjgsLTE0LjEzNjE3KSI+IDxnIHN0cm9rZS1kYXNoYXJyYXk9Im5vbmUiIHN0cm9rZS1kYXNob2Zmc2V0PSIwLjAiPiA8ZyBzdHJva2UtbGluZWNhcD0icm91bmQiPiA8ZyBzdHJva2UtbGluZWpvaW49InJvdW5kIj4gPHBhdGggZD0iIE0gLTIuMDc5ODggMi4zOTk4NiBDIC0xLjY5OTg5IDAuOTU5OTIgLTAuODUzMTMgMC4yNzk5OCAwLjAgMC4wIEMgLTAuODUzMTMgLTAuMjc5OTggLTEuNjk5ODkgLTAuOTU5OTIgLTIuMDc5ODggLTIuMzk5ODYgICIgZmlsbD0ibm9uZSI+PC9wYXRoPiA8L2c+IDwvZz4gPC9nPiAgPC9nPiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLjE5ODIxLC05LjgxOTM3KSI+IDxnIHN0cm9rZT0iIzAwMCIgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSB0cmFuc2xhdGUoLTIxLjQzMzYwOTAwODc4OTA2LC00Ny4yMTM4NjcxODc0OTk5OSkgc2NhbGUoLTEsLTEpIj48ZyBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIj4gPHRleHQgYWxpZ25tZW50LWJhc2VsaW5lPSJiYXNlbGluZSIgeT0iLTQ3LjIxMzg2NzE4NzQ5OTk5IiB4PSItMjEuNDMzNjA5MDA4Nzg5MDYiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSI3IiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj5wcjwvdGV4dD48dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItNDcuMjEzODY3MTg3NDk5OTkiIHg9Ii0xMy4zODI5ODUxMTUwNTEyNjYiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSI3IiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj5vajwvdGV4dD48dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItNDYuMjEzODY3MTg3NDk5OTkiIHg9Ii02LjEyNjY4NDE4ODg0Mjc3MiIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjUiIGZpbGw9ImJsYWNrIj4xPC90ZXh0PjwvZz4gPC9nPiA8L2c+PC9nPiA8L2c+IDwvZz4gPC9nPiA8L2c+IDwvZz48L3N2Zz4=" alt="tikz diagram" loading="lazy" decoding="async"><figcaption><em>source code</em><button class="source-code-button" aria-label="copy source code for this tikz graph" title="copy source code for this tikz graph"><svg class="source-icon" xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 -4 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#code-icon"></use></svg><svg class="check-icon" xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 -4 16 16" fill="currentColor" stroke="none" stroke-width="0" stroke-linecap="round" stroke-linejoin="round"><use href="#github-check"></use></svg></button></figcaption></figure>

Each pair $(U,\varphi)$ is one local trivialization. A collection covering $B$ is a bundle atlas. Every fiber is homeomorphic to $F$.[^true] One often writes the bundle as

$$
F\to E\xrightarrow{\pi}B.
$$

[^true]: Restricting $\varphi$ to the fiber over $x\in U$ gives a homeomorphism onto $\{x\}\times F$.

#### bundle map

For bundles $\pi_E:E\to M$ and $\pi_F:F\to N$, a bundle map consists of continuous maps $\varphi:E\to F$ and $f:M\to N$ satisfying

$$
\pi_F\circ\varphi=f\circ\pi_E.
$$

This sends the fiber over $x$ into the fiber over $f(x)$. A vector-bundle map also acts linearly on each fiber; a smooth bundle map is smooth.

> <figure class="tikz" data-remark-tikz style=""><span class="tikz-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><annotation encoding="application/x-tex">"\\usepackage{tikz-cd}\n\\begin{document}\n\\begin{tikzcd}\nE \\arrow[r, \"\\varphi\"] \\arrow[d, \"\\pi_E\"'] &#x26; F \\arrow[d, \"\\pi_F\"] \\\\\nM \\arrow[r, \"f\"'] &#x26; N\n\\end{tikzcd}\n\\end{document}"</annotation></semantics></math></span><img src="data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI3Mi40Mjk2OXB0IiBoZWlnaHQ9IjUxLjc2MTAzcHQiIHZpZXdCb3g9Ii03MiAtNzIgNzIuNDI5NjkgNTEuNzYxMDMiPjxnIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM2LjQyODQyMTAyMDUwNzgwNSwtNDguMjI5NzUxNTg2OTE0MDUpIHNjYWxlKDEsLTEpIj48ZyBzdHJva2U9IiMwMDAiIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2Utd2lkdGg9IjAuNCI+IDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMC41NjkzOCwtMTkuNDkzMDYpIj4gPGcgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIiB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIHRyYW5zbGF0ZSgtMzYuNDI4NDIxMDIwNTA3ODA1LC00OC4yMjk3NTE1ODY5MTQwNSkgc2NhbGUoLTEsLTEpIj48ZyBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi43MjcwNTA3ODEyNDk5OTMsLTgwLjM4MjU2ODM1OTM3NDk5KSBzY2FsZSgxLC0xKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMuOTc5MTYsMC4wKSI+IDxnIHN0cm9rZT0iIzAwMCIgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSB0cmFuc2xhdGUoLTI2LjcyNzA1MDc4MTI0OTk5MywtODAuMzgyNTY4MzU5Mzc0OTkpIHNjYWxlKC0xLC0xKSI+PGcgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSI+IDx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii04MC4zODI1NjgzNTkzNzQ5OSIgeD0iLTI2LjcyNzA1MDc4MTI0OTk5MyIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjEwIiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj5FPC90ZXh0PjwvZz4gPC9nPiA8L2c+PC9nPiA8L2c+IDwvZz48ZyBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1Ljg0MjMxNTY3MzgyODEyMSwtODAuMzgyNTY4MzU5Mzc0OTkpIHNjYWxlKDEsLTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMy45MDk3MywwLjApIj4gPGcgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIiB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIHRyYW5zbGF0ZSgxNS44NDIzMTU2NzM4MjgxMjEsLTgwLjM4MjU2ODM1OTM3NDk5KSBzY2FsZSgtMSwtMSkiPjxnIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiPiA8dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItODAuMzgyNTY4MzU5Mzc0OTkiIHg9IjE1Ljg0MjMxNTY3MzgyODEyMSIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjEwIiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj5GPC90ZXh0PjwvZz4gPC9nPiA8L2c+PC9nPiA8L2c+IDwvZz48ZyBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi43MjcwNTA3ODEyNDk5OTMsLTQ4LjIyOTc1MTU4NjkxNDA1KSBzY2FsZSgxLC0xKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUuMzk1ODMsMC4wKSI+IDxnIHN0cm9rZT0iIzAwMCIgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSB0cmFuc2xhdGUoLTI2LjcyNzA1MDc4MTI0OTk5MywtNDguMjI5NzUxNTg2OTE0MDUpIHNjYWxlKC0xLC0xKSI+PGcgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSI+IDx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii00OC4yMjk3NTE1ODY5MTQwNSIgeD0iLTI2LjcyNzA1MDc4MTI0OTk5MyIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjEwIiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj5NPC90ZXh0PjwvZz4gPC9nPiA8L2c+PC9nPiA8L2c+IDwvZz48ZyBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1Ljg0MjMxNTY3MzgyODEyMSwtNDguMjI5NzUxNTg2OTE0MDUpIHNjYWxlKDEsLTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNC41NjI0OCwwLjApIj4gPGcgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIiB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIHRyYW5zbGF0ZSgxNS44NDIzMTU2NzM4MjgxMjEsLTQ4LjIyOTc1MTU4NjkxNDA1KSBzY2FsZSgtMSwtMSkiPjxnIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiPiA8dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItNDguMjI5NzUxNTg2OTE0MDUiIHg9IjE1Ljg0MjMxNTY3MzgyODEyMSIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjEwIiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj5OPC90ZXh0PjwvZz4gPC9nPiA8L2c+PC9nPiA8L2c+IDwvZz48L2c+PC9nPiA8L2c+IDxnIHN0cm9rZS13aWR0aD0iMC4zOTk5OCI+IDxwYXRoIGQ9IiBNIC0xMi4zODMzMiAxNS4xNTk3NiBMIDEyLjg4NjEyIDE1LjE1OTc2ICAiIGZpbGw9Im5vbmUiPjwvcGF0aD4gPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTMuMDg2MSwxNS4xNTk3NikiPiA8ZyBzdHJva2UtZGFzaGFycmF5PSJub25lIiBzdHJva2UtZGFzaG9mZnNldD0iMC4wIj4gPGcgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4gPGcgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+IDxwYXRoIGQ9IiBNIC0yLjA3OTg4IDIuMzk5ODYgQyAtMS42OTk4OSAwLjk1OTkyIC0wLjg1MzEzIDAuMjc5OTggMC4wIDAuMCBDIC0wLjg1MzEzIC0wLjI3OTk4IC0xLjY5OTg5IC0wLjk1OTkyIC0yLjA3OTg4IC0yLjM5OTg2ICAiIGZpbGw9Im5vbmUiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz4gIDwvZz4gPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIuMTc4NDgsMTguODczNikiPiA8ZyBzdHJva2U9IiMwMDAiIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkgdHJhbnNsYXRlKC0zNi40Mjg0MjEwMjA1MDc4MDUsLTQ4LjIyOTc1MTU4NjkxNDA1KSBzY2FsZSgtMSwtMSkiPjxnIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiPiA8dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItNDguMjI5NzUxNTg2OTE0MDUiIHg9Ii0zNi40Mjg0MjEwMjA1MDc4MDUiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSI3IiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj7PhjwvdGV4dD48L2c+IDwvZz4gPC9nPjwvZz4gPC9nPiA8L2c+IDxnIHN0cm9rZS13aWR0aD0iMC4zOTk5OCI+IDxwYXRoIGQ9IiBNIC0yMC44NjgwMSA4LjgwMDAzIEwgLTIwLjg2ODAxIC04LjQwMDA1ICAiIGZpbGw9Im5vbmUiPjwvcGF0aD4gPGcgdHJhbnNmb3JtPSJtYXRyaXgoMC4wLC0xLjAsMS4wLDAuMCwtMjAuODY4MDEsLTguNjAwMDQpIj4gPGcgc3Ryb2tlLWRhc2hhcnJheT0ibm9uZSIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAuMCI+IDxnIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+IDxnIHN0cm9rZS1saW5lam9pbj0icm91bmQiPiA8cGF0aCBkPSIgTSAtMi4wNzk4OCAyLjM5OTg2IEMgLTEuNjk5ODkgMC45NTk5MiAtMC44NTMxMyAwLjI3OTk4IDAuMCAwLjAgQyAtMC44NTMxMyAtMC4yNzk5OCAtMS42OTk4OSAtMC45NTk5MiAtMi4wNzk4OCAtMi4zOTk4NiAgIiBmaWxsPSJub25lIj48L3BhdGg+IDwvZz4gPC9nPiA8L2c+ICA8L2c+IDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMy42ODg4MSwtMS4wMDQxNSkiPiA8ZyBzdHJva2U9IiMwMDAiIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkgdHJhbnNsYXRlKC0zNi40Mjg0MjEwMjA1MDc4MDUsLTQ4LjIyOTc1MTU4NjkxNDA1KSBzY2FsZSgtMSwtMSkiPjxnIGZpbGw9IiMwMDAiPiA8ZyBzdHJva2U9Im5vbmUiPiA8dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItNDguMjI5NzUxNTg2OTE0MDUiIHg9Ii0zNi40Mjg0MjEwMjA1MDc4MDUiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSI3IiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj7PgDwvdGV4dD48dGV4dCBhbGlnbm1lbnQtYmFzZWxpbmU9ImJhc2VsaW5lIiB5PSItNDcuMjI0MTgyMTI4OTA2MjQiIHg9Ii0zMS43NTIxMDU3MTI4OTA2MTgiIGZvbnQtZmFtaWx5PSJzZXJpZiIgZm9udC1zaXplPSI1IiBmaWxsPSJibGFjayIgZm9udC1zdHlsZT0iaXRhbGljIj5FPC90ZXh0PjwvZz4gPC9nPiA8L2c+PC9nPiA8L2c+IDwvZz4gPGcgc3Ryb2tlLXdpZHRoPSIwLjM5OTk4Ij4gPHBhdGggZD0iIE0gMjEuNzAxMzUgOC44MDAwMyBMIDIxLjcwMTM1IC04LjQwMDA1ICAiIGZpbGw9Im5vbmUiPjwvcGF0aD4gPGcgdHJhbnNmb3JtPSJtYXRyaXgoMC4wLC0xLjAsMS4wLDAuMCwyMS43MDEzNSwtOC42MDAwNCkiPiA8ZyBzdHJva2UtZGFzaGFycmF5PSJub25lIiBzdHJva2UtZGFzaG9mZnNldD0iMC4wIj4gPGcgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4gPGcgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+IDxwYXRoIGQ9IiBNIC0yLjA3OTg4IDIuMzk5ODYgQyAtMS42OTk4OSAwLjk1OTkyIC0wLjg1MzEzIDAuMjc5OTggMC4wIDAuMCBDIC0wLjg1MzEzIC0wLjI3OTk4IC0xLjY5OTg5IC0wLjk1OTkyIC0yLjA3OTg4IC0yLjM5OTg2ICAiIGZpbGw9Im5vbmUiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz4gIDwvZz4gPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQuMDU0MTEsLTEuMDA0MTUpIj4gPGcgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIiB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIHRyYW5zbGF0ZSgtMzYuNDI4NDIxMDIwNTA3ODA1LC00OC4yMjk3NTE1ODY5MTQwNSkgc2NhbGUoLTEsLTEpIj48ZyBmaWxsPSIjMDAwIj4gPGcgc3Ryb2tlPSJub25lIj4gPHRleHQgYWxpZ25tZW50LWJhc2VsaW5lPSJiYXNlbGluZSIgeT0iLTQ4LjIyOTc1MTU4NjkxNDA1IiB4PSItMzYuNDI4NDIxMDIwNTA3ODA1IiBmb250LWZhbWlseT0ic2VyaWYiIGZvbnQtc2l6ZT0iNyIgZmlsbD0iYmxhY2siIGZvbnQtc3R5bGU9Iml0YWxpYyI+z4A8L3RleHQ+PHRleHQgYWxpZ25tZW50LWJhc2VsaW5lPSJiYXNlbGluZSIgeT0iLTQ3LjIyNDE4MjEyODkwNjI0IiB4PSItMzEuNzUyMTA1NzEyODkwNjE4IiBmb250LWZhbWlseT0ic2VyaWYiIGZvbnQtc2l6ZT0iNSIgZmlsbD0iYmxhY2siIGZvbnQtc3R5bGU9Iml0YWxpYyI+RjwvdGV4dD48L2c+IDwvZz4gPC9nPjwvZz4gPC9nPiA8L2c+IDxnIHN0cm9rZS13aWR0aD0iMC4zOTk5OCI+IDxwYXRoIGQ9IiBNIC0xMC45NjY2NCAtMTYuOTkzMDYgTCAxMi4yMzMzNyAtMTYuOTkzMDYgICIgZmlsbD0ibm9uZSI+PC9wYXRoPiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMi40MzMzNSwtMTYuOTkzMDYpIj4gPGcgc3Ryb2tlLWRhc2hhcnJheT0ibm9uZSIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAuMCI+IDxnIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+IDxnIHN0cm9rZS1saW5lam9pbj0icm91bmQiPiA8cGF0aCBkPSIgTSAtMi4wNzk4OCAyLjM5OTg2IEMgLTEuNjk5ODkgMC45NTk5MiAtMC44NTMxMyAwLjI3OTk4IDAuMCAwLjAgQyAtMC44NTMxMyAtMC4yNzk5OCAtMS42OTk4OSAtMC45NTk5MiAtMi4wNzk4OCAtMi4zOTk4NiAgIiBmaWxsPSJub25lIj48L3BhdGg+IDwvZz4gPC9nPiA8L2c+ICA8L2c+IDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xLjUwODcsLTI0LjIwNjkxKSI+IDxnIHN0cm9rZT0iIzAwMCIgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSB0cmFuc2xhdGUoLTM2LjQyODQyMTAyMDUwNzgwNSwtNDguMjI5NzUxNTg2OTE0MDUpIHNjYWxlKC0xLC0xKSI+PGcgZmlsbD0iIzAwMCI+IDxnIHN0cm9rZT0ibm9uZSI+IDx0ZXh0IGFsaWdubWVudC1iYXNlbGluZT0iYmFzZWxpbmUiIHk9Ii00OC4yMjk3NTE1ODY5MTQwNSIgeD0iLTM2LjQyODQyMTAyMDUwNzgwNSIgZm9udC1mYW1pbHk9InNlcmlmIiBmb250LXNpemU9IjciIGZpbGw9ImJsYWNrIiBmb250LXN0eWxlPSJpdGFsaWMiPmY8L3RleHQ+PC9nPiA8L2c+IDwvZz48L2c+IDwvZz4gPC9nPiA8L2c+IDwvZz4gPC9nPjwvc3ZnPg==" alt="tikz diagram" loading="lazy" decoding="async"><figcaption><em>source code</em><button class="source-code-button" aria-label="copy source code for this tikz graph" title="copy source code for this tikz graph"><svg class="source-icon" xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 -4 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#code-icon"></use></svg><svg class="check-icon" xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 -4 16 16" fill="currentColor" stroke="none" stroke-width="0" stroke-linecap="round" stroke-linejoin="round"><use href="#github-check"></use></svg></button></figcaption></figure>

