/** * A plugin which enables rendering of math equations inside * of reveal.js slides. Essentially a thin wrapper for MathJax. * * @author Hakim El Hattab */ var RevealMath = window.RevealMath || (function () { var options = Reveal.getConfig().math || {}; var mathjax = options.mathjax || 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js'; var config = options.config || 'TeX-AMS_HTML-full'; var url = mathjax + '?config=' + config; var defaultOptions = { messageStyle: 'none', tex2jax: { inlineMath: [['$', '$'], ['\\(', '\\)']], skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'] }, skipStartupTypeset: true }; function defaults(options, defaultOptions) { for (var i in defaultOptions) { if (!options.hasOwnProperty(i)) { options[i] = defaultOptions[i]; } } } function loadScript(url, callback) { var head = document.querySelector('head'); var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; // Wrapper for callback to make sure it only fires once var finish = function () { if (typeof callback === 'function') { callback.call(); callback = null; } }; script.onload = finish; // IE script.onreadystatechange = function () { if (this.readyState === 'loaded') { finish(); } }; // Normal browsers head.appendChild(script); } return { init: function () { defaults(options, defaultOptions); defaults(options.tex2jax, defaultOptions.tex2jax); options.mathjax = options.config = null; loadScript(url, function () { MathJax.Hub.Config(options); // Typeset followed by an immediate reveal.js layout since // the typesetting process could affect slide height MathJax.Hub.Queue(['Typeset', MathJax.Hub]); MathJax.Hub.Queue(Reveal.layout); // Reprocess equations in slides when they turn visible Reveal.addEventListener('slidechanged', function (event) { MathJax.Hub.Queue(['Typeset', MathJax.Hub, event.currentSlide]); }); }); } } })(); Reveal.registerPlugin('math', RevealMath);