diff --git a/doc/src/learn.md b/doc/src/learn.md
index d3b09af8d0011019928dfd2cc659a6a3b22a4928..8628cb59b7367280d965c1bbe3fb86ae1d1a104f 100644
--- a/doc/src/learn.md
+++ b/doc/src/learn.md
@@ -4,6 +4,8 @@ This chapter describes how
 the [global parameters](./likelihood.md#global)
 space is explored to maximize aphid likelihood.
 
+## Heuristic starting point { #init }
+
 ## Reparametrization { #transform }
 
 Exploring a constrained space is more difficult
diff --git a/doc/src/likelihood.md b/doc/src/likelihood.md
index 7dfd6a999ec0343a1939722e9596707b8463c546..369693431afda2fa7761dc5697749e166e3eb906 100644
--- a/doc/src/likelihood.md
+++ b/doc/src/likelihood.md
@@ -303,10 +303,10 @@ then only the scenarios whose topology match \\(T_g\\)
 are taken into account:
 
 \\[
-  ℙ(g) = \sum_{s \in S}{𝟙_{T(s) = T_g} × ℙ(s) × ℙ(g | s)}
+  ℙ(g) = \sum_{s \in S}{𝟙(T(s) = T_g) × ℙ(s) × ℙ(g | s)}
 \\]
 
-where \\(𝟙_{\text{condition}}\\) is the indicator function
+where \\(𝟙(\text{condition})\\) is the indicator function
 (neutral if the condition is true, null if false).
 
 If the parameter is set,
@@ -317,7 +317,7 @@ All considered scenarios contribute to the likelihood of unresolved trees,
 even if their topologies don't match.
 
 \\[
-  ℙ(g) = \sum_{s \in S}{𝟙_{d_g ⩽ ul\ \cup\ T(s) = T_g} × ℙ(s) × ℙ(g | s)}
+  ℙ(g) = \sum_{s \in S}{𝟙(d_g ⩽ ul\ \cup\ T(s) = T_g) × ℙ(s) × ℙ(g | s)}
 \\]
 
 ### Total likelihood { #total }
diff --git a/doc/src/preprocess.md b/doc/src/preprocess.md
index c425b2fdec8aa69c75ffcf4536b7e3deba2d4ccd..819a00ff3817d16ca31c443839843af1f5a02b11 100644
--- a/doc/src/preprocess.md
+++ b/doc/src/preprocess.md
@@ -12,7 +12,7 @@ refers to the single last common ancestor of these species in the tree,
 
 Every gene tree is first pruned
 so that only species of interest are kept.
-Species of interest and species occuring in either
+Species of interest are species occuring in either
 the [`triplet`](./use.md#triplet),
 the [`outgroup`](./use.md#outgroup) or
 the [`other`](./use.md#other)
diff --git a/doc/src/use.md b/doc/src/use.md
index 4fd5604b39c9044b677088964446f78a9094f72c..7125d5cc4a66622404975670dac3f3d1d60c0479 100644
--- a/doc/src/use.md
+++ b/doc/src/use.md
@@ -76,17 +76,17 @@ TODO: clarify
 ### The `[filters]` table
 <!-- cmdrun ./doc config::raw::Config::filters -->
 
-See the [filtering process](preprocess.md).
+(see the [filtering process](preprocess.md))
 
 #### `triplet_other_monophyly` { #tom }
 <!-- cmdrun ./doc config::raw::Filters::triplet_other_monophyly -->
 
-See the [topology filter](preprocess.md#topology).
+(see the [topology filter](preprocess.md#topology))
 
 #### `max_clock_ratio` { #mcr }
 <!-- cmdrun ./doc config::raw::Filters::max_clock_ratio -->
 
-See the [geometry filter](preprocess.md#geometry).
+(see the [geometry filter](preprocess.md#geometry))
 
 ### The `[init]` table
 
@@ -95,11 +95,11 @@ starting point(s) for likelihood exploration.
 Provide several values to run several independent optimisation procedures
 and explore different areas of the likelihood surface.
 Missing parameters will be assigned a default value
-based on the data at hand according to aphid's [internal heuristic],
+based on the data at hand according to aphid's [internal
+heuristic](learn.md#init),
 for which only `theta` value is necessary.
 Defaults to:
-<!-- cmdrun ./doc config::defaults::DEFAULT_INIT_THETAS -->
-
+<!-- cmdrun rg 'DEFAULT_INIT_THETAS' ../../src | head -1 | sed 's/.*= &\(.*\);/`\1`./' -->
 
 For example:
 
@@ -128,4 +128,4 @@ p_ac = [0.1, 0.2, 0.3]     # Force (one value for each run).
 ### The `[search]` table
 <!-- cmdrun ./doc config::raw::Config::search -->
 
-See the [learning method](`learn.md`).
+(see the [learning method](`learn.md`))
diff --git a/src/bin/doc.rs b/src/bin/doc.rs
index 0562466bca590a18a9dd602cc5be1020a13dcc4f..0005a3a515ed8d0572b7337e79efd56ae6111b81 100644
--- a/src/bin/doc.rs
+++ b/src/bin/doc.rs
@@ -65,7 +65,7 @@ fn run() -> Result<(), Error> {
 
     // Read and parse.
     let json = fs::read_to_string(&file).with_context(|_| IoErr { file })?;
-    let aphid: Crate = serde_json::from_str(&json)?;
+    let aphid: Crate = serde_json::from_str(&json).with_context(|_| ParseErr)?;
     // Now the whole crate information is available as 'aphid'.
 
     // Extract root module.
@@ -213,7 +213,7 @@ enum Error {
         file: PathBuf,
         source: std::io::Error,
     },
-    #[snafu(transparent)]
+    #[snafu(display("Parse error: {source}"))]
     Parse { source: serde_json::Error },
     #[snafu(display("Inconsistent program behaviour: {e}"))]
     Inconsistent { e: String },
diff --git a/src/config.rs b/src/config.rs
index 1207781cb0a77258a09cc25e29ba8f0f05553b30..2cf20c8bdf4eea8db9a74b86045be22626b30307 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -15,7 +15,7 @@ use crate::{
     BranchLength, Parameters,
 };
 
-pub(crate) mod defaults;
+pub mod defaults;
 pub mod expand;
 pub mod raw;