Files
emacs-conf/scripts/reveal.js/plugin/math/mathjax4.js

82 lines
2.5 KiB
JavaScript

/**
* A plugin which enables rendering of math equations inside
* of reveal.js slides. Essentially a thin wrapper for MathJax 4
*
* @author Hakim El Hattab
* @author Gerhard Burger
* @author Khris Griffis, Ph.D.
*/
export const MathJax4 = () => {
// The reveal.js instance this plugin is attached to
let deck;
let defaultOptions = {
tex: {
inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ]
},
options: {
skipHtmlTags: [ 'script', 'noscript', 'style', 'textarea', 'pre', 'code' ]
},
startup: {
ready: () => {
MathJax.startup.defaultReady();
MathJax.startup.promise.then(() => {
deck.layout();
});
}
}
};
function loadScript( url, callback ) {
let script = document.createElement( 'script' );
script.type = 'text/javascript';
script.id = 'MathJax-script';
script.src = url;
script.async = true;
// Wrapper for callback to make sure it only fires once
script.onload = () => {
if (typeof callback === 'function') {
callback.call();
callback = null;
}
};
document.head.appendChild( script );
}
return {
id: 'mathjax4',
init: function(reveal) {
deck = reveal;
let revealOptions = deck.getConfig().mathjax4 || {};
let options = { ...defaultOptions, ...revealOptions };
options.tex = { ...defaultOptions.tex, ...revealOptions.tex };
options.options = { ...defaultOptions.options, ...revealOptions.options };
options.startup = { ...defaultOptions.startup, ...revealOptions.startup };
let url = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@4/tex-mml-chtml.js';
options.mathjax = null;
window.MathJax = options;
loadScript(url, function() {
// MathJax 4.0.0 uses async startup, so we need to wait for it to be ready
MathJax.startup.promise.then(() => {
// Initial typeset after startup
MathJax.typeset();
// Reprocess equations in slides when they turn visible
deck.addEventListener('slidechanged', function(event) {
MathJax.typeset();
});
});
});
}
};
};