Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
MathJax (mathjax.org)
116 points by tosh on Oct 10, 2020 | hide | past | favorite | 42 comments


I use MathJax for rendering equations on https://ultimateelectronicsbook.com/ and it's worked very well from a rendering quality perspective. I looked at Katex for performance, but it didn't support all of the LaTeX formatting that I use.

You can scroll through https://ultimateelectronicsbook.com/systems-of-equations/ for a particularly formatting-heavy example with lots of matrix equations and augmented matrices, working through Gaussian decomposition and LU factorization examples.

Instead, for performance, I wrote a small Ruby / Jekyll plugin to do MathJax server-side rendering. It calls the mathjax-node npm package, with some caching on top because it's so slow. This outputs static HTML and CSS with a few math fonts.

The mathjax-node-sre npm package even populates aria-label fields for each equation:

    <span class="mjx-math" aria-label="y left-parenthesis x right-parenthesis equals StartFraction 1 Over 1 plus x EndFraction">...</span>
If you have the option to consider server-side equation rendering, your users may thank you.


> If you have the option to consider server-side equation rendering, your users may thank you.

I'm developing KeenWrite[0], a desktop-based text editor that provides real-time rendering of TeX. It has two TeX-related HTML export formats: SVG (no rendering for either client or server) or TeX (requires client-side rendering). Behind the scenes it uses a highly-optimized version of JMathTeX[1] that includes a custom renderer to handle translating math font glyphs into SVG paths.

[0]: https://github.com/DaveJarvis/keenwrite

[1]: https://github.com/DaveJarvis/JMathTeX


I hooked up something similar when I was writing "julia as a cli calculator" [1], but it uses real TeX behind the scene, which gives me the opportunity to utilize existing TeX ecosystem such as TikZ and typography. Accessibility can be a problem, but I think it's possible to include some hints via the title attributes with some work.

I hope to see more server-side solutions. The customizability and client-side overhead (you only need to render once on the server, possibly with caching) is not something a client-side library can achieve.

[1]: https://krasjet.com/rnd.wlk/julia/


Slightly off-topic, but I really like the layout and feel of your website. I find the fonts and colours to be quite pleasing, and the site loads incredibly quickly.


Thanks! I am not a designer so that's accidental -- and much credit is probably due to the default Jekyll theme (https://github.com/jekyll/minima). But performance optimization is something I enjoy and something I do as a break from writing the actual content.



If you are at all concerned with performance and can sacrifice a couple features (fewer supported text formatting options & mathematical elements, less legacy support for some browsers). Katex is a great alternative.

https://katex.org/


Actually, the recent MathJax 3 is quite fast as you can see in this benchmark:

https://www.intmath.com/cg5/katex-mathjax-comparison.php?pro...

Still not as fast as KaTeX though.


Wow! That's a really impressive difference.

My android phone gets ~2700ms for KaTeX, ~3100ms for MathJax 3, ~17000ms for MathJax 2.7. There were times KaTeX and MathJax traded which I'm guessing is due to page size differences and my poor Internet connection.


Last time I compared Katex to MathJax, I was also very pleased by Katex's synchronous rendering support, as compared to mathjax.

In CoCalc.com I made it use Katex, but if there is an error it falls back to MathJax.


MathJax can do synchronous also, but it's a config option. The fact that it defaults to async really saddles it with the perception that it's incredibly slow. The async operation basically forces the browser to through many, many rounds of relayout, when in most cases it would be much more efficient to do it in one batch.


> In CoCalc.com I made it use Katex, but if there is an error it falls back to MathJax.

What % of Katex's rendering attempts fail over to MathJax?


I don't track that, but based on last time when I broke the fallback... it is important to have the fallback. There are cases where MathJax can handle input that is technically not valid in modern latex, and the katex devs explicitly decide not to support that input. My users don't care and have lots of content that works in mathjax only, so I have to support it (since Jupyter compatibility is important, and Jupyter uses mathjax).


KaTeX can also work without JavaScript as the generated code is browser-independent.


This looks promising, but are there plans to include packages like siunitx or it's meant to be kept simple?


I really enjoyed this interview:

https://mathml.igalia.com/news/2019/12/03/igalia-chats-with-...

It's mostly about MathML implementation in browsers, but a fair amount talks about MathJax as well and how good it is, including for accessibility.


I you want to quickly write some math to your website without necessarily knowing latex, then I wrote a tool called MathUp[1] which takes quick to write and easy to read math expressions and translates them to native MathML. MathJax can take native MathML as an input so you can feed it to MathJax to render it beautifully.

1: https://runarberg.github.io/mathup/


You might also be interested in tikzjax (https://github.com/kisonecat/tikzjax) for diagrams which works "good enough".

I use them together but there is a pretty noticeable delay with tikzjax - I'm not sure of any alternatives at this point.


I found the documentation hard to follow to get server rendering to work, so here’s an example of MathJax integrated with marked [1], and an example of it in action [2] (scroll down).

1: https://github.com/qubyte/qubyte-codes/blob/main/lib/render....

2: https://qubyte.codes/blog/advent-of-code-2017-day-20-task-2


Check out the impressive list of sponsors behind NumFOCUS [1], in turn the main sponsor of MathJax.

[1] https://numfocus.org/


I’m amazed at how well MathJax works in CodiMD/HedgeDoc, not just math, but importing and using eg. chemical equation support (`$\require{mhchem}$`) as well. Kudos.


MathJax is probably the poster child for Next.js/Gatsby SSR.


What do you mean? I'm not familiar with Gatsby.


I think they're referring to how rendering of equations is a good reason to use SSR, given how slow they render on the client.


I use MathJax and it is great. Thank you for the great work.


I used to use Mathematica or MatLab to export image files of equations or matrices, and embed those images into my papers. I would already have those equations loaded into the software as part of the research, so it really wasn't any extra work, and ensured they were copied over as they were actually used. Why is so much time spent trying to get complex math rendering added to text editors, especially when math research may define new renderings?

/get off my lawn


This is a math rendering engine. It has nothing to do with text editors anymore than any other software.

Mathematica can export to Latex which is definitely preferable to embedding images into papers.


Accessibility. Your nice images are someone blind's nightmare when the most important parts of a stem web page or pdf are actually just an empty alt tag.


I really hate to engage further on this as no one seems receptive, but, believe me... accessibility was a must as NSF grants through the university were involved. LaTex and illegible raw ASCII were also embedded in the PDF.

There were other diagrams and charts and graphs, but at some point, no text editor could process and render everything natively, or be fully accessible to every disability.


That's why standards. Partial implementations are always a best attempt at something and having it in a uniform way makes it easier for everyone.

NSF grands are only part of the picture. Knowledge is dispersed among arxive.org papers, pdf textbooks and random blog articles with each of them doing different thing and very often this thing is just slap an image of the formula and go on.


How do you standardize new mathematical expressions that haven't been invented/discovered yet? How do you deal with fundamental disagreements surrounding those standards? Politics and Capitalism creep in everywhere, and pretending that a "uniform way" will present itself is childish.


I think that you are missing the point. A standard must not dictate which symbols should be used, if it is a straight arrow, curved arrow, or a dotted one. Its purpose is to allow all kinds of symbols, positioning and denoting of relationships so that all symbols, relationships and positioning could be reproduced from the consumer of the data, be it a browser or a screen reader.


I think that you are missing the point. The set of all kinds of symbols is more expressive than you are prepared to codify.


Well, you don't do it. I'm not asking it from you and we are all good. Not sure that we can go anywhere otherwise.


You still don't get it. It is all I do. Detractors amass.


What you do might be nice, but it does not scale. People do not include stuff for accessibility's sake. Web is the ultimate proof of that. That's why I prefer if accessibility is included in the workflow itself.


(edit 4: my comment is off-topic, sorry)

Mathjax reminds me of the AJAX hype. What happened to it? These days no one talks about AJAX. There was material design a few years later but that was just the looks.

Is AJAX now replaced with React.js? or a combination of other stuff (like HTML5 and modern-JS and React.js and stuff)?

edit: I just looked up Angular and apparently it was rewritten in Typescript, a strict superset of JS. This doesn't make sense. JS is known for massive amounts of cruft. An improvement would've been a scripting language that compiles to "JS: the good parts", i.e., a subset of JS. But now we should have "Typescript: the good parts" because TS inherited all the bad parts of JS?

edit 2: It turns out, there is valid JS that is invalid TS [0]. And yet, TS is described on wikipedia as "a strict superset of JS" [1]. (invalid TS == non-error-free TS).

edit 3: Further confirmation about error-free TS not being a strict superset of JS [2]. Such a lie can only be expected from a company like micro$hit.

edit 5: even with-error TS is not a superset of JS (the behavior is different) [3].

edit 6: Typescript is an opinionated-yet-spineless Javascript!

[0] https://github.com/microsoft/TypeScript/issues/38546

[1] https://en.wikipedia.org/wiki/TypeScript

[2] https://stackoverflow.com/a/53698835

[3] https://news.ycombinator.com/item?id=18942886


FWIW, Mathjax doesn't have much to do with AJAX calls.

AJAX is just ubiquitous and it's easier to use without frameworks nowadays. React is a library that solves different problems from the frameworks that made AJAX easier like Prototype and jQuery.

React helps folk build UIs through interesting data-models and the ShadowDOM. AJAX is required by anything but the most trivial React projects to make server-side requests.

Hope that helps :)


AJAX is just a set of principles to make client side web applications more dynamic by getting all the data async and updating the DOM. AJAX is very much alive in modern client side js frameworks like Angular, react etc... It is just abstracted away a little (or a lot).


AJAX hype is like indoor plumbing hype. Everyone realized it was good, and now it's everywhere all the time, although only plumbers talk about it.

I think your footnote [3] is a reference to an HN comment of mine. I think you should know I actually like typescript even though the "superset of JS" thing is a bit oversold.


Thanks.

For context, as somewhat of an outsider, I knew about Crockford 'JS: The Good Parts' and knew the community cared about working within the limits of a sane "subset" of JS.

A few years later, I hear Typescript is everywhere and JS folks love it. I didn't pay attention to what it really claims to be, but made a connection with the Crockford book, and started mentioning in discussion with acquaintances that it's a subset of JS (it must be because that's what the community wanted).

Lo and behold, one of them heard TS is a "superset", not a subset, and dissed me as a knowledgeable tech person, despite himself knowing so little that barely weeks ago he didn't know the difference between Java and Javascript.

Sorry, I'm done with this mess.


AJAX is the default now, so no one talks about it.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: