Skip to content

Commit 3b7342c

Browse files
committed
Add srcset support to mathmpl sphinx extension.
And set it to include 2x in our docs, like with sphinx gallery.
1 parent f259bf8 commit 3b7342c

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

doc/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ def _check_dependencies():
179179

180180
plot_gallery = 'True'
181181
mathmpl_fontsize = 11.0
182+
mathmpl_srcset = ['2x']
182183

183184
# Monkey-patching gallery signature to include search keywords
184185
gen_rst.SPHX_GLR_SIG = """\n

lib/matplotlib/sphinxext/mathmpl.py

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from docutils import nodes
55
from docutils.parsers.rst import Directive, directives
66
import sphinx
7+
from sphinx.errors import ConfigError, ExtensionError
78

89
import matplotlib as mpl
910
from matplotlib import _api, mathtext
@@ -52,11 +53,11 @@ def run(self):
5253

5354

5455
# This uses mathtext to render the expression
55-
def latex2png(latex, filename, fontset='cm', fontsize=10):
56+
def latex2png(latex, filename, fontset='cm', fontsize=10, dpi=100):
5657
with mpl.rc_context({'mathtext.fontset': fontset, 'font.size': fontsize}):
5758
try:
5859
depth = mathtext.math_to_image(
59-
f"${latex}$", filename, dpi=100, format="png")
60+
f"${latex}$", filename, dpi=dpi, format="png")
6061
except Exception:
6162
_api.warn_external(f"Could not render math expression {latex}")
6263
depth = 0
@@ -74,10 +75,21 @@ def latex2html(node, source):
7475

7576
destdir = Path(setup.app.builder.outdir, '_images', 'mathmpl')
7677
destdir.mkdir(parents=True, exist_ok=True)
77-
dest = destdir / f'{name}.png'
7878

79+
dest = destdir / f'{name}.png'
7980
depth = latex2png(latex, dest, fontset, fontsize=fontsize)
8081

82+
srcset = []
83+
for size in setup.app.config.mathmpl_srcset:
84+
filename = f'{name}-{size.replace(".", "_")}.png'
85+
latex2png(latex, destdir / filename, fontset, fontsize=fontsize,
86+
dpi=100 * float(size[:-1]))
87+
srcset.append(
88+
f'{setup.app.builder.imgpath}/mathmpl/{filename} {size}')
89+
if srcset:
90+
srcset = (f'srcset="{setup.app.builder.imgpath}/mathmpl/{name}.png, ' +
91+
', '.join(srcset) + '" ')
92+
8193
if inline:
8294
cls = ''
8395
else:
@@ -88,12 +100,35 @@ def latex2html(node, source):
88100
style = ''
89101

90102
return (f'<img src="{setup.app.builder.imgpath}/mathmpl/{name}.png"'
91-
f' {cls}{style}/>')
103+
f' {srcset}{cls}{style}/>')
104+
105+
106+
def _config_inited(app, config):
107+
# Check for srcset hidpi images
108+
for i, size in enumerate(app.config.mathmpl_srcset):
109+
if size[-1] == 'x': # "2x" = "2.0"
110+
try:
111+
float(size[:-1])
112+
except ValueError:
113+
raise ConfigError(
114+
f'Invalid value for mathmpl_srcset parameter: {size!r}. '
115+
'Must be a list of strings with the multiplicative '
116+
'factor followed by an "x". e.g. ["2.0x", "1.5x"]')
117+
else:
118+
raise ConfigError(
119+
f'Invalid value for mathmpl_srcset parameter: {size!r}. '
120+
'Must be a list of strings with the multiplicative '
121+
'factor followed by an "x". e.g. ["2.0x", "1.5x"]')
92122

93123

94124
def setup(app):
95125
setup.app = app
96126
app.add_config_value('mathmpl_fontsize', 10.0, True)
127+
app.add_config_value('mathmpl_srcset', [], True)
128+
try:
129+
app.connect('config-inited', _config_inited) # Sphinx 1.8+
130+
except ExtensionError:
131+
app.connect('env-updated', lambda app, env: _config_inited(app, None))
97132

98133
# Add visit/depart methods to HTML-Translator:
99134
def visit_latex_math_html(self, node):

0 commit comments

Comments
 (0)