62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
|
"""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}'
|