Skip to content

Conversation

@Mo-Gul
Copy link
Contributor

@Mo-Gul Mo-Gul commented Oct 17, 2025

Feel free to cherry-pick.

Now follow some open questions or open points which I summarize here as tasks, so they can be checked when done.

  • (Code) Spell Checker
  • missing link destination
  • LaTeX stuff
    • $ syntax
    • $$ syntax
  • line breaks vs. no line breaks
  • other/wrong ref/cite style
    • No footnote syntax
    • Ref [1] not used
    • Link in references are no links
  • markdownlint (VS Code) issues
    • MD001/heading-increment
    • MD025/single-title/single-h1
    • MD029/ol-prefix
    • MD045/no-alt-text
    • MD059/descriptive-link-text

(Code) Spell Checker

You write to use a spell checker,

### [Spellchecking in your code](@id devdocs_advice_codespellchecker)
Especially when writing documentation, but also when writing normal code, it can be useful to have a spellchecker running through your texts. While code can be copied into a spellchecker and checked there (which is still useful to check grammar), it can also be very useful to (for users of VSCode) run the [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) extension. This will automatically provide simple spell-checking for code and documentation as you write it.

but I can't find a dictionary file in the repo for all the unknown words. Is that intended?

missing link destination

In

Next, we consider the [Brusselator] model. First we simulate the model for two similar initial conditions, confirming that they converge to the same limit cycle:

[Brusselator] should either be [Brusselator](@ref basic_CRN_library_brusselator) or [Brusselator](https://en.wikipedia.org/wiki/Brusselator).

LaTeX stuff

$ syntax

When I am not mistaken, the $ syntax shouldn't be used (any more), right? But there are plenty of (remaining) instances like

Here, we create a simple [*birth-death* model](@ref basic_CRN_library_bd), where a single species ($X$) is created at rate $b$, and degraded at rate $d$. The model is stored in the variable `rn`.

Instead, according to the "Markdown LaTeX" section of the Julia manual the double backtick syntax should be used ``.

Is it intentional that some files still use the $ syntax?

$$ syntax

There also is one remaining instance of $$ at

$$s' \xleftrightarrow[\beta_s(V(t))]{\alpha_s(V(t))} s, \quad s \in \{m,n,h\}$$

which should be replaced with a ```` math block fenced block.

line breaks vs. no line breaks

Some files don't have line breaks inside paragraphs -- like the Introduction to Catalyst and Julia for New Julia users) --, but some file have -- like the following file/section Introduction to Catalyst.

Should this be harmonized? And if yes, to which style?

other/wrong ref/cite style

Please have a look at the "Smoluchowski Coagulation Equation" section.

No footnote syntax

There isn't used the "footnote" syntax for the references and the citations ([^1]). This is the only (remaining) file with such a style.

Ref [1] not used

Currently the link is given directly at each entry, but there is no "[1]" in the text. So when you don't switch to the "footnote" syntax, either add it somewhere in the text or remove the entry.

Link in references are no links

The title says it all, but to be sure, here (also) a picture of the current output

References

(Remaining) markdownlint (VS Code) issues

MD001/heading-increment

Please check if the number of # is really correct.

### [Global vs local sensitivity](@id global_sensitivity_analysis_global_vs_local_sensitivity)

### [Quick-start summary](@id dsl_description_quick_start)

### [Background to CRN simulations](@id simulation_intro_theory)

#### [Features of Catalyst](@id doc_index_features_catalyst)

#### [Deterministic ODE simulation of Michaelis-Menten enzyme kinetics](@id doc_index_example_ode)

#### Modification of problems with conservation laws broken

(and the following two headings.)

MD025/single-title/single-h1

# Full decomposition of the reaction network ODEs (flux matrix and mass-action vector)

MD029/ol-prefix

### Measurements
Finally, we need to define the system measurements to which the parameters will be fitted. Each measurement combines:
1. The observable which is observed (here we use the id tag defined in the `observables` dictionary).
2. The time point of the measurement.
3. The measured value.
For cases where several simulation conditions are given, we also need to provide:
4. The simulation condition which generates the measurement ([here](@ref petab_simulation_conditions) is an example where this is used).

shows as

Measurements

and correspondingly for

## [Multi-start optimisation](@id petab_multistart_optimisation)
To avoid the optimisation process returning a local minimum, it is often advised to run it multiple times, using different initial guesses. PEtab.jl supports this through the `calibrate_multistart` function. This is identical to the `calibrate` function, but takes one additional arguments:
1. `nmultistarts`: The number of runs to perform.
And two additional optional argument:
2. `dirsave`: A location to which the output is automatically saved. If `dirsave=nothing`, no output is saved. It is recommended to save intermediate results for parameter estimation runs that take a long time, to not lose intermediate results if something goes wrong.
3. `sampling_method`: Selects the sampling method with which to select the initial guesses (`QuasiMonteCarlo.LatinHypercubeSample()` used by default).

According to the "Markdown Lists" section in the Julia manual starting with another number than 1 should work, shouldn't it?

MD045/no-alt-text

The heading says it all :) Here are the instances

(Perhaps you could also add a blank line at the end (if it is missing).)

MD059/descriptive-link-text

There are a lot of "[here]" links that should be replaced ... I don't give an example here, because one can simply search for e.g. "[here](" to find them all.

@TorkelE
Copy link
Member

TorkelE commented Oct 17, 2025

I tried to check the changes, but I just see lots and lots of added line breaks, and I'm not sure I really see the use of those.

@Mo-Gul
Copy link
Contributor Author

Mo-Gul commented Oct 18, 2025

As my first sentence of the PR states: Feel free to cherry-pick whatever commits you like.

When you don't like all the added linebreaks, ignore the commits

It is true what when having a look at the result of all the commits at once, you only see the added linebreaks. But you can go through the commits one by one (excluding the above). Most of them are then quite short.

The above mentioned three commits are just fixes of hints from markdownlint (VS Code). to helps to keep a consistent (documentation) style.

@isaacsas
Copy link
Member

Thank you for your time and effort on making this PR!

Generally formatting changes should be kept distinct from other changes (i.e. via separate PRs). This makes review feasible and enables us to more easily see what content is actually being changed. If you could open a shorter PR that removes whitespace/formatting commits so we can review the more important changes involving broken links, typos, spelling and such that would be really helpful.

As my first sentence of the PR states: Feel free to cherry-pick whatever commits you like.

Please keep in mind that maintainers of projects can be quite busy, so finding time to cherry pick your commits, open our own PRs with them, and then review them, will likely result in your work languishing an extended amount of time (as will submission of one very long PR with thousands of lines of changes vs. multiple shorter PRs that only change a few hundred lines). If you would like to help facilitate the process please open a PR yourself with formatting related-changes removed.

@isaacsas
Copy link
Member

Some guidance about SciML's practices for PRs is at: https://docs.sciml.ai/ColPrac/stable/#Guidance-on-contributing-PRs

@Mo-Gul
Copy link
Contributor Author

Mo-Gul commented Oct 25, 2025

As you can guess my time is also limited. Unfortunately you were a bit too vague what you expect me to do.

Before submitting the PR I already reordered the commits to start with the formatting stuff (starting with MD022, MD031 and MD032). I am not sure why the order given here is different. This has already caused me a lot of conflicts that I had to resolve. (When I remember correctly that is because you don't have much linebreaks in paragraphs, i.e. a paragraph is a single line of text.) I don't want to resolve plenty of conflicts again.

And since I am not a Git expert, I could offer to go back in time in my repo and first submit a new PR with the above three "whitespace" commits. After you have accepted these I think the rest can go in one more PR.

I already have prepared one more PR which is to harmonize the spelling to UK or US, see my branches

Because of my only noob level of git I just made these branches from the HEAD of my master branch, thus they include also all the above commits ...

So please let me know if the suggested way of providing new PRs is OK for you.

@Mo-Gul
Copy link
Contributor Author

Mo-Gul commented Nov 23, 2025

Almost four weeks later still no response ... 😞

@isaacsas
Copy link
Member

Sorry, as I said in my previous reply, we appreciate and would happily take a PR without the formatting changes! I can’t tell you how to extract those commits as I am not a git expert either — I would just Google or ask an AI. I don’t think either of Torkel or I sees a pressing need for the formatting changes, or has the time to review a PR of the many formatting changes to ensure it doesn’t make a non-formatting/problematic change. If/when we are concerned with cleaning up formatting we would probably just reactivate JuliaFormatter (which is currently turned off due to bugs resulting in poor reformats).

@TorkelE
Copy link
Member

TorkelE commented Nov 24, 2025

yeah, as Sam says the formatting changes make it hard to see what the PR actually does. Generally I am not unhappy with the formatting, and while improvements can be made I'd rather just sit with Sam and figure that out.

Also, I am not sure how useful spelling fixed across UK/US English will be. I.e. different people use different spelling, so right now it will just vary from doc page to doc page. If there are inconsistencies in a single page I guess it wouldn't hurt updating though.

@Mo-Gul
Copy link
Contributor Author

Mo-Gul commented Nov 24, 2025

I would have loved to prove that I haven't messed something up, but unfortunately I already got a lot of errors when trying to make the docs of commit 587ce00 😭

So I tried to drop the "whitespace" commits in a rebase but -- as I expected -- this ended up in a lot of conflicts. But what I could do was a diff between commits 587ce00 and https://github.com/Mo-Gul/Catalyst.jl/commit/8b30e468152b1392888345ac28763ea3f3e6833b. Ignoring all whitespace and blank lines only resulted in one false positive file remaining

commit_diff

(Please note that in this screenshot you can see the order of commits after my rebase, but for whatever reason the shown order at GitHub is a different one. Most likely this is because on GitHub they are ordered by date.)

Comparing that with the same "ignore settings" revealed only 2 (remaining) differences (see the bottom of the following screenshot, which -- as I already stated -- are false positives.

dsl_advanced

So I offer it again: I can try to revert all changes after the three "whitespace" commits and we'll go for them as a first PR. The remaining commits then can go in a second PR which should be reviewable, as you can review/verify in the following collapsible.

Patch file of the remaining commits
 docs/old_files/unused_tutorials/models.md          | 14 +++----
 docs/src/api/core_api.md                           | 28 +++++++-------
 docs/src/api/network_analysis_api.md               |  2 +-
 docs/src/devdocs/dev_guide.md                      |  2 +-
 docs/src/faqs.md                                   |  2 +-
 docs/src/index.md                                  | 24 ++++++------
 .../catalyst_for_new_julia_users.md                | 41 ++++++++++----------
 .../introduction_to_catalyst.md                    |  4 +-
 .../introduction_to_catalyst/math_models_intro.md  |  2 +-
 .../src/inverse_problems/behaviour_optimisation.md | 18 ++++-----
 .../global_sensitivity_analysis.md                 |  4 +-
 .../optimization_ode_param_fitting.md              | 21 ++++++-----
 .../inverse_problems/petab_ode_param_fitting.md    |  7 ++--
 .../inverse_problems/structural_identifiability.md |  4 +-
 .../chemistry_related_functionality.md             |  1 -
 docs/src/model_creation/compositional_modeling.md  |  2 +-
 docs/src/model_creation/constraint_equations.md    |  2 -
 docs/src/model_creation/dsl_advanced.md            |  3 +-
 docs/src/model_creation/dsl_basics.md              |  3 +-
 .../examples/hodgkin_huxley_equation.md            |  2 +-
 .../examples/noise_modelling_approaches.md         |  1 -
 .../programmatic_generative_linear_pathway.md      |  1 -
 .../examples/smoluchowski_coagulation_equation.md  |  6 +--
 docs/src/model_creation/functional_parameters.md   |  1 -
 .../model_file_loading_and_export.md               | 28 +++++++-------
 docs/src/model_creation/model_visualisation.md     |  2 +-
 .../programmatic_CRN_construction.md               |  2 +-
 .../examples/interactive_brusselator_simulation.md |  1 -
 .../finite_state_projection_simulation.md          |  1 -
 .../model_simulation/ode_simulation_performance.md |  9 +----
 .../model_simulation/simulation_introduction.md    | 44 +++++++++++-----------
 docs/src/network_analysis/crn_theory.md            |  5 +--
 docs/src/network_analysis/odes.md                  |  2 +-
 .../spatial_modelling/lattice_reaction_systems.md  |  1 -
 .../lattice_simulation_structure_ interaction.md   |  3 +-
 .../bifurcation_diagrams.md                        |  1 -
 .../dynamical_systems.md                           |  7 +---
 .../examples/bifurcationkit_codim2.md              |  1 -
 .../examples/bifurcationkit_periodic_orbits.md     |  1 -
 .../homotopy_continuation.md                       |  7 +---
 .../steady_state_functionality/nonlinear_solve.md  |  6 +--
 docs/src/v14_migration_guide.md                    |  2 +-
 test/upstream/mtk_problem_inputs.jl                |  2 +-
 43 files changed, 143 insertions(+), 177 deletions(-)

diff --git a/docs/old_files/unused_tutorials/models.md b/docs/old_files/unused_tutorials/models.md
index 1b862869..01e48d58 100644
--- a/docs/old_files/unused_tutorials/models.md
+++ b/docs/old_files/unused_tutorials/models.md
@@ -109,19 +109,19 @@ plot(sol, lw=2)
 Each `Reaction` within `reactions(rn)` has a number of subfields. For `rx` a
 `Reaction` we have:
 
-* `rx.substrates`, a vector of ModelingToolkit expressions storing each
+- `rx.substrates`, a vector of ModelingToolkit expressions storing each
   substrate variable.
-* `rx.products`, a vector of ModelingToolkit expressions storing each product
+- `rx.products`, a vector of ModelingToolkit expressions storing each product
   variable.
-* `rx.substoich`, a vector storing the corresponding stoichiometry of each
+- `rx.substoich`, a vector storing the corresponding stoichiometry of each
   substrate species in `rx.substrates`.
-* `rx.prodstoich`, a vector storing the corresponding stoichiometry of each
+- `rx.prodstoich`, a vector storing the corresponding stoichiometry of each
   product species in `rx.products`.
-* `rx.rate`, a `Number`, `ModelingToolkit.Sym`, or ModelingToolkit expression
+- `rx.rate`, a `Number`, `ModelingToolkit.Sym`, or ModelingToolkit expression
   representing the reaction rate. E.g., for a reaction like `k*X, Y --> X+Y`,
   we'd have `rate = k*X`.
-* `rx.netstoich`, a vector of pairs mapping the ModelingToolkit expression for
+- `rx.netstoich`, a vector of pairs mapping the ModelingToolkit expression for
   each species that changes numbers by the reaction to how much it changes. E.g.,
   for `k, X + 2Y --> X + W`, we'd have `rx.netstoich = [Y(t) => -2, W(t) => 1]`.
-* `rx.only_use_rate`, a boolean that is `true` if the reaction was made with
+- `rx.only_use_rate`, a boolean that is `true` if the reaction was made with
   non-filled arrows and should ignore mass action kinetics. `false` by default.
diff --git a/docs/src/api/core_api.md b/docs/src/api/core_api.md
index 792ceb6e..34f0ccb3 100644
--- a/docs/src/api/core_api.md
+++ b/docs/src/api/core_api.md
@@ -100,7 +100,7 @@ of all options currently available.
 - [`ivs`](@ref dsl_advanced_options_ivs): Allows the designation of a set of symbols as system independent variables.
 - [`compounds`](@ref chemistry_functionality_compounds): Allows the designation of compound species.
 - [`observables`](@ref dsl_advanced_options_observables): Allows the designation of compound observables.
-- [`default_noise_scaling`](@ref simulation_intro_SDEs_noise_saling): Enables the setting of a default noise scaling expression.
+- [`default_noise_scaling`](@ref simulation_intro_SDEs_noise_scaling): Enables the setting of a default noise scaling expression.
 - [`differentials`](@ref constraint_equations_coupling_constraints): Allows the designation of differentials.
 - [`equations`](@ref constraint_equations_coupling_constraints): Allows the creation of algebraic and/or differential equations.
 - [`continuous_events`](@ref constraint_equations_events): Allows the creation of continuous events.
@@ -124,22 +124,22 @@ retrieve info from just a base [`ReactionSystem`](@ref) `rn`, ignoring
 sub-systems of `rn`, one can use the ModelingToolkit accessors (these provide
 direct access to the corresponding internal fields of the `ReactionSystem`)
 
-* `ModelingToolkit.get_unknowns(rn)` is a vector that collects all the species
+- `ModelingToolkit.get_unknowns(rn)` is a vector that collects all the species
   defined within `rn`, ordered by species and then non-species variables.
-* `Catalyst.get_species(rn)` is a vector of all the species variables in the system. The
+- `Catalyst.get_species(rn)` is a vector of all the species variables in the system. The
   entries in `get_species(rn)` correspond to the first `length(get_species(rn))`
   components in `get_unknowns(rn)`.
-* `ModelingToolkit.get_ps(rn)` is a vector that collects all the parameters
+- `ModelingToolkit.get_ps(rn)` is a vector that collects all the parameters
   defined *within* reactions in `rn`.
-* `ModelingToolkit.get_eqs(rn)` is a vector that collects all the
+- `ModelingToolkit.get_eqs(rn)` is a vector that collects all the
   [`Reaction`](@ref)s and `Symbolics.Equation` defined within `rn`, ordering all
   `Reaction`s before `Equation`s.
-* `Catalyst.get_rxs(rn)` is a vector of all the [`Reaction`](@ref)s in `rn`, and
+- `Catalyst.get_rxs(rn)` is a vector of all the [`Reaction`](@ref)s in `rn`, and
   corresponds to the first `length(get_rxs(rn))` entries in `get_eqs(rn)`.
-* `ModelingToolkit.get_iv(rn)` is the independent variable used in the system
+- `ModelingToolkit.get_iv(rn)` is the independent variable used in the system
   (usually `t` to represent time).
-* `ModelingToolkit.get_systems(rn)` is a vector of all sub-systems of `rn`.
-* `ModelingToolkit.get_defaults(rn)` is a dictionary of all the default values
+- `ModelingToolkit.get_systems(rn)` is a vector of all sub-systems of `rn`.
+- `ModelingToolkit.get_defaults(rn)` is a dictionary of all the default values
   for parameters and species in `rn`.
 
 The preceding accessors do not allocate, directly accessing internal fields of
@@ -149,20 +149,20 @@ To retrieve information from the full reaction network represented by a system
 `rn`, which corresponds to information within both `rn` and all sub-systems, one
 can call:
 
-* `ModelingToolkit.unknowns(rn)` returns all species *and variables* across the
+- `ModelingToolkit.unknowns(rn)` returns all species *and variables* across the
   system, *all sub-systems*, and all constraint systems. Species are ordered
   before non-species variables in `unknowns(rn)`, with the first `numspecies(rn)`
   entries in `unknowns(rn)` being the same as `species(rn)`.
-* [`species(rn)`](@ref) is a vector collecting all the chemical species within
+- [`species(rn)`](@ref) is a vector collecting all the chemical species within
   the system and any sub-systems that are also `ReactionSystems`.
-* `ModelingToolkit.parameters(rn)` returns all parameters across the
+- `ModelingToolkit.parameters(rn)` returns all parameters across the
   system, *all sub-systems*, and all constraint systems.
-* `ModelingToolkit.equations(rn)` returns all [`Reaction`](@ref)s and all
+- `ModelingToolkit.equations(rn)` returns all [`Reaction`](@ref)s and all
   `Symbolics.Equations` defined across the system, *all sub-systems*, and all
   constraint systems. `Reaction`s are ordered ahead of `Equation`s with the
   first `numreactions(rn)` entries in `equations(rn)` being the same as
   `reactions(rn)`.
-* [`reactions(rn)`](@ref) is a vector of all the `Reaction`s within the system
+- [`reactions(rn)`](@ref) is a vector of all the `Reaction`s within the system
   and any sub-systems that are also `ReactionSystem`s.
 
 These accessors will generally allocate new arrays to store their output unless
diff --git a/docs/src/api/network_analysis_api.md b/docs/src/api/network_analysis_api.md
index 4894fa06..84ea584a 100644
--- a/docs/src/api/network_analysis_api.md
+++ b/docs/src/api/network_analysis_api.md
@@ -6,7 +6,7 @@ CurrentModule = Catalyst
 
 Note, currently API functions for network analysis and conservation law analysis
 do not work with constant species (which are generated by SBML, and can be [declared
-in Catalyst as well](@ref dsl_advanced_options_constant_species).
+in Catalyst as well](@ref dsl_advanced_options_constant_species)).
 
 For more information about these functions, please see the sections of the docs on
 [network ODE representation](@ref network_analysis_odes) and [chemical reaction network theory](@ref network_analysis_structural_aspects).
diff --git a/docs/src/devdocs/dev_guide.md b/docs/src/devdocs/dev_guide.md
index 131f14f6..7da574e2 100644
--- a/docs/src/devdocs/dev_guide.md
+++ b/docs/src/devdocs/dev_guide.md
@@ -15,7 +15,7 @@ continuing stability of releases. Before making a release one should
 3. [Check docs build](@ref devdocs_advice_doc_inspection) with the capped dependencies.
    Visually verify via checking the artifact in the doc build that the docs actually
    look ok (since sometimes issues can arise that do not lead to actual errors in the doc CI).
-5. Release via the [registration
+4. Release via the [registration
    issue](https://github.com/SciML/Catalyst.jl/issues/127) with the
    command: `@JuliaRegistrator register branch=release-15.0.0`, modifying as appropriate
    for the version you are releasing.
diff --git a/docs/src/faqs.md b/docs/src/faqs.md
index d0082ab0..0caef2d7 100644
--- a/docs/src/faqs.md
+++ b/docs/src/faqs.md
@@ -136,7 +136,7 @@ simulations](@ref introduction_to_catalyst_ratelaws) section. Leaving this keywo
 point stoichiometry will give an error message.
 
 For a more extensive documentation of using non-integer stoichiometric
-coefficients, please see the [Symbolic Stochiometries](@ref
+coefficients, please see the [Symbolic Stoichiometries](@ref
 parametric_stoichiometry) section.
 
 ## How to set default values for initial conditions and parameters?
diff --git a/docs/src/index.md b/docs/src/index.md
index f29d49f3..936c2854 100644
--- a/docs/src/index.md
+++ b/docs/src/index.md
@@ -259,19 +259,19 @@ support it, please star the repository as such metrics may help us secure fundin
 you use Catalyst as part of your research, teaching, or other activities, we would be grateful if you
 could cite our work:
 
-```
+```bibtex
 @article{CatalystPLOSCompBio2023,
- doi = {10.1371/journal.pcbi.1011530},
- author = {Loman, Torkel E. AND Ma, Yingbo AND Ilin, Vasily AND Gowda, Shashi AND Korsbo, Niklas AND Yewale, Nikhil AND Rackauckas, Chris AND Isaacson, Samuel A.},
- journal = {PLOS Computational Biology},
- publisher = {Public Library of Science},
- title = {Catalyst: Fast and flexible modeling of reaction networks},
- year = {2023},
- month = {10},
- volume = {19},
- url = {https://doi.org/10.1371/journal.pcbi.1011530},
- pages = {1-19},
- number = {10},
+  doi = {10.1371/journal.pcbi.1011530},
+  author = {Loman, Torkel E. AND Ma, Yingbo AND Ilin, Vasily AND Gowda, Shashi AND Korsbo, Niklas AND Yewale, Nikhil AND Rackauckas, Chris AND Isaacson, Samuel A.},
+  journal = {PLOS Computational Biology},
+  publisher = {Public Library of Science},
+  title = {Catalyst: Fast and flexible modeling of reaction networks},
+  year = {2023},
+  month = {10},
+  volume = {19},
+  url = {https://doi.org/10.1371/journal.pcbi.1011530},
+  pages = {1-19},
+  number = {10},
 }
 ```
 
diff --git a/docs/src/introduction_to_catalyst/catalyst_for_new_julia_users.md b/docs/src/introduction_to_catalyst/catalyst_for_new_julia_users.md
index f2467ec7..a8166547 100644
--- a/docs/src/introduction_to_catalyst/catalyst_for_new_julia_users.md
+++ b/docs/src/introduction_to_catalyst/catalyst_for_new_julia_users.md
@@ -57,9 +57,9 @@ rand(100, 100)^3.5
 nothing # hide
 ```
 
-(This code creates a random 100x100 matrix, and takes it to the power of 3.5)
+(This code creates a random 100x100 matrix, and takes it to the power of 3.5.)
 
-This is useful to know when you e.g. declare, simulate, or plot, a Catalyst model. The first time you run a command there might be a slight delay. However, subsequent runs will be much quicker. This holds even if you make minor adjustments before the second run (such as changing simulation initial conditions).
+This is useful to know when you e.g. declare, simulate, or plot a Catalyst model. The first time you run a command there might be a slight delay. However, subsequent runs will be much quicker. This holds even if you make minor adjustments before the second run (such as changing simulation initial conditions).
 
 ## [Installing and activating packages](@id catalyst_for_new_julia_users_packages_intro)
 
@@ -72,7 +72,7 @@ using Pkg
 Pkg.add("Catalyst")
 ```
 
-Here, the Julia package manager package (`Pkg`) is by default installed on your computer when Julia is installed, and can be activated directly. Next, we install an ODE solver from a sub-library of the larger `OrdinaryDiffEq` package, and install the `Plots` package for making graphs. We will import the recommended default solver from the `OrdinaryDiffEqDefault` sub-library. A full list of `OrdinaryDiffEq` solver sublibraries can be found on the sidebar of [this page](https://docs.sciml.ai/OrdinaryDiffEq/stable/).
+Here, the Julia package manager package (`Pkg`) is by default installed on your computer when Julia is installed, and can be activated directly. Next, we install an ODE solver from a sub-library of the larger `OrdinaryDiffEq` package, and install the `Plots` package for making graphs. We will import the recommended default solver from the `OrdinaryDiffEqDefault` sub-library. A full list of `OrdinaryDiffEq` solver sub-libraries can be found on the sidebar of [this page](https://docs.sciml.ai/OrdinaryDiffEq/stable/).
 
 ```julia
 Pkg.add("OrdinaryDiffEqDefault")
@@ -108,21 +108,21 @@ rn = @reaction_network begin
 end
 ```
 
-For more information on how to use the Catalyst model creator (also known as *the Catalyst DSL*), please read [the corresponding documentation](https://docs.sciml.ai/Catalyst/stable/catalyst_functionality/dsl_description/).
+For more information on how to use the Catalyst model creator (also known as *the Catalyst DSL*), please read [the corresponding documentation](https://docs.sciml.ai/Catalyst/stable/model_creation/dsl_basics/).
 
-Next, we wish to simulate our model. To do this, we need to provide some additional information to the simulator. This is
+Next, we wish to simulate our model. To do this, we need to provide some additional information to the simulator. This is:
 
-* The initial condition. That is, the concentration (or copy numbers) of each species at the start of the simulation.
-* The time span. That is, the time frame over which we wish to run the simulation.
-* The parameter values. That is, the values of the model's parameters for this simulation.
+- The initial condition. That is, the concentration (or copy numbers) of each species at the start of the simulation.
+- The time span. That is, the time frame over which we wish to run the simulation.
+- The parameter values. That is, the values of the model's parameters for this simulation.
 
-The initial condition is given as a *Vector*. This is a type which collects several different values. To declare a vector, the values are specific within brackets, `[]`, and separated by `,`. Since we only have one species, the vector holds a single element. In this element, we set the value of $X$ using the `:X => 1.0` syntax. Here, we first denote the name of the species (with a `:` pre-appended, which creates a `Symbol`), next follows a `=>` and then the value of $X$. Since we wish to simulate the *concentration* of X over time, we will let the initial condition be decimal valued.
+The initial condition is given as a *Vector*. This is a type which collects several different values. To declare a vector, the values are specified within brackets, `[]`, and separated by `,`. Since we only have one species, the vector holds a single element. In this element, we set the value of $X$ using the `:X => 1.0` syntax. Here, we first denote the name of the species (with a `:` pre-appended, which creates a `Symbol`), next follows a `=>` and then the value of $X$. Since we wish to simulate the *concentration* of $X$ over time, we will let the initial condition be decimal valued.
 
 ```@example ex2
 u0 = [:X => 1.0]
 ```
 
-The timespan sets the time point at which we start the simulation (typically `0.0` is used) and the final time point of the simulation. These are combined into a two-valued *tuple*. Tuples are similar to vectors, but are enclosed by `()` and not `[]`. Again, we will let both time points be decimal valued.
+The time span sets the time point at which we start the simulation (typically `0.0` is used) and the final time point of the simulation. These are combined into a two-valued *tuple*. Tuples are similar to vectors, but are enclosed by `()` and not `[]`. Again, we will let both time points be decimal valued.
 
 ```@example ex2
 tspan = (0.0, 10.0)
@@ -134,9 +134,9 @@ Finally, the parameter values are, like the initial conditions, given in a vecto
 params = [:b => 1.0, :d => 0.2]
 ```
 
-Please read here for more information on [vectors](https://docs.julialang.org/en/v1/manual/arrays/) and [tuples](https://docs.julialang.org/en/v1/manual/types/#Tuple-Types).
+Please read the corresponding manual entries on [vectors](https://docs.julialang.org/en/v1/manual/arrays/) and [tuples](https://docs.julialang.org/en/v1/manual/types/#Tuple-Types) for more information.
 
-Next, before we can simulate our model, we bundle all the required information together in a so-called `ODEProblem`. Note that the order in which the input (the model, the initial condition, the timespan, and the parameter values) is provided to the `ODEProblem` matters. E.g. the parameter values cannot be provided as the first argument, but have to be the fourth argument. Here, we save our `ODEProblem` in the `oprob` variable.
+Next, before we can simulate our model, we bundle all the required information together in a so-called `ODEProblem`. Note that the order in which the input (the model, the initial condition, the time span, and the parameter values) is provided to the `ODEProblem` matters. E.g. the parameter values cannot be provided as the first argument, but have to be the fourth argument. Here, we save our `ODEProblem` in the `oprob` variable.
 
 ```@example ex2
 oprob = ODEProblem(rn, u0, tspan, params)
@@ -162,7 +162,7 @@ For more information about the numerical simulation package, please see the [Dif
 
 To make this introduction more comprehensive, we here provide another example, using a more complicated model. Instead of simulating our model as concentrations evolve over time, we will now simulate the individual reaction events through the [Gillespie algorithm](https://en.wikipedia.org/wiki/Gillespie_algorithm) (a common approach for adding *noise* to models).
 
-Remember (unless we have restarted Julia) we do not need to activate our packages (through the `using` command) again. However, we do need to install, and then import, the JumpProcesses package (just to perform Gillespie, and other jump, simulations)
+Remember (unless we have restarted Julia) we do not need to activate our packages (through the `using` command) again. However, we do need to install, and then import, the [`JumpProcesses`](https://docs.sciml.ai/JumpProcesses/stable/) package (just to perform Gillespie, and other jump, simulations).
 
 ```julia
 Pkg.add("JumpProcesses")
@@ -171,19 +171,19 @@ using JumpProcesses
 
 This time, we will declare a so-called [SIR model for an infectious disease](@ref basic_CRN_library_sir). Note that even if this model does not describe a set of chemical reactions, it can be modelled using the same framework. The model consists of 3 species:
 
-* *S*, the amount of *susceptible* individuals.
-* *I*, the amount of *infected* individuals.
-* *R*, the amount of *recovered* (or *removed*) individuals.
+- *S*, the amount of *susceptible* individuals.
+- *I*, the amount of *infected* individuals.
+- *R*, the amount of *recovered* (or *removed*) individuals.
 
 It also has 2 reaction events:
 
-* Infection, where a susceptible individual meets an infected individual and also becomes infected.
-* Recovery, where an infected individual recovers from the infection.
+- Infection, where a susceptible individual meets an infected individual and also becomes infected.
+- Recovery, where an infected individual recovers from the infection.
 
 Each reaction is also associated with a specific rate (corresponding to a parameter).
 
-* *b*, the infection rate.
-* *k*, the recovery rate.
+- *b*, the infection rate.
+- *k*, the recovery rate.
 
 We declare the model using the `@reaction_network` macro, and store it in the `sir_model` variable.
 
@@ -305,7 +305,6 @@ Some additional useful Pkg commands are:
 !!! note
     A useful feature of Julia's environment system is that enables the exact definition of what packages and versions were used to execute a script. This supports e.g. reproducibility in academic research. Here, by providing the corresponding Project.toml and Manifest.toml files, you can enable someone to reproduce the exact program used to perform some set of analyses.
 
-
 ---
 
 ## Feedback
diff --git a/docs/src/introduction_to_catalyst/introduction_to_catalyst.md b/docs/src/introduction_to_catalyst/introduction_to_catalyst.md
index e5f6d1c3..73e8b482 100644
--- a/docs/src/introduction_to_catalyst/introduction_to_catalyst.md
+++ b/docs/src/introduction_to_catalyst/introduction_to_catalyst.md
@@ -2,7 +2,7 @@
 
 In this tutorial we provide an introduction to using Catalyst to specify
 chemical reaction networks, and then to solve ODE, jump, and SDE models
-generated from them [1]. At the end we show what mathematical rate laws and
+generated from them[^1]. At the end we show what mathematical rate laws and
 transition rate functions (i.e. intensities or propensities) are generated by
 Catalyst for ODE, SDE and jump process models. The [Mathematical Models Catalyst
 can Generate](@ref math_models_in_catalyst) documentation illustrates the
@@ -437,4 +437,4 @@ A more detailed summary of the precise mathematical equations Catalyst can gener
 
 ## References
 
-1. [Torkel E. Loman, Yingbo Ma, Vasily Ilin, Shashi Gowda, Niklas Korsbo, Nikhil Yewale, Chris Rackauckas, Samuel A. Isaacson, *Catalyst: Fast and flexible modeling of reaction networks*, PLOS Computational Biology (2023).](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1011530)
+[^1]: [Torkel E. Loman, Yingbo Ma, Vasily Ilin, Shashi Gowda, Niklas Korsbo, Nikhil Yewale, Chris Rackauckas, Samuel A. Isaacson, *Catalyst: Fast and flexible modeling of reaction networks*, PLOS Computational Biology (2023).](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1011530)
diff --git a/docs/src/introduction_to_catalyst/math_models_intro.md b/docs/src/introduction_to_catalyst/math_models_intro.md
index bd34d295..cccf25da 100644
--- a/docs/src/introduction_to_catalyst/math_models_intro.md
+++ b/docs/src/introduction_to_catalyst/math_models_intro.md
@@ -46,7 +46,7 @@ a_k(\mathbf{X}(t)) = k \prod_{m=1}^M \frac{X_m(t) (X_m(t)-1) \dots (X_m(t)-\alph
 
 for stochastic chemical kinetics jump process models.
 
-### Rate Law vs. Propensity Example:
+### Rate Law vs. Propensity Example
 
 For the reaction $2A + B \overset{k}{\to} 3 C$ we would have
 
diff --git a/docs/src/inverse_problems/behaviour_optimisation.md b/docs/src/inverse_problems/behaviour_optimisation.md
index 1abbf8bb..bc3f864d 100644
--- a/docs/src/inverse_problems/behaviour_optimisation.md
+++ b/docs/src/inverse_problems/behaviour_optimisation.md
@@ -94,16 +94,16 @@ How to use Optimization.jl is discussed in more detail in [this tutorial](@ref o
 
 If you use this functionality in your research, please cite the following paper to support the authors of the Optimization.jl package:
 
-```
+```bibtex
 @software{vaibhav_kumar_dixit_2023_7738525,
-	author = {Vaibhav Kumar Dixit and Christopher Rackauckas},
-	month = mar,
-	publisher = {Zenodo},
-	title = {Optimization.jl: A Unified Optimization Package},
-	version = {v3.12.1},
-	doi = {10.5281/zenodo.7738525},
-  	url = {https://doi.org/10.5281/zenodo.7738525},
-	year = 2023
+  author = {Vaibhav Kumar Dixit and Christopher Rackauckas},
+  month = mar,
+  publisher = {Zenodo},
+  title = {Optimization.jl: A Unified Optimization Package},
+  version = {v3.12.1},
+  doi = {10.5281/zenodo.7738525},
+  url = {https://doi.org/10.5281/zenodo.7738525},
+  year = 2023
 }
 ```
 
diff --git a/docs/src/inverse_problems/global_sensitivity_analysis.md b/docs/src/inverse_problems/global_sensitivity_analysis.md
index 2802b070..6d134e0b 100644
--- a/docs/src/inverse_problems/global_sensitivity_analysis.md
+++ b/docs/src/inverse_problems/global_sensitivity_analysis.md
@@ -68,7 +68,6 @@ on the domain $10^β ∈ (-3.0,-1.0)$, $10^a ∈ (-2.0,0.0)$, $10^γ ∈ (-2.0,0
     - Again, as [previously described in other inverse problem tutorials](@ref optimization_parameter_fitting_basics), when exploring a function over large parameter spaces, we will likely simulate our model for unsuitable parameter sets. To reduce time spent on these, and to avoid excessive warning messages, we provide the `maxiters = 100000` and `verbose = false` arguments to `solve`.
     - As we have encountered in [a few other cases](@ref optimization_parameter_fitting_basics), the `gsa` function is not able to take parameter inputs of the map form usually used for Catalyst. Hence, as a first step in `peak_cases` we convert the parameter vector to this form. Next, we remember that the order of the parameters when we e.g. evaluate the GSA output, or set the parameter bounds, corresponds to the order used in `ps = [:β => p[1], :a => p[2], :γ => p[3]]`.
 
-
 ## [Sobol's method-based global sensitivity analysis](@id global_sensitivity_analysis_sobol)
 
 The most common method for GSA is [Sobol's method](https://en.wikipedia.org/wiki/Variance-based_sensitivity_analysis). This can be carried out using:
@@ -137,7 +136,6 @@ As previously, we note that the peak number of infected cases is more sensitive
 
 Generally, Morris's method is computationally less intensive, and has easier to interpret output, as compared to Sobol's method. However, if computational resources are available, Sobol's method is more comprehensive.
 
-
 ## [Other global sensitivity analysis methods](@id global_sensitivity_analysis_other_methods)
 
 GlobalSensitivity also implements additional methods for GSA, more details on these can be found in the [package's documentation](https://docs.sciml.ai/GlobalSensitivity/stable/).
@@ -178,7 +176,7 @@ Here, the function's sensitivity is evaluated with respect to each output indepe
 
 If you use this functionality in your research, [in addition to Catalyst](@ref doc_index_citation), please cite the following paper to support the authors of the GlobalSensitivity.jl package:
 
-```
+```bibtex
 @article{dixit2022globalsensitivity,
   title={GlobalSensitivity. jl: Performant and Parallel Global Sensitivity Analysis with Julia},
   author={Dixit, Vaibhav Kumar and Rackauckas, Christopher},
diff --git a/docs/src/inverse_problems/optimization_ode_param_fitting.md b/docs/src/inverse_problems/optimization_ode_param_fitting.md
index ada84c7b..1ca55f61 100644
--- a/docs/src/inverse_problems/optimization_ode_param_fitting.md
+++ b/docs/src/inverse_problems/optimization_ode_param_fitting.md
@@ -83,6 +83,7 @@ nothing # hide
 !!! note
     Especially if you check Optimization.jl's documentation, you will note that objective functions have the `f(u,p)` form. This is because `OptimizationProblem`s (like e.g. `ODEProblem`s) can take both variables (which are varied during the optimisation procedure), but also parameters that are fixed. In our case, the *optimisation variables* correspond to our *model parameters*. Hence, our model parameter values (`p`) are the first argument (`u`). This is also why we find the optimisation solution (our optimised parameter set) in `opt_sol`'s `u` field. Our optimisation problem does not actually have any parameters, hence, the second argument of `objective_function` is unused (that is why we call it `_`, a name commonly indicating unused function arguments).
 
+<!-- markdownlint-disable-next-line MD046 -->
     There are several modifications to our problem where it would actually have parameters. E.g. we might want to run the optimisation where one parameter has a known fixed value. If we then would like to rerun this for alternative fixed values, this value could be encoded as an `OptimizationProblem` parameter.
 
 Finally, we can solve `optprob` to find the parameter set that best fits our data. Optimization.jl only provides a few optimisation methods natively. However, for each supported optimisation package, it provides a corresponding wrapper package to import that optimisation package for use with Optimization.jl. E.g., if we wish to use [NLopt.jl](https://github.com/JuliaOpt/NLopt.jl)'s [Nelder-Mead](https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method) method, we must install and import the OptimizationNLopt package. A summary of all, by Optimization.jl supported, optimisation packages can be found [here](https://docs.sciml.ai/Optimization/stable/#Overview-of-the-Optimizers). Here, we import the NLopt.jl package and uses it to minimise our objective function (thus finding a parameter set that fits the data):
@@ -104,7 +105,7 @@ Catalyst.PNG(plot(plt; fmt = :png, dpi = 200)) # hide
 ```
 
 !!! note
-    Here, a good exercise is to check the resulting parameter set and note that, while it creates a good fit to the data, it does not actually correspond to the original parameter set. Identifiability is a concept that studies how to deal with this problem.<!--NTS: re-add ref when identifiablity works again-->
+    Here, a good exercise is to check the resulting parameter set and note that, while it creates a good fit to the data, it does not actually correspond to the original parameter set. Identifiability is a concept that studies how to deal with this problem.<!--NTS: re-add ref when identifiability works again-->
 
 Say that we instead would like to use a [genetic algorithm](https://en.wikipedia.org/wiki/Genetic_algorithm) approach, as implemented by the [Evolutionary.jl](https://github.com/wildart/Evolutionary.jl) package. In this case we can run:
 
@@ -261,16 +262,16 @@ end
 
 If you use this functionality in your research, please cite the following paper to support the authors of the Optimization.jl package:
 
-```
+```bibtex
 @software{vaibhav_kumar_dixit_2023_7738525,
-	author = {Vaibhav Kumar Dixit and Christopher Rackauckas},
-	month = mar,
-	publisher = {Zenodo},
-	title = {Optimization.jl: A Unified Optimization Package},
-	version = {v3.12.1},
-	doi = {10.5281/zenodo.7738525},
-  	url = {https://doi.org/10.5281/zenodo.7738525},
-	year = 2023
+  author = {Vaibhav Kumar Dixit and Christopher Rackauckas},
+  month = mar,
+  publisher = {Zenodo},
+  title = {Optimization.jl: A Unified Optimization Package},
+  version = {v3.12.1},
+  doi = {10.5281/zenodo.7738525},
+  url = {https://doi.org/10.5281/zenodo.7738525},
+  year = 2023
 }
 ```
 
diff --git a/docs/src/inverse_problems/petab_ode_param_fitting.md b/docs/src/inverse_problems/petab_ode_param_fitting.md
index 51e4726d..4fc4b0e5 100644
--- a/docs/src/inverse_problems/petab_ode_param_fitting.md
+++ b/docs/src/inverse_problems/petab_ode_param_fitting.md
@@ -1,6 +1,6 @@
 # [Parameter Fitting for ODEs using PEtab.jl](@id petab_parameter_fitting)
 
-The [PEtab.jl package](https://github.com/sebapersson/PEtab.jl) implements the [PEtab format](https://petab.readthedocs.io/en/latest/) for fitting the parameters of deterministic CRN models to data [^1]. PEtab.jl both implements methods for creating cost functions (determining how well parameter sets fit to data), and for minimizing these cost functions. The PEtab approach covers most cases of fitting deterministic (ODE) models to data and is a good default choice when fitting reaction rate equation ODE models. This page describes how to combine PEtab.jl and Catalyst for parameter fitting, with the PEtab.jl package providing [a more extensive documentation](https://sebapersson.github.io/PEtab.jl/stable/) (this tutorial is partially an adaptation of this documentation).
+The [PEtab.jl package](https://github.com/sebapersson/PEtab.jl) implements the [PEtab format](https://petab.readthedocs.io/en/latest/) for fitting the parameters of deterministic CRN models to data[^1]. PEtab.jl both implements methods for creating cost functions (determining how well parameter sets fit to data), and for minimizing these cost functions. The PEtab approach covers most cases of fitting deterministic (ODE) models to data and is a good default choice when fitting reaction rate equation ODE models. This page describes how to combine PEtab.jl and Catalyst for parameter fitting, with the PEtab.jl package providing [a more extensive documentation](https://sebapersson.github.io/PEtab.jl/stable/) (this tutorial is partially an adaptation of this documentation).
 
 While PEtab's interface generally is very flexible, there might be specific use-cases where it cannot create an appropriate cost-function. Here, it is recommended to instead look at using [Optimization.jl](@ref optimization_parameter_fitting).
 
@@ -108,7 +108,6 @@ measurements = DataFrame(obs_id = "obs_P", time = data_ts, measurement = data_va
 
 Since, in our example, all measurements are of the same observable, we can set `obs_id="obs_P"`. However, it is also possible to [include measurements from several different observables](@ref petab_simulation_measurements_several_observables).
 
-
 ### Creating a PEtabModel
 
 Finally, we combine all inputs in a single `PEtabModel`. To it, we also pass the initial conditions of our simulations (using the `speciemap` argument). It is also possible to have [initial conditions with uncertainty](@ref petab_simulation_initial_conditions_uncertainty), [that vary between different simulations](@ref petab_simulation_conditions), or [that we attempt to fit to the data](@ref petab_simulation_initial_conditions_fitted).
@@ -619,7 +618,7 @@ There exist several types of plots for both types of calibration results. More d
 
 If you use this functionality in your research, [in addition to Catalyst](@ref doc_index_citation), please cite the following papers to support the authors of the PEtab.jl package (currently there is no article associated with this package) and the PEtab standard:
 
-```
+```bibtex
 @misc{2023Petabljl,
   author       = {Ognissanti, Damiano AND Arutjunjan, Rafael AND Persson, Sebastian AND Hasselgren, Viktor},
   title        = {{2023Petabljl.jl}},
@@ -628,7 +627,7 @@ If you use this functionality in your research, [in addition to Catalyst](@ref d
 }
 ```
 
-```
+```bibtex
 @article{SchmiesterSch2021,
   author    = {Schmiester, Leonard AND Schälte, Yannik AND Bergmann, Frank T. AND Camba, Tacio AND Dudkin, Erika AND Egert, Janine AND Fröhlich, Fabian AND Fuhrmann, Lara AND Hauber, Adrian L. AND Kemmer, Svenja AND Lakrisenko, Polina AND Loos, Carolin AND Merkt, Simon AND Müller, Wolfgang AND Pathirana, Dilan AND Raimúndez, Elba AND Refisch, Lukas AND Rosenblatt, Marcus AND Stapor, Paul L. AND Städter, Philipp AND Wang, Dantong AND Wieland, Franz-Georg AND Banga, Julio R. AND Timmer, Jens AND Villaverde, Alejandro F. AND Sahle, Sven AND Kreutz, Clemens AND Hasenauer, Jan AND Weindl, Daniel},
   journal   = {PLOS Computational Biology},
diff --git a/docs/src/inverse_problems/structural_identifiability.md b/docs/src/inverse_problems/structural_identifiability.md
index 54f2abf3..8ea86933 100644
--- a/docs/src/inverse_problems/structural_identifiability.md
+++ b/docs/src/inverse_problems/structural_identifiability.md
@@ -117,7 +117,7 @@ assess_local_identifiability(gwo; measured_quantities = [:M], loglevel = Logging
 
 We note that the results are consistent with those produced by `assess_identifiability` (with globally or locally identifiable quantities here all being assessed as at least locally identifiable).
 
-## [Finding identifiable functions](@id structural_identifiability_identifiabile_funcs)
+## [Finding identifiable functions](@id structural_identifiability_identifiable_funcs)
 
 Finally, StructuralIdentifiability provides the `find_identifiable_functions` function. Rather than determining the identifiability of each parameter and unknown of the model, it finds a set of identifiable functions, such as any other identifiable expression of the model can be generated by these. Let us again consider the Goodwind oscillator, using the `find_identifiable_functions` function we find that identifiability can be reduced to five globally identifiable expressions:
 
@@ -177,7 +177,7 @@ is currently not possible. Hopefully this will be a supported feature in the fut
 
 If you use this functionality in your research, please cite the following paper to support the authors of the StructuralIdentifiability package:
 
-```
+```bibtex
 @article{structidjl,
   author  = {Dong, R. and Goodbrake, C. and Harrington, H. and Pogudin G.},
   title   = {Differential Elimination for Dynamical Models via Projections with Applications to Structural Identifiability},
diff --git a/docs/src/model_creation/chemistry_related_functionality.md b/docs/src/model_creation/chemistry_related_functionality.md
index 5a3d3d45..fc8d1254 100644
--- a/docs/src/model_creation/chemistry_related_functionality.md
+++ b/docs/src/model_creation/chemistry_related_functionality.md
@@ -5,7 +5,6 @@ While Catalyst has primarily been designed around the modelling of biological sy
 - The `@compound` option, which enables the user to designate that a specific species is composed of certain subspecies.
 - The `balance_reaction` function, which enables the user to balance a reaction so the same number of components occur on both sides.
 
-
 ## [Modelling with compound species](@id chemistry_functionality_compounds)
 
 ### [Creating compound species programmatically](@id chemistry_functionality_compounds_programmatic)
diff --git a/docs/src/model_creation/compositional_modeling.md b/docs/src/model_creation/compositional_modeling.md
index ad9fb9d7..2a84688c 100644
--- a/docs/src/model_creation/compositional_modeling.md
+++ b/docs/src/model_creation/compositional_modeling.md
@@ -213,7 +213,7 @@ parameters for the nucleus and cytosol, and assume we are working with species
 having units of number of molecules. Rate constants will have their common
 concentration units, i.e. if ``V`` denotes the volume of a compartment then
 
-| Reaction Type | Example | Rate Constant Units | Effective rate constant (units of per time)
+| Reaction Type | Example | Rate Constant Units | Effective rate constant (units of per time) |
 |:----------:   | :----------: | :----------:  |:------------:|
 | Zero order | ``\varnothing \overset{\alpha}{\to} A`` | concentration / time | ``\alpha V`` |
 | First order | ``A \overset{\beta}{\to} B`` | (time)⁻¹ | ``\beta`` |
diff --git a/docs/src/model_creation/constraint_equations.md b/docs/src/model_creation/constraint_equations.md
index fd691183..356ce2eb 100644
--- a/docs/src/model_creation/constraint_equations.md
+++ b/docs/src/model_creation/constraint_equations.md
@@ -81,7 +81,6 @@ sol = solve(oprob, Tsit5())
 plot(sol)
 ```
 
-
 ## [Coupling ODE constraints via extending a system](@id constraint_equations_coupling_constraints)
 
 Finally, we could also construct our model by using compositional modeling. Here
@@ -143,7 +142,6 @@ sol = solve(oprob, Tsit5())
 plot(sol)
 ```
 
-
 ## [Adding events](@id constraint_equations_events)
 
 Our current model is unrealistic in assuming the cell will grow exponentially
diff --git a/docs/src/model_creation/dsl_advanced.md b/docs/src/model_creation/dsl_advanced.md
index 9ac67c1f..b3e22660 100644
--- a/docs/src/model_creation/dsl_advanced.md
+++ b/docs/src/model_creation/dsl_advanced.md
@@ -339,7 +339,7 @@ end
 
 Running the code above will yield the following error:
 
-```
+```julia
 LoadError: UndeclaredSymbolicError: Unrecognized variables A detected in reaction expression: "((k1, k2), A <--> B)". Since the flag @require_declaration is declared, all species must be explicitly declared with the @species macro.
 ```
 
@@ -553,7 +553,6 @@ species(rn)
 !!! note
     Setting spatial independent variables is primarily intended for the modelling of spatial systems on continuous domains. Catalyst's support for this is currently under development. Hence, the utility of specifying spatial independent variables is limited.
 
-
 ## [Setting reaction metadata](@id dsl_advanced_options_reaction_metadata)
 
 It is possible to supply reactions with *metadata*, containing some additional information of the reaction. A reaction's metadata follows after its declaration (first using the metadata's name, then a `=`, then its value) and is encapsulated by `[]` (where individual entries are separated by `,`). Here, we add a `description` metadata to the reactions of a birth-death process:
diff --git a/docs/src/model_creation/dsl_basics.md b/docs/src/model_creation/dsl_basics.md
index 5d58995d..b2d52ad0 100644
--- a/docs/src/model_creation/dsl_basics.md
+++ b/docs/src/model_creation/dsl_basics.md
@@ -43,7 +43,7 @@ Here, you start with `@reaction_network begin`, next list all of the model's rea
 
 Each reaction line declares, in order, the rate, the substrate(s), and the product(s). The rate is separated from the substrate(s) by a `,`, and the substrate(s) from the production by a `-->` (other arrows, however, are [also possible](@ref dsl_description_symbols_arrows)). In the above example, our model consists of two reactions. In the first one, `X` (the single substrate) becomes `Y` (the single product) at rate `2.0`. In the second reaction, `Y` becomes `X` at rate `1.0`.
 
-Finally, `rn = ` is used to store the model in the variable `rn` (a normal Julia variable, which does not need to be called `rn`).
+Finally, `rn =` is used to store the model in the variable `rn` (a normal Julia variable, which does not need to be called `rn`).
 
 ## [Defining parameters and species in the DSL](@id dsl_description_parameters_basics)
 
@@ -243,7 +243,6 @@ end
 
 is not permitted (due to this notation's similarity to a bidirectional reaction). However, if multiples are provided for substrates and/or products, like `(k1,k2), (X1,X2) --> Y`, then bundling works.
 
-
 ## [Non-constant reaction rates](@id dsl_description_nonconstant_rates)
 
 So far we have assumed that all reaction rates are constant (being either a number of a parameter). Non-constant rates that depend on one (or several) species are also possible. More generally, the rate can be any valid expression of parameters and species.
diff --git a/docs/src/model_creation/examples/hodgkin_huxley_equation.md b/docs/src/model_creation/examples/hodgkin_huxley_equation.md
index 29bc223e..fb201afa 100644
--- a/docs/src/model_creation/examples/hodgkin_huxley_equation.md
+++ b/docs/src/model_creation/examples/hodgkin_huxley_equation.md
@@ -101,7 +101,7 @@ action potential.
 ```@example hh1
 tspan = (0.0, 50.0)
 u₀ = [:V => -70, :m => 0.0, :h => 0.0, :n => 0.0,
-	  :m′ => 1.0, :n′ => 1.0, :h′ => 1.0]
+      :m′ => 1.0, :n′ => 1.0, :h′ => 1.0]
 oprob = ODEProblem(hhmodel, u₀, tspan)
 hhsssol = solve(oprob, Rosenbrock23())
 nothing # hide
diff --git a/docs/src/model_creation/examples/noise_modelling_approaches.md b/docs/src/model_creation/examples/noise_modelling_approaches.md
index c54194ed..4f5d5176 100644
--- a/docs/src/model_creation/examples/noise_modelling_approaches.md
+++ b/docs/src/model_creation/examples/noise_modelling_approaches.md
@@ -124,7 +124,6 @@ plot(sol_inputnoise; idxs = :X)
 
 Like in the previous two cases, this generates heterogeneous trajectories across our ensemble.
 
-
 ## [Investigating the mean of noisy oscillations](@id noise_modelling_approaches_model_noisy_oscillation_mean)
 
 Finally, we will observe an interesting phenomenon for ensembles of stochastic oscillators. First, we create ensemble simulations with a larger number of trajectories.
diff --git a/docs/src/model_creation/examples/programmatic_generative_linear_pathway.md b/docs/src/model_creation/examples/programmatic_generative_linear_pathway.md
index ea5c20b0..dbfd1797 100644
--- a/docs/src/model_creation/examples/programmatic_generative_linear_pathway.md
+++ b/docs/src/model_creation/examples/programmatic_generative_linear_pathway.md
@@ -155,7 +155,6 @@ sol_n20 = solve(generate_oprob(20))
 plot!(sol_n20; idxs = :Xend, label = "n = 20")
 ```
 
-
 ---
 
 ## References
diff --git a/docs/src/model_creation/examples/smoluchowski_coagulation_equation.md b/docs/src/model_creation/examples/smoluchowski_coagulation_equation.md
index e94a44f6..09fce9b8 100644
--- a/docs/src/model_creation/examples/smoluchowski_coagulation_equation.md
+++ b/docs/src/model_creation/examples/smoluchowski_coagulation_equation.md
@@ -81,7 +81,7 @@ We'll set the parameters and the initial condition that only monomers are presen
 t = default_t()
 @species (X(t))[1:N]
 
-# time-span
+# time span
 if i == 1
     tspan = (0.0, 2000.0)
 elseif i == 2
@@ -164,5 +164,5 @@ plot!(ϕ, sol[3,:] / Nₒ, line = (:dot, 4, :purple), label = "Analytical sol--X
 ## References
 
 1. [https://en.wikipedia.org/wiki/Smoluchowski\_coagulation\_equation](https://en.wikipedia.org/wiki/Smoluchowski_coagulation_equation)
-2. Scott, W. T. (1968). Analytic Studies of Cloud Droplet Coalescence I, Journal of Atmospheric Sciences, 25(1), 54-65. Retrieved Feb 18, 2021, from https://journals.ametsoc.org/view/journals/atsc/25/1/1520-0469\_1968\_025\_0054\_asocdc\_2\_0\_co\_2.xml
-3. Ian J. Laurenzi, John D. Bartels, Scott L. Diamond, A General Algorithm for Exact Simulation of Multicomponent Aggregation Processes, Journal of Computational Physics, Volume 177, Issue 2, 2002, Pages 418-449, ISSN 0021-9991, https://doi.org/10.1006/jcph.2002.7017.
+2. Scott, W. T. (1968). Analytic Studies of Cloud Droplet Coalescence I, Journal of Atmospheric Sciences, 25(1), 54-65. Retrieved Feb 18, 2021, from <https://journals.ametsoc.org/view/journals/atsc/25/1/1520-0469\_1968\_025\_0054\_asocdc\_2\_0\_co\_2.xml>
+3. Ian J. Laurenzi, John D. Bartels, Scott L. Diamond, A General Algorithm for Exact Simulation of Multicomponent Aggregation Processes, Journal of Computational Physics, Volume 177, Issue 2, 2002, Pages 418-449, ISSN 0021-9991, <https://doi.org/10.1006/jcph.2002.7017>.
diff --git a/docs/src/model_creation/functional_parameters.md b/docs/src/model_creation/functional_parameters.md
index 4a29287b..61637a02 100644
--- a/docs/src/model_creation/functional_parameters.md
+++ b/docs/src/model_creation/functional_parameters.md
@@ -41,7 +41,6 @@ plot(sol)
 !!! note
     For this simple example, $(2 + t)/(1 + t)$ could have been used directly as a reaction rate (or written as a normal function), technically making the functional parameter approach unnecessary. However, here we used this function as a simple example of how discrete data can be made continuous using DataInterpolations, and then have its values inserted using a (functional) parameter.
 
-
 ## [Inserting a customised, time-dependent, input](@id functional_parameters_circ_rhythm)
 
 Let us now go through everything again, but providing some more details. Let us first consider the input parameter. We have previously described how a [time-dependent rate can model a circadian rhythm](@ref dsl_description_nonconstant_rates_time). For real applications, due to e.g. clouds, sunlight is not a perfect sine wave. Here, a common solution is to take real sunlight data from some location and use in the model. Here, we will create synthetic (noisy) data as our light input:
diff --git a/docs/src/model_creation/model_file_loading_and_export.md b/docs/src/model_creation/model_file_loading_and_export.md
index 34dfd5e1..af0643bd 100644
--- a/docs/src/model_creation/model_file_loading_and_export.md
+++ b/docs/src/model_creation/model_file_loading_and_export.md
@@ -34,7 +34,7 @@ cc_loaded # hide
 
 Here, `include` is used to execute the Julia code from any file. This means that `save_reactionsystem` actually saves the model as executable code which re-generates the exact model which was saved (this is the reason why we use the ".jl" extension for the saved file). Indeed, we can confirm this if we check what is printed in the file:
 
-```
+```julia
 let
 
 # Independent variable:
@@ -108,7 +108,6 @@ plot(sol; idxs = [:mTetR, :mLacI, :mCI])
 
 Note that, as all initial conditions and parameters have default values, we can provide empty vectors for these into our `ODEProblem`.
 
-
 !!! note
     It should be noted that .net files support a wide range of potential model features, not all of which are currently supported by ReactionNetworkImporters. Hence, there might be some .net files which `loadrxnetwork` will not be able to load.
 
@@ -160,14 +159,13 @@ Or
 
 The advantage of these forms is that they offer a compact and very general way to represent a large class of CRNs. ReactionNetworkImporters have the functionality for converting matrices of these forms directly into Catalyst `ReactionSystem` models. Instructions on how to do this are available in [ReactionNetworkImporter's documentation](https://docs.sciml.ai/ReactionNetworkImporters/stable/#Loading-a-matrix-representation).
 
-
 ---
 
 ## [Citations](@id petab_citations)
 
 If you use any of this functionality in your research, [in addition to Catalyst](@ref doc_index_citation), please cite the paper(s) corresponding to whichever package(s) you used:
 
-```
+```bibtex
 @software{2022ReactionNetworkImporters,
   author       = {Isaacson, Samuel},
   title        = {{ReactionNetworkImporters.jl}},
@@ -176,7 +174,7 @@ If you use any of this functionality in your research, [in addition to Catalyst]
 }
 ```
 
-```
+```bibtex
 @software{2024SBMLImporter,
   author       = {Persson, Sebastian},
   title        = {{SBMLImporter.jl}},
@@ -185,16 +183,16 @@ If you use any of this functionality in your research, [in addition to Catalyst]
 }
 ```
 
-```
+```bibtex
 @article{LangJainRackauckas+2024,
-    url = {https://doi.org/10.1515/jib-2024-0003},
-    title = {SBMLToolkit.jl: a Julia package for importing SBML into the SciML ecosystem},
-    title = {},
-    author = {Paul F. Lang and Anand Jain and Christopher Rackauckas},
-    pages = {20240003},
-    journal = {Journal of Integrative Bioinformatics},
-    doi = {doi:10.1515/jib-2024-0003},
-    year = {2024},
-    lastchecked = {2024-06-02}
+  url          = {https://doi.org/10.1515/jib-2024-0003},
+  title        = {SBMLToolkit.jl: a Julia package for importing SBML into the SciML ecosystem},
+  title        = {},
+  author       = {Paul F. Lang and Anand Jain and Christopher Rackauckas},
+  pages        = {20240003},
+  journal      = {Journal of Integrative Bioinformatics},
+  doi          = {doi:10.1515/jib-2024-0003},
+  year         = {2024},
+  lastchecked  = {2024-06-02}
 }
 ```
diff --git a/docs/src/model_creation/model_visualisation.md b/docs/src/model_creation/model_visualisation.md
index 3af4c448..96b12e07 100644
--- a/docs/src/model_creation/model_visualisation.md
+++ b/docs/src/model_creation/model_visualisation.md
@@ -90,7 +90,7 @@ Finally, a [network's reaction complexes](@ref network_analysis_reaction_complex
 plot_complexes(brusselator)
 ```
 
-Here, reaction complexes are displayed as blue nodes, and reactions between complexes are displayed as black arrows. Red arrows indicate that the rate constantof a reaction has a species-dependence. Edges can be optionally labeled with their rate expressions by calling with the option `show_rate_labels`.
+Here, reaction complexes are displayed as blue nodes, and reactions between complexes are displayed as black arrows. Red arrows indicate that the rate constant of a reaction has a species-dependence. Edges can be optionally labeled with their rate expressions by calling with the option `show_rate_labels`.
 
 ```@example visualisation_graphs
 plot_complexes(brusselator, show_rate_labels = true)
diff --git a/docs/src/model_creation/programmatic_CRN_construction.md b/docs/src/model_creation/programmatic_CRN_construction.md
index 4343ab2f..d2f92af5 100644
--- a/docs/src/model_creation/programmatic_CRN_construction.md
+++ b/docs/src/model_creation/programmatic_CRN_construction.md
@@ -208,7 +208,7 @@ This ensured they were properly treated as species and not parameters. See the
 
 The [Catalyst.jl API](@ref api) provides a large variety of functionality for
 querying properties of a reaction network. Here we go over a few of the most
-useful basic functions. Given the `repressillator` defined above we have that
+useful basic functions. Given the `repressilator` defined above we have that
 
 ```@example ex
 species(repressilator)
diff --git a/docs/src/model_simulation/examples/interactive_brusselator_simulation.md b/docs/src/model_simulation/examples/interactive_brusselator_simulation.md
index 12d3c763..c5352236 100644
--- a/docs/src/model_simulation/examples/interactive_brusselator_simulation.md
+++ b/docs/src/model_simulation/examples/interactive_brusselator_simulation.md
@@ -2,7 +2,6 @@
 
 Catalyst can utilize the [GLMakie.jl](https://github.com/JuliaPlots/GLMakie.jl) package for creating interactive visualizations of your reaction network dynamics. This tutorial provides a step-by-step guide to creating an interactive visualization of the Brusselator model, building upon the basic [Brusselator](@ref basic_CRN_library_brusselator) example.
 
-
 ## [Setting up the Brusselator model](@id setup_brusselator)
 
 Let's again use the oscillating Brusselator model, extending the basic simulation [plotting](@ref simulation_plotting) workflow we saw earlier.
diff --git a/docs/src/model_simulation/finite_state_projection_simulation.md b/docs/src/model_simulation/finite_state_projection_simulation.md
index 501795fa..6cddea0c 100644
--- a/docs/src/model_simulation/finite_state_projection_simulation.md
+++ b/docs/src/model_simulation/finite_state_projection_simulation.md
@@ -219,7 +219,6 @@ heatmap(0:24, 0:24, ss_jump ./length(esol); xguide = "X₂", yguide = "X")
 
 Here we used an ensemble [output function](@ref activation_time_distribution_measurement) to only save each simulation's final state (and plot these using `heatmap`).
 
-
 ---
 
 ## References
diff --git a/docs/src/model_simulation/ode_simulation_performance.md b/docs/src/model_simulation/ode_simulation_performance.md
index 448ef49c..7b519360 100644
--- a/docs/src/model_simulation/ode_simulation_performance.md
+++ b/docs/src/model_simulation/ode_simulation_performance.md
@@ -1,7 +1,7 @@
 # [Advice for Performant ODE Simulations](@id ode_simulation_performance)
 
 We have previously described how to perform ODE simulations of *chemical reaction network* (CRN) models. These simulations are typically fast and require little additional consideration. However, when a model is simulated many times (e.g. as a part of solving an inverse problem), or is very large, simulation run
-times may become noticeable. Here we will give some advice on how to improve performance for these cases [^1].
+times may become noticeable. Here we will give some advice on how to improve performance for these cases[^1].
 
 Generally, there are few good ways to, before a simulation, determine the best options. Hence, while we below provide several options, if you face an application for which reducing run time is critical (e.g. if you need to simulate the same ODE many times), it might be required to manually trial these various options to see which yields the best performance ([BenchmarkTools.jl's](https://github.com/JuliaCI/BenchmarkTools.jl) `@btime` macro is useful for this purpose). It should be noted that the default options typically perform well, and it is primarily for large models where investigating alternative options is worthwhile. All ODE simulations of Catalyst models are performed using the OrdinaryDiffEq.jl package, [which documentation](https://docs.sciml.ai/DiffEqDocs/stable/) provides additional advice on performance.
 
@@ -62,7 +62,6 @@ Generally, ODE solvers can be divided into [*explicit* and *implicit* solvers](h
 
 Finally, we should note that stiffness is not tied to the model equations only. If we change the parameter values of our previous Brusselator model to `[:A => 1.0, :B => 4.0]`, the non-stiff `Tsit5` solver can successfully simulate it.
 
-
 ## [ODE solver selection](@id ode_simulation_performance_solvers)
 
 OrdinaryDiffEq implements an unusually large number of ODE solvers, with the performance of the simulation heavily depending on which one is chosen. These are provided as the second argument to the `solve` command, e.g. here we use the `Tsit5` solver to simulate a simple [birth-death process](@ref basic_CRN_library_bd):
@@ -119,7 +118,6 @@ time and error. Benchmarks comparing solver performance (by plotting the run tim
 
 Generally, whether solution error is a consideration depends on the application. If you want to compute the trajectory of an expensive space probe as it is sent from Earth, to slingshot Jupiter, and then reach Pluto a few years later, ensuring a minimal error will be essential. However, if you want to simulate a simple CRN to determine whether it oscillates for a given parameter set, a small error will not constitute a problem. An important aspect with regard to error is that it affects the selection of the optimal solver. E.g. if tolerance is low (generating larger errors) the `Rosenbrock23` method performs well for small, stiff, problems (again, more details can be found in [OrdinaryDiffEq's documentation](https://docs.sciml.ai/DiffEqDocs/stable/solvers/ode_solve/)).
 
-
 ## [Jacobian computation options for implicit solvers](@id ode_simulation_performance_jacobian)
 
 As [previously mentioned](@ref ode_simulation_performance_stiffness), implicit ODE solvers require the computation of the system's [*Jacobian*](https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant). The reason is (roughly) that, in each time step, these solvers need to solve a non-linear equation to find the simulation's value at the next timestep (unlike explicit solvers, which compute the value at the next time step directly). Typically this is done using [the Newton-Raphson method](https://en.wikipedia.org/wiki/Newton%27s_method), which requires the Jacobian. Especially for large systems, this can be computationally expensive (and a potential strain on available memory), in which case one might consider various Jacobian-computation options (as described below). A throughout tutorial on simulating a large, stiff, ODE can be found [here](https://docs.sciml.ai/DiffEqDocs/stable/tutorials/advanced_ode_example/#stiff).
@@ -207,7 +205,6 @@ Finally, we note that when using preconditioners with a matrix-free method (like
 
 Generally, the use of preconditioners is only recommended for advanced users who are familiar with the concepts. However, for large systems, if performance is essential, they can be worth looking into.
 
-
 ## [Elimination of system conservation laws](@id ode_simulation_performance_conservation_laws)
 
 Previously, we have described how Catalyst, when it generates ODEs, is able to [detect and eliminate conserved quantities](@ref conservation_laws). In certain cases, doing this can improve performance. E.g. in the following example we will eliminate the single conserved quantity in a [two-state model](@ref basic_CRN_library_two_states). This results in a differential algebraic equation with a single differential equation and a single algebraic equation (as opposed to two differential equations). However, as the algebraic equation is fully determined by the ODE solution, Catalyst moves it to be an observable and our new system therefore only contains one ODE that must be solved numerically. Conservation laws can be eliminated by providing the `remove_conserved = true` option to `ODEProblem`:
@@ -230,7 +227,6 @@ nothing # hide
 
 Conservation law elimination is not expected to ever impact performance negatively; it simply results in a (possibly) lower-dimensional system of ODEs to solve. However, eliminating conserved species may have minimal performance benefits; it is model-dependent whether elimination results in faster ODE solving times and/or increased solution accuracy.
 
-
 ## [Parallelisation on CPUs and GPUs](@id ode_simulation_performance_parallelisation)
 
 Whenever an ODE is simulated a large number of times (e.g. when investigating its behaviour for different parameter values), the best way to improve performance is to [parallelise the simulation over multiple processing units](https://en.wikipedia.org/wiki/Parallel_computing). Indeed, an advantage of the Julia programming language is that it was designed after the advent of parallel computing, making it well-suited for this task. Roughly, parallelisation can be divided into parallelisation on [CPUs](https://en.wikipedia.org/wiki/Central_processing_unit) and on [GPUs](https://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units). CPU parallelisation is most straightforward, while GPU parallelisation requires specialised ODE solvers (which Catalyst have access to).
@@ -415,14 +411,13 @@ Just like OrdinaryDiffEq is able to utilise parallel CPU processes to speed up t
 
 For more information on differential equation simulations on GPUs in Julia, please read [DiffEqGPU's documentation](https://docs.sciml.ai/DiffEqGPU/stable/). Furthermore, if performance is critical, [this tutorial](https://docs.sciml.ai/DiffEqGPU/stable/tutorials/lower_level_api/) provides information on how to redesign your simulation code to make it more suitable for GPU simulations.
 
-
 ---
 
 ## Citation
 
 If you use GPU simulations in your research, please cite the following paper to support the authors of the DiffEqGPU package:
 
-```
+```bibtex
 @article{utkarsh2024automated,
   title={Automated translation and accelerated solving of differential equations on multiple GPU platforms},
   author={Utkarsh, Utkarsh and Churavy, Valentin and Ma, Yingbo and Besard, Tim and Srisuma, Prakitr and Gymnich, Tim and Gerlach, Adam R and Edelman, Alan and Barbastathis, George and Braatz, Richard D and others},
diff --git a/docs/src/model_simulation/simulation_introduction.md b/docs/src/model_simulation/simulation_introduction.md
index 09f40ab1..3d440b48 100644
--- a/docs/src/model_simulation/simulation_introduction.md
+++ b/docs/src/model_simulation/simulation_introduction.md
@@ -127,7 +127,6 @@ Some additional considerations:
 - If a model without parameters has been declared, only the first three arguments must be provided to `ODEProblem`.
 - While the first value of `tspan` will almost always be `0.0`, other starting times (both negative and positive) are possible.
 
-
 ### [Designating solvers and solver options](@id simulation_intro_solver_options)
 
 While good defaults are generally selected, OrdinaryDiffEq enables the user to customise simulations through a long range of options that can be provided to the `solve` function. This includes specifying a [solver algorithm](https://en.wikipedia.org/wiki/Numerical_methods_for_ordinary_differential_equations), which can be provided as a second argument to `solve` (if none is provided, a suitable choice is automatically made). E.g. here we specify that the `Rodas5P` method should be used:
@@ -276,7 +275,7 @@ We note that this approach also enables us to successfully simulate the SDE we p
 
 Generally, using a smaller fixed `dt` provides a more exact simulation, but also increases simulation runtime.
 
-### [Scaling the noise in the chemical Langevin equation](@id simulation_intro_SDEs_noise_saling)
+### [Scaling the noise in the chemical Langevin equation](@id simulation_intro_SDEs_noise_scaling)
 
 When using the CLE to generate SDEs from a CRN, it can sometimes be desirable to scale the magnitude of the noise. This can be done by introducing a *noise scaling term*, with each noise term generated by the CLE being multiplied with this term. A noise scaling term can be set using the `@default_noise_scaling` option:
 
@@ -432,25 +431,25 @@ plot(sol; idxs = :P, lw = 2)
 
 When you simulate Catalyst models in your research, please cite the corresponding paper(s) to support the simulation package authors. For ODE simulations:
 
-```
+```bibtex
 @article{DifferentialEquations.jl-2017,
- author = {Rackauckas, Christopher and Nie, Qing},
- doi = {10.5334/jors.151},
- journal = {The Journal of Open Research Software},
- keywords = {Applied Mathematics},
- note = {Exported from https://app.dimensions.ai on 2019/05/05},
- number = {1},
- pages = {},
- title = {DifferentialEquations.jl – A Performant and Feature-Rich Ecosystem for Solving Differential Equations in Julia},
- url = {https://app.dimensions.ai/details/publication/pub.1085583166 and http://openresearchsoftware.metajnl.com/articles/10.5334/jors.151/galley/245/download/},
- volume = {5},
- year = {2017}
+  author = {Rackauckas, Christopher and Nie, Qing},
+  doi = {10.5334/jors.151},
+  journal = {The Journal of Open Research Software},
+  keywords = {Applied Mathematics},
+  note = {Exported from https://app.dimensions.ai on 2019/05/05},
+  number = {1},
+  pages = {},
+  title = {DifferentialEquations.jl – A Performant and Feature-Rich Ecosystem for Solving Differential Equations in Julia},
+  url = {https://app.dimensions.ai/details/publication/pub.1085583166 and http://openresearchsoftware.metajnl.com/articles/10.5334/jors.151/galley/245/download/},
+  volume = {5},
+  year = {2017}
 }
 ```
 
 For SDE simulations:
 
-```
+```bibtex
 @article{rackauckas2017adaptive,
   title={Adaptive methods for stochastic differential equations via natural embeddings and rejection sampling with memory},
   author={Rackauckas, Christopher and Nie, Qing},
@@ -465,19 +464,20 @@ For SDE simulations:
 
 For jump simulations:
 
-```
+```bibtex
 @misc{2022JumpProcesses,
   author       = {Isaacson, S. A. and Ilin, V. and Rackauckas, C. V.},
   title        = {{JumpProcesses.jl}},
   howpublished = {\url{https://github.com/SciML/JumpProcesses.jl/}},
   year         = {2022}
 }
+
 @misc{zagatti_extending_2023,
-	title = {Extending {JumpProcess}.jl for fast point process simulation with time-varying intensities},
-	url = {http://arxiv.org/abs/2306.06992},
-	doi = {10.48550/arXiv.2306.06992},
-	publisher = {arXiv},
-	author = {Zagatti, Guilherme Augusto and Isaacson, Samuel A. and Rackauckas, Christopher and Ilin, Vasily and Ng, See-Kiong and Bressan, Stéphane},
-	year = {2023},
+  title = {Extending {JumpProcess}.jl for fast point process simulation with time-varying intensities},
+  url = {http://arxiv.org/abs/2306.06992},
+  doi = {10.48550/arXiv.2306.06992},
+  publisher = {arXiv},
+  author = {Zagatti, Guilherme Augusto and Isaacson, Samuel A. and Rackauckas, Christopher and Ilin, Vasily and Ng, See-Kiong and Bressan, Stéphane},
+  year = {2023},
 }
 ```
diff --git a/docs/src/network_analysis/crn_theory.md b/docs/src/network_analysis/crn_theory.md
index f1c82ab0..2d9d93f7 100644
--- a/docs/src/network_analysis/crn_theory.md
+++ b/docs/src/network_analysis/crn_theory.md
@@ -78,7 +78,7 @@ The graphs of the reaction complexes in the two sub-networks are then
 and,
 
 ```@example s1b
- plot_complexes(subnets[2])
+  plot_complexes(subnets[2])
 ```
 
 ## [Deficiency of the network](@id network_analysis_structural_aspects_deficiency)
@@ -141,12 +141,11 @@ reactioncomplexes(rn)
 δ = deficiency(rn)
 ```
 
-Quoting Feinberg [^1]
+Quoting Feinberg[^1]
 > Deficiency zero networks are ones for which the reaction vectors [i.e. net
 > stoichiometry vectors] are as independent as the partition of complexes into
 > linkage classes will allow.
 
-
 ## [Reversibility of the network](@id network_analysis_structural_aspects_reversibility)
 
 A reaction network is *reversible* if the "arrows" of the reactions are
diff --git a/docs/src/network_analysis/odes.md b/docs/src/network_analysis/odes.md
index 913ffb69..4afdd652 100644
--- a/docs/src/network_analysis/odes.md
+++ b/docs/src/network_analysis/odes.md
@@ -9,7 +9,7 @@ Network Theory*[^1] for more discussion about the concepts on this page.
 
 Note, currently API functions for network analysis and conservation law analysis
 do not work with constant species (which are generated by SBML, and can be [declared
-in Catalyst as well](@ref dsl_advanced_options_constant_species).
+in Catalyst as well](@ref dsl_advanced_options_constant_species)).
 
 ## [Network representation of the Repressilator `ReactionSystem`](@id network_analysis_repressilator_representation)
 
diff --git a/docs/src/spatial_modelling/lattice_reaction_systems.md b/docs/src/spatial_modelling/lattice_reaction_systems.md
index 4c9da8a9..5b5bfd71 100644
--- a/docs/src/spatial_modelling/lattice_reaction_systems.md
+++ b/docs/src/spatial_modelling/lattice_reaction_systems.md
@@ -14,7 +14,6 @@ Features for which support is planned in future updates include:
 
 This tutorial introduces spatial modelling on discrete domains, here called lattices. It describes the basics of creating and simulating such models. To do so, it uses ODE simulations as examples. Additional tutorials provide further details on how to interact with [spatial simulation structures](@ref lattice_simulation_plotting) and [plot spatial simulations](@ref lattice_simulation_plotting), and also provide further details on [ODE](@ref spatial_lattice_ode_simulations) and [jump](@ref spatial_lattice_jump_simulations) simulations, respectively.
 
-
 ## [Basic example of a spatial simulation on a discrete domain](@id spatial_lattice_modelling_intro_example)
 
 To perform discrete-space spatial simulations, the user must first define a [`LatticeReactionSystem`](@ref). These combine:
diff --git a/docs/src/spatial_modelling/lattice_simulation_structure_ interaction.md b/docs/src/spatial_modelling/lattice_simulation_structure_ interaction.md
index 489ef472..7bf894ec 100644
--- a/docs/src/spatial_modelling/lattice_simulation_structure_ interaction.md	
+++ b/docs/src/spatial_modelling/lattice_simulation_structure_ interaction.md	
@@ -150,8 +150,7 @@ There are two different circumstances when `rebuild_lat_internals!` must be call
 
 Parameter values of integrators can be interfaced with just like for problems (this is primarily relevant when using [*callbacks*](https://docs.sciml.ai/DiffEqDocs/stable/features/callback_functions/)). Again, after doing so, the `rebuild_lat_internals!` function might need to be applied to the integrator.
 
-
-### [Retrieving and updatingedge  parameter values in problems and integrators](@id lattice_simulation_structure_interaction_prob_int_parameters_edge_ps)
+### [Retrieving and updating edge parameter values in problems and integrators](@id lattice_simulation_structure_interaction_prob_int_parameters_edge_ps)
 
 The `lat_getp` and `lat_setp!` functions cannot currently be applied to [edge parameters](@ref spatial_lattice_modelling_intro_simulation_edge_parameters). Instead, to access the value of an edge parameter, use
 
diff --git a/docs/src/steady_state_functionality/bifurcation_diagrams.md b/docs/src/steady_state_functionality/bifurcation_diagrams.md
index d27c5a21..0b1e004d 100644
--- a/docs/src/steady_state_functionality/bifurcation_diagrams.md
+++ b/docs/src/steady_state_functionality/bifurcation_diagrams.md
@@ -155,7 +155,6 @@ Finally, for additional clarity, we reiterate the purpose of the two `u` argumen
 - `u_guess`: A guess of the initial steady states (which BifurcationKit uses to find its starting point). Typically, most trivial guesses work (e.g. setting all species concentrations to `1.0`). `u_guess` *does not* have to fulfil the conserved concentrations provided in `u0`.
 - `u0`: Used to compute the concentrations of any conserved quantities (e.g. in our example $X + Xp = 1.0$). Technically, values are only required for species that are involved in conservation laws (in our case we do not need to provide a value for $K$). However, sometimes determining which species are actually involved in conservation laws can be difficult, and it might be easier to simply provide concentrations for all species.
 
-
 ---
 
 ## [Citation](@id bifurcationkit_periodic_orbits_citation)
diff --git a/docs/src/steady_state_functionality/dynamical_systems.md b/docs/src/steady_state_functionality/dynamical_systems.md
index 6c82b4ce..46d39a8a 100644
--- a/docs/src/steady_state_functionality/dynamical_systems.md
+++ b/docs/src/steady_state_functionality/dynamical_systems.md
@@ -145,14 +145,13 @@ Here, all Lyapunov exponents are negative, confirming that the brusselator is no
 
 More details on how to compute Lyapunov exponents using DynamicalSystems.jl can be found [here](https://juliadynamics.github.io/ChaosTools.jl/stable/lyapunovs/). A full overview of tools for analysing chaotic behaviours (using the "ChaosTools.jl subpackage) can be found [here](https://juliadynamics.github.io/ChaosTools.jl/stable/).
 
-
 ---
 
 ## [Citations](@id dynamical_systems_citations)
 
 If you use this functionality in your research, [in addition to Catalyst](@ref doc_index_citation), please cite the following paper to support the author of the DynamicalSystems.jl package:
 
-```
+```bibtex
 @article{DynamicalSystems.jl-2018,
   doi = {10.21105/joss.00598},
   url = {https://doi.org/10.21105/joss.00598},
@@ -167,13 +166,11 @@ If you use this functionality in your research, [in addition to Catalyst](@ref d
 }
 ```
 
-
 ---
 
 ## Learning more
 
-If you want to learn more about analysing dynamical systems, including chaotic behaviour, see the textbook [Nonlinear Dynamics](https://link.springer.com/book/10.1007/978-3-030-91032-7). It utilizes DynamicalSystems.jl and provides a concise, hands-on approach to learning nonlinear dynamics and analysing dynamical systems [^3].
-
+If you want to learn more about analysing dynamical systems, including chaotic behaviour, see the textbook [Nonlinear Dynamics](https://link.springer.com/book/10.1007/978-3-030-91032-7). It utilizes DynamicalSystems.jl and provides a concise, hands-on approach to learning nonlinear dynamics and analysing dynamical systems[^3].
 
 ---
 
diff --git a/docs/src/steady_state_functionality/examples/bifurcationkit_codim2.md b/docs/src/steady_state_functionality/examples/bifurcationkit_codim2.md
index 879124a6..09cfd6d6 100644
--- a/docs/src/steady_state_functionality/examples/bifurcationkit_codim2.md
+++ b/docs/src/steady_state_functionality/examples/bifurcationkit_codim2.md
@@ -141,7 +141,6 @@ sol_osc = OrdinaryDiffEqDefault.solve(oprob_osc)
 plot(plot(sol_nosc; title = "No oscillation"), plot(sol_osc; title = "Oscillation"); size = (1000, 400), lw = 4)
 ```
 
-
 ---
 
 ## [Citation](@id bifurcationkit_periodic_orbits_citation)
diff --git a/docs/src/steady_state_functionality/examples/bifurcationkit_periodic_orbits.md b/docs/src/steady_state_functionality/examples/bifurcationkit_periodic_orbits.md
index e51a6b06..28ad01be 100644
--- a/docs/src/steady_state_functionality/examples/bifurcationkit_periodic_orbits.md
+++ b/docs/src/steady_state_functionality/examples/bifurcationkit_periodic_orbits.md
@@ -117,7 +117,6 @@ plot(br_po, vars = (:param, :period); xguide = bif_par, yguide = "Period length"
 
 In the plot we see that the period starts at around $18$ time units, and slowly increase with $v$.
 
-
 ---
 
 ## [Citation](@id bifurcationkit_periodic_orbits_citation)
diff --git a/docs/src/steady_state_functionality/homotopy_continuation.md b/docs/src/steady_state_functionality/homotopy_continuation.md
index 67ce42dd..fcf28dc3 100644
--- a/docs/src/steady_state_functionality/homotopy_continuation.md
+++ b/docs/src/steady_state_functionality/homotopy_continuation.md
@@ -11,7 +11,6 @@ integer Hill exponents). The roots of these can reliably be found through a
 
 Catalyst contains a special homotopy continuation extension that is loaded whenever HomotopyContinuation.jl is. This exports a single function, `hc_steady_states`, that can be used to find the steady states of any `ReactionSystem` structure.
 
-
 For this tutorial, we will use the [Wilhelm model](@ref basic_CRN_library_wilhelm) (which
 demonstrates bistability in a small chemical reaction network). We declare the
 model and the parameter set for which we want to find the steady states:
@@ -69,14 +68,13 @@ hc_steady_states(two_state_model, ps; u0)
 - When providing initial conditions to compute conservation laws, values are only required for those species that are part of conserved quantities. If this set of species is unknown, it is recommended to provide initial conditions for all species.
 - Additional arguments provided to `hc_steady_states` are automatically passed to HomotopyContinuation's `solve` command. Use e.g. `show_progress = false` to disable the progress bar.
 
-
 ---
 
 ## [Citation](@id homotopy_continuation_citation)
 
 If you use this functionality in your research, please cite the following paper to support the authors of the HomotopyContinuation package:
 
-```
+```bibtex
 @inproceedings{HomotopyContinuation.jl,
   title={{H}omotopy{C}ontinuation.jl: {A} {P}ackage for {H}omotopy {C}ontinuation in {J}ulia},
   author={Breiding, Paul and Timme, Sascha},
@@ -87,11 +85,10 @@ If you use this functionality in your research, please cite the following paper
 }
 ```
 
-
 ---
 
 ## References
 
-[^1]: [Andrew J Sommese, Charles W Wampler *The Numerical Solution of Systems of Polynomials Arising in Engineering and Science*, World Scientific (2005).](https://www.worldscientific.com/worldscibooks/10.1142/5763#t=aboutBook)
+[^1]: [Andrew J. Sommese, Charles W. Wampler *The Numerical Solution of Systems of Polynomials Arising in Engineering and Science*, World Scientific (2005).](https://www.worldscientific.com/worldscibooks/10.1142/5763#t=aboutBook)
 [^2]: [Daniel J. Bates, Paul Breiding, Tianran Chen, Jonathan D. Hauenstein, Anton Leykin, Frank Sottile, *Numerical Nonlinear Algebra*, arXiv (2023).](https://arxiv.org/abs/2302.08585)
 [^3]: [Paul Breiding, Sascha Timme, *HomotopyContinuation.jl: A Package for Homotopy Continuation in Julia*, International Congress on Mathematical Software (2018).](https://link.springer.com/chapter/10.1007/978-3-319-96418-8_54)
diff --git a/docs/src/steady_state_functionality/nonlinear_solve.md b/docs/src/steady_state_functionality/nonlinear_solve.md
index 330b0877..9f4b887f 100644
--- a/docs/src/steady_state_functionality/nonlinear_solve.md
+++ b/docs/src/steady_state_functionality/nonlinear_solve.md
@@ -127,7 +127,7 @@ ssprob = SteadyStateProblem(dimer_production, u0, p)
 nothing # hide
 ```
 
-Finally, we can find the steady states using the `solver` command. Since `SteadyStateProblem`s are solved through forward ODE simulation, we must load the sublibrary of the [OrdinaryDiffEq.jl](https://github.com/SciML/OrdinaryDiffEq.jl) package that corresponds to the [selected ODE solver](@ref simulation_intro_solver_options). Any available ODE solver can be used, however, it has to be encapsulated by the `DynamicSS()` function. E.g. here we use the `Rodas5P` solver which is loaded from the `OrdinaryDiffEqRosenbrock` sublibrary:
+Finally, we can find the steady states using the `solver` command. Since `SteadyStateProblem`s are solved through forward ODE simulation, we must load the sub-library of the [OrdinaryDiffEq.jl](https://github.com/SciML/OrdinaryDiffEq.jl) package that corresponds to the [selected ODE solver](@ref simulation_intro_solver_options). Any available ODE solver can be used, however, it has to be encapsulated by the `DynamicSS()` function. E.g. here we use the `Rodas5P` solver which is loaded from the `OrdinaryDiffEqRosenbrock` sub-library:
 
 (which requires loading the SteadyStateDiffEq package).
 
@@ -161,14 +161,13 @@ nothing # hide
 
 However, especially when the forward ODE simulation approach is used, it is recommended to use the problem type which corresponds to the intended solver.
 
-
 ---
 
 ## [Citations](@id nonlinear_solve_citation)
 
 If you use this functionality in your research, [in addition to Catalyst](@ref doc_index_citation), please cite the following paper to support the authors of the NonlinearSolve.jl package:
 
-```
+```bibtex
 @article{pal2024nonlinearsolve,
   title={NonlinearSolve. jl: High-Performance and Robust Solvers for Systems of Nonlinear Equations in Julia},
   author={Pal, Avik and Holtorf, Flemming and Larsson, Axel and Loman, Torkel and Schaefer, Frank and Qu, Qingyu and Edelman, Alan and Rackauckas, Chris and others},
@@ -177,7 +176,6 @@ If you use this functionality in your research, [in addition to Catalyst](@ref d
 }
 ```
 
-
 ---
 
 ## References
diff --git a/docs/src/v14_migration_guide.md b/docs/src/v14_migration_guide.md
index de41f404..69a3a6ee 100644
--- a/docs/src/v14_migration_guide.md
+++ b/docs/src/v14_migration_guide.md
@@ -255,7 +255,7 @@ This bug was likely present on earlier versions as well, but was only recently d
 
 In early versions of Catalyst, parameters and species were provided as vectors (e.g. `[1.0, 2.0]`) rather than maps (e.g. `[p => 1.0, d => 2.0]`). While we previously *strongly* recommended users to use the map form (or they might produce unintended results), the vector form was still supported (technically). Due to recent internal ModelingToolkit updates, the purely numeric form is no longer supported and should never be used -- it will potentially lead to incorrect values for parameters and/or initial conditions. Note that if `rn` is a complete `ReactionSystem` you can now specify such mappings via `[rn.p => 1.0, rn.d => 2.0]`.
 
-*Users should never use vector-forms to represent parameter and species values*
+*Users should never use vector-forms to represent parameter and species values.*  <!-- markdownlint-disable-line MD036 -->
 
 #### Additional deprecated functions
 
diff --git a/test/upstream/mtk_problem_inputs.jl b/test/upstream/mtk_problem_inputs.jl
index 35497e16..2167a18d 100644
--- a/test/upstream/mtk_problem_inputs.jl
+++ b/test/upstream/mtk_problem_inputs.jl
@@ -284,7 +284,7 @@ begin
         (:p => [4.0, 5.0], :d => [0.2, 0.5]),
     ]
 
-    # Declares a timespan.
+    # Declares a time span.
     tspan = (0.0, 10.0)
 end

So if you would jump over your shadows and would accept the formatting changes, the other changes won't be lost ... (if you are not willing to invest the time of cherry-picking and resolving the merge conflicts yourself). Looking forward to your answer ...

@JuliaRegistrator
Copy link

Error while trying to register: Register Failed
@Mo-Gul, it looks like you are not a publicly listed member/owner in the parent organization (SciML).
If you are a member/owner, you will need to change your membership to public. See GitHub Help

@TorkelE
Copy link
Member

TorkelE commented Nov 24, 2025

I think the fundamental problem is that both me and Sam are really quite busy right now, and have limited time avaiable for the package. So we'd rather spend the limited time we have to sort out various essential stuff to actually ensure that the package is up and running, rather than reading through formatting changes that don't have any direct impact. I.e. sorting out stuff like #1339 (which, once it is sorted out, any further PRs would need to be based upon to actually pass CI).

So either we have really straightforward changes we can quickly check (i.e. fixing obvious spelling mistakes), or we will simply have to take anything that requires non-trivial reviewing after #1339 and probably also #1322

@Mo-Gul
Copy link
Contributor Author

Mo-Gul commented Nov 25, 2025

Then the decision is made. I'll also invest my time in something else now. I leave this PR open and it is up to you to close it if you are sure you will not merge it.

If you should invest the time to have a(nother) look: Assuming you "trust" me that I didn't do any harm with the three "whitespace" commits, it took me less than 3 minutes to go through the provided patch in my previous comment ...

@isaacsas isaacsas closed this Nov 25, 2025
@isaacsas
Copy link
Member

I’m going to close this then. If at any point you’d like to submit a PR without the white space changes we will happily review it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants