## tex2png

Latest update:

What do you do when you need to add a formula to a epub? Most epub readers don't support MathML yet, hence you resort to making SVGs via mathjax-node-cli. Then you test the epub on several über popular readers to discover that only Kindle & Google Play Books render such SVGs correctly, the rest either loses all the characters in equations (KOReader) or just draws sad little boxes in place of the images (Moon+ Reader).

How do you produce PNGs then? In the past, mathjax-node had an option of a png export, but it has been deprecated.

There's a way to do it w/ pdflatex: (1) generate a pdf w/ the help of texlive-standalone package, (2) convert the pdf to a png.

This doesn't sound complicated & it's not complicated, but there's no helpful wrappers available and if you want to integrate the tex→png process into your build pipeline, prepare to deal w/ the usual aux/log rubbish that any TeX program leaves around.

Here's a makefile that does the conversion:

```
#!/usr/bin/make -f
$(if $(f),,$(error "Usage: tex2img f='E=mc^2' output.png"))
dpi := 600
devnull := $(if $(findstring s,$(word 1, $(MAKEFLAGS))),> /dev/null)
inkscape = inkscape --pdf-poppler -Tlp $< -o $@
%.pdf:
pdflatex -jobname "$(basename $@)" -interaction=batchmode '\nofiles\documentclass[border=0.2pt]{standalone}\usepackage{amsmath}\usepackage{varwidth}\begin{document}\begin{varwidth}{\linewidth}\[ '$(call se,$(f))' \]\end{varwidth}\end{document}' $(devnull)
@rm -f "$(basename $@).log"
%.png: %.pdf; $(inkscape) -d $(dpi)
%.svg: %.pdf; $(inkscape)
se = '$(subst ','\'',$1)'
```

It automatically removes all intermidiate files; iff you mistype a formula it saves a .log file to peruse.

For example, render Parkinson's coefficient of inefficiency (published in ~1957):

```
$ ./tex2png -s output.png f='x = \frac{m^{o}(a-d)}{y + p\sqrt{b}}'
```

(*x* = the number of members effectively present at the moment when
the efficient working of a committee has become manifestly impossible;
*m* = the average number of members actually present; *o* = the
number of members influenced by outside pressure groups; *a* = the
average age of the members; *d* = the distance in cm between the two
members who are seated farthest from each other; *y* = the number of
years since the cabinet or committee was first formed; *p* = the
patience of the chairman, as measured on the Peabody scale; *b* = the
average blood pressure of the three oldest members, taken shortly
before the time of meeting.)

Tags: ойті

Authors: ag