| """Utility functions for math.""" |
| |
| from __future__ import annotations |
| |
| from typing import TYPE_CHECKING |
| |
| if TYPE_CHECKING: |
| from docutils import nodes |
| |
| from sphinx.builders.html import HTML5Translator |
| |
| |
| def get_node_equation_number(writer: HTML5Translator, node: nodes.math_block) -> str: |
| if writer.builder.config.math_numfig and writer.builder.config.numfig: |
| figtype = 'displaymath' |
| if writer.builder.name == 'singlehtml': |
| key = f"{writer.docnames[-1]}/{figtype}" # type: ignore[has-type] |
| else: |
| key = figtype |
| |
| id = node['ids'][0] |
| number = writer.builder.fignumbers.get(key, {}).get(id, ()) |
| return '.'.join(map(str, number)) |
| else: |
| return node['number'] |
| |
| |
| def wrap_displaymath(text: str, label: str | None, numbering: bool) -> str: |
| def is_equation(part: str) -> str: |
| return part.strip() |
| |
| if label is None: |
| labeldef = '' |
| else: |
| labeldef = r'\label{%s}' % label |
| numbering = True |
| |
| parts = list(filter(is_equation, text.split('\n\n'))) |
| equations = [] |
| if len(parts) == 0: |
| return '' |
| elif len(parts) == 1: |
| if numbering: |
| begin = r'\begin{equation}' + labeldef |
| end = r'\end{equation}' |
| else: |
| begin = r'\begin{equation*}' + labeldef |
| end = r'\end{equation*}' |
| equations.append('\\begin{split}%s\\end{split}\n' % parts[0]) |
| else: |
| if numbering: |
| begin = r'\begin{align}%s\!\begin{aligned}' % labeldef |
| end = r'\end{aligned}\end{align}' |
| else: |
| begin = r'\begin{align*}%s\!\begin{aligned}' % labeldef |
| end = r'\end{aligned}\end{align*}' |
| for part in parts: |
| equations.append('%s\\\\\n' % part.strip()) |
| |
| concatenated_equations = ''.join(equations) |
| return f'{begin}\n{concatenated_equations}{end}' |