From adecf9386535141e6d5b8a91937158ba0b69f75c Mon Sep 17 00:00:00 2001
From: Bryn Pickering <17178478+brynpickering@users.noreply.github.com>
Date: Wed, 27 Dec 2023 14:37:37 +0000
Subject: [PATCH] MathJax -> KaTeX
---
docs/overrides/main.html | 29 +++++++--------------
mkdocs.yml | 3 ---
src/calliope/backend/latex_backend_model.py | 26 +++++++++++++++++-
3 files changed, 34 insertions(+), 24 deletions(-)
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
index ba9d5087..f8b73196 100644
--- a/docs/overrides/main.html
+++ b/docs/overrides/main.html
@@ -20,24 +20,13 @@
{{ super() }}
-
+
+
+
+
+
+
+
+
{% endblock %}
diff --git a/mkdocs.yml b/mkdocs.yml
index d1a34632..7c17a601 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -56,9 +56,6 @@ markdown_extensions:
preserve_tabs: true
- pymdownx.snippets
-extra_javascript:
- - https://polyfill.io/v3/polyfill.min.js?features=es6
- - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
nav:
- Home: index.md
diff --git a/src/calliope/backend/latex_backend_model.py b/src/calliope/backend/latex_backend_model.py
index 5c1c8c41..dc2e3525 100644
--- a/src/calliope/backend/latex_backend_model.py
+++ b/src/calliope/backend/latex_backend_model.py
@@ -1,6 +1,7 @@
from __future__ import annotations
import logging
+import re
import textwrap
import typing
from pathlib import Path
@@ -254,7 +255,7 @@ class LatexBackendModel(backend_model.BackendModelGenerator):
{% if equation.expression != "" %}
$$
- {{ equation.expression | trim }}
+ {{ equation.expression | trim | escape_underscores | escape_text_in_text }}
$$
{% endif %}
{% endfor %}
@@ -484,8 +485,31 @@ def _generate_math_string(
@staticmethod
def _render(template: str, **kwargs) -> str:
+ text_starter = r"\\text(?:bf|it)?" # match one of `\text`, `\textit`, `\textbf`
+
+ def __escape_underscore(instring):
+ "KaTeX requires underscores in `\text{...}` blocks to be escaped."
+ return re.sub(
+ rf"{text_starter}{{.*?}}",
+ lambda x: x.group(0).replace("_", r"\_"),
+ instring,
+ )
+
+ def __escape_text_in_text(instring):
+ """KaTeX requires `\text{...}` blocks within `\text{...}` blocks to be placed within math blocks.
+
+ We use `\\(` as the math block descriptor.
+ """
+ return re.sub(
+ rf"{text_starter}{{(?:[^{{}}]*({text_starter}{{.*?}})[^{{}}]*?)?}}",
+ lambda x: x.group(0).replace(x.group(1), rf"\({x.group(1)}\)"),
+ instring,
+ )
+
jinja_env = jinja2.Environment(trim_blocks=True, autoescape=False)
jinja_env.filters["removesuffix"] = lambda val, remove: val.removesuffix(remove)
+ jinja_env.filters["escape_underscores"] = __escape_underscore
+ jinja_env.filters["escape_text_in_text"] = __escape_text_in_text
return jinja_env.from_string(template).render(**kwargs)
def _get_capacity_bounds(