Spaces:
Running
Running
/** | |
* A plugin which enables rendering of math equations inside | |
* of reveal.js slides. Essentially a thin wrapper for MathJax 3 | |
* | |
* @author Hakim El Hattab | |
* @author Gerhard Burger | |
*/ | |
export const MathJax3 = () => { | |
// The reveal.js instance this plugin is attached to | |
let deck; | |
let defaultOptions = { | |
tex: { | |
inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ] | |
}, | |
options: { | |
skipHtmlTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ] | |
}, | |
startup: { | |
ready: () => { | |
MathJax.startup.defaultReady(); | |
MathJax.startup.promise.then(() => { | |
Reveal.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: 'mathjax3', | |
init: function(reveal) { | |
deck = reveal; | |
let revealOptions = deck.getConfig().mathjax3 || {}; | |
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@3/es5/tex-mml-chtml.js'; | |
options.mathjax = null; | |
window.MathJax = options; | |
loadScript( url, function() { | |
// Reprocess equations in slides when they turn visible | |
Reveal.addEventListener( 'slidechanged', function( event ) { | |
MathJax.typeset(); | |
} ); | |
} ); | |
} | |
} | |
}; | |