diff --git a/Cargo.toml b/Cargo.toml
index fe2526e0d30554ee108fcee703063597b739bdeb..b2797fda681e9ce44274aa1b1eaa0c9c5f00bbb5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -50,6 +50,7 @@ fs = []
 
 [package.metadata.docs.rs]
 features = ["kzg", "aplonk"]
+rustdoc-args = [ "--html-in-header", "katex.html" ]
 
 [[example]]
 name = "kzg"
diff --git a/Makefile b/Makefile
index e0a254ab5a3f406716e5ea1e52a1bf737644c623..bdc911171d3e5f7c70f357fda95fb8ad75d632d7 100644
--- a/Makefile
+++ b/Makefile
@@ -63,7 +63,7 @@ show:
 
 .PHONY: doc
 doc:
-	cargo doc --document-private-items --no-deps --open
+	RUSTDOCFLAGS="--html-in-header katex.html" cargo doc --no-deps --open
 
 .PHONY: build-examples
 build-examples:
diff --git a/katex.html b/katex.html
new file mode 100644
index 0000000000000000000000000000000000000000..32ac35a411428d1bcf1914b639299df9f86e448c
--- /dev/null
+++ b/katex.html
@@ -0,0 +1,15 @@
+<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.css" integrity="sha384-9eLZqc9ds8eNjO3TmqPeYcDj8n+Qfa4nuSiGYa6DjLNcv9BtN69ZIulL9+8CqC9Y" crossorigin="anonymous">
+<script src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.js"                  integrity="sha384-K3vbOmF2BtaVai+Qk37uypf7VrgBubhQreNQe9aGsz9lB63dIFiQVlJbr92dw2Lx" crossorigin="anonymous"></script>
+<script src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/contrib/auto-render.min.js"    integrity="sha384-kmZOZB5ObwgQnS/DuDg6TScgOiWWBiVt0plIRkZCmE6rDZGrEOQeHM5PcHi+nyqe" crossorigin="anonymous"></script>
+<script>
+    document.addEventListener("DOMContentLoaded", function() {
+        renderMathInElement(document.body, {
+            delimiters: [
+                {left: "$$", right: "$$", display: true},
+                {left: "\\(", right: "\\)", display: false},
+                {left: "$", right: "$", display: false},
+                {left: "\\[", right: "\\]", display: true}
+            ]
+        });
+    });
+</script>
diff --git a/src/fec.rs b/src/fec.rs
index 2329a21e44cb223b151e7aae8bc53233ca1d1366..951493695d54db313149b7f9664eedbc11dc9364 100644
--- a/src/fec.rs
+++ b/src/fec.rs
@@ -17,7 +17,7 @@ pub struct Shard<F: PrimeField> {
     ///
     /// this effectively allows support for _recoding_.
     ///
-    /// If we denote the $k$ source shards by $(s_i)_{0 \le i \lt k}$, the linear combination by $k$
+    /// If we denote the $k$ source shards by $(s\_i)\_\{0 \le i \lt k\}$, the linear combination by $k$
     /// coefficients $(\alpha_i)_{0 \le i \lt k}$ and $s$ the shard itself, then
     ///
     /// $$ s = \sum\limits_{i = 0}^{k - 1} \alpha_i s_i$$
@@ -72,8 +72,8 @@ impl<F: PrimeField> Shard<F> {
 /// > returns [`None`] if the number of shards is not the same as the number of
 /// > coefficients or if no shards are provided.
 ///
-/// if the shards are the $(s_i)_{1 \le i \le n}$ and the coefficients the
-/// $(\alpha_i)_{0 \le i \le n}$, then the output will be
+/// if the shards are the $(s \_i)\_\{1 \le i \le n\}$ and the coefficients the
+/// $(\alpha\_i)\_\{0 \le i \le n\}$, then the output will be
 ///
 /// $$ \sum\limits_{i = 1}^{n} \alpha_i s_i$$
 pub fn recode_with_coeffs<F: PrimeField>(shards: &[Shard<F>], coeffs: &[F]) -> Option<Shard<F>> {