Files
2026-08-01 15:00:14 +00:00

133 lines
3.4 KiB
JavaScript

/***************************************************************
* Implements startup of MathJax v4
***************************************************************/
// Base config options. Will be supplemented by optional parts later
let mathJaxOpts = {
"tex": {
"inlineMath": [
[
"\\(",
"\\)"
]
],
"tags": "none",
"tagSide": "right",
"tagIndent": ".8em",
"packages": {
"[+]": [
"amscd",
"color",
"knowl"
]
}
},
"options": {
"ignoreHtmlClass": "tex2jax_ignore|ignore-math",
"processHtmlClass": "process-math",
},
"chtml": {
"scale": 0.98,
"mtextInheritFont": true
},
"loader": {
"load": [
"input/asciimath",
"[tex]/amscd",
"[tex]/color",
]
}
};
export function startMathJax(opts) {
if(opts.hasWebworkReps || opts.hasSage) {
mathJaxOpts['renderActions'] = {
"findScript": [
10,
function (doc) {
document.querySelectorAll('script[type^="math/tex"]').forEach(function (node) {
var display = !!node.type.match(/; *mode=display/);
var math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display);
var text = document.createTextNode('');
node.parentNode.replaceChild(text, node);
math.start = { node: text, delim: '', n: 0 };
math.end = { node: text, delim: '', n: 0 };
doc.math.push(math);
});
},
""
]
}
}
if(opts.isReact) {
mathJaxOpts['startup'] = {
typeset: false,
}
} else {
mathJaxOpts['startup'] = {
ready() {
const { Configuration } = MathJax._.input.tex.Configuration;
const configuration = Configuration.create("knowl", {
handler: {
macro: ["knowl"]
}
});
const NodeUtil = MathJax._.input.tex.NodeUtil.default;
function GetArgumentMML(parser, name) {
const arg = parser.ParseArg(name);
if (!NodeUtil.isInferred(arg)) {
return arg;
}
const children = NodeUtil.getChildren(arg);
if (children.length === 1) {
return children[0];
}
const mrow = parser.create("node", "mrow");
NodeUtil.copyChildren(arg, mrow);
NodeUtil.copyAttributes(arg, mrow);
return mrow;
};
const CommandMap = MathJax._.input.tex.TokenMap.CommandMap;
new CommandMap(
"knowl",
{
knowl(parser, name) {
const url = parser.GetArgument(name);
const arg = GetArgumentMML(parser, name);
const mrow = parser.create("node", "mrow", [arg], { tabindex: '0', "data-knowl": url });
parser.Push(mrow);
}
}
);
MathJax.startup.defaultReady();
},
pageReady() {
return MathJax.startup.defaultPageReady().then(rsMathReady);
},
}
}
if(opts.htmlPresentation) {
mathJaxOpts['options']['menuOptions'] = {
"settings": {
"zoom": "Click",
"zscale": "300%"
}
}
}
// Apply the options
window.MathJax = mathJaxOpts;
// Lets Runestone know that MathJax is ready
const runestoneMathReady = new Promise((resolve) => window.rsMathReady = resolve);
window.runestoneMathReady = runestoneMathReady;
}