From 80578c1fa9ea48e8b6377962f8e4b9740b14dff2 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Tue, 6 May 2025 12:05:41 +0900 Subject: [PATCH] Add support for persistent macros between renders --- readme.md | 7 +++++++ texmath.js | 21 ++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 4ff23d2..a86c102 100644 --- a/readme.md +++ b/readme.md @@ -88,6 +88,13 @@ const str = "Euler\'s identity $e^{i\\pi}+1=0$ is a beautiful formula in $\\RR^2 md.render(str); ``` +If you want to persist macros between multiple renders, you can pass `macros` to `render()`'s second argument: +```js +const macros = {}; +md.render('$$\\gdef\\RR{\\mathbb{R}}$$', { macros }); +console.debug(macros); // { '\\RR': '\\mathbb{R}' } +md.render('$$\\RR^2$$', { macros }); // $$\\mathbb{R}^2$$ +``` ## Use in Browser ```html diff --git a/texmath.js b/texmath.js index ebd61d4..7377350 100644 --- a/texmath.js +++ b/texmath.js @@ -35,13 +35,28 @@ function texmath(md, options) { for (const rule of delimiters.inline) { if (!!outerSpace && 'outerSpace' in rule) rule.outerSpace = true; md.inline.ruler.before('escape', rule.name, texmath.inline(rule)); // ! important - md.renderer.rules[rule.name] = (tokens, idx) => rule.tmpl.replace(/\$1/,texmath.render(tokens[idx].content,!!rule.displayMode,katexOptions)); + md.renderer.rules[rule.name] = (tokens, idx, _opts, env) => { + const options = { + ...katexOptions, + macros: env.macros || katexOptions.macros, + }; + return rule.tmpl.replace( + /\$1/, + texmath.render(tokens[idx].content, !!rule.displayMode, options) + ); + }; } // inject block rules to markdown-it for (const rule of delimiters.block) { md.block.ruler.before('fence', rule.name, texmath.block(rule)); // ! important for ```math delimiters - md.renderer.rules[rule.name] = (tokens, idx) => rule.tmpl.replace(/\$2/,escapeHTML(tokens[idx].info)) // equation number .. ? - .replace(/\$1/,texmath.render(tokens[idx].content,true,katexOptions)); + md.renderer.rules[rule.name] = (tokens, idx, _opts, env) => { + const options = { + ...katexOptions, + macros: env.macros || katexOptions.macros, + }; + return rule.tmpl.replace(/\$2/, escapeHTML(tokens[idx].info)) // equation number .. ? + .replace(/\$1/, texmath.render(tokens[idx].content, true, options)); + }; } }