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 in 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: tex2png f='E=mc^2' output.png"))

dpi := 600

devnull := $(if $(findstring s, $(MAKEFLAGS)),> /dev/null)

%.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

gs -sDEVICE=pngalpha -dQUIET -dBATCH -dNOPAUSE -r$(dpi) -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile="$@" "$<"

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.)

## No comments:

## Post a Comment