我可以为智能匹配配置 MathJax 吗?
Can I configure MathJax for smart matching?
我可以指示 MathJax 接受多个基本分隔符对吗?
背景
我使用美元符号内联定界符在浏览器上呈现数学。
这会导致诸如 500$ + 200$
之类的文本出现问题,它与 MathJax 语法匹配并呈现为数学。避免将非数学内容呈现为数学内容的常用推荐方法是启用 processEscapes
.
MathJax = {
tex: {
inlineMath: [ ["$", "$"] ],
processEscapes: true,
},
};
问题
转义方法需要重写所有非数学语法的内容。之前的 500$ + 200$
变为 500$ + 200$
。这不是一个理想的解决方案,因为大多数内容都不是数学题。当内容代码繁多时情况更糟。
这是一个编码问题,我不想传递给内容作者。
一个简单的改进是期望所有内联数学内容都是 $tidy like this$
,其中表达式周围没有白色-space。 Obsidian 和可能的其他降价编辑器似乎都在遵循这种模式,尽管它仍然存在缺陷。
// This doesn't work, is there a similar approach that works?
inlineMath: [ [/$(?=[^\s])/, /(?<=[^\s])$/] ]
这确实是我用于 enable/disable 基于页面的数学渲染的分隔符表达式,如 MathJax 的 recommended。问题发生在 MathJax 解析整个页面的混合内容上。
我尝试过/考虑过的
1。使用分隔符集 [" $", "$ "], [" $", "$"], ["$", "$ "]
- 这不起作用。
- 这会消耗表达式周围的 space。它们可以用 CSS.
添加回来
- 有很多边缘情况,分隔内容的顺序和执行顺序将决定解析器将选择什么。
2。自己解析内容,将每个匹配的表达式分别发送给MathJax
- 这有效。
- 是否已经为此构建了解析器?
3。即时添加转义斜杠
- 这有效。
- 是否存在任何在构建、服务器或浏览器上执行此操作的东西?
这是一个允许您为您提供的分隔符指定模式的配置(同时仍然处理您不提供模式的分隔符)。模式必须与数组前两个条目中给出的定界符相匹配,但这是您的情况,因此对您来说应该不是问题。 (更通用的解决方案是可能的,但需要做更多您不需要的工作。)
MathJax = {
tex: {
inlineMath: [
['$', '$', /$(?=[^\s])/, /(?<=[^\s])$/], // adds two extra parameters for pattern to use
['\(', '\)']
]
},
startup: {
ready() {
const {FindTeX} = MathJax._.input.tex.FindTeX;
const {selectOptionsFromKeys} = MathJax._.util.Options;
//
// Subclass the FindTeX class to handle the delimiter patterns
//
class myFindTeX extends FindTeX {
addPattern(starts, delims, display) {
let [open, close, start, end] = delims;
//
// If the extra patterns are given...
//
if (start && end) {
//
// The patterns are expected as strings, so convert RegExp to strings without surrounding /
//
starts.push(start.toString().slice(1).replace(/\/$/, ''));
this.end[open] = [close, display, this.endPattern(null, end.toString().slice(1).replace(/\/$/, ''))];
} else {
//
// Otherwise do the usual delimiter handling
//
super.addPattern(starts, delims, display);
}
}
}
//
// Make an instance of our FindTeX subclass (with the configured options)
// and tell the TeX input jax to use our subclass
//
const options = selectOptionsFromKeys(MathJax.config.tex, myFindTeX.OPTIONS);
MathJax.config.tex.FindTeX = new myFindTeX(options);
MathJax.startup.defaultReady();
}
}
};
这里,我们subclass FindTeX
class 并重写保存分隔符匹配数据的方法。它检查是否给出了模式,如果是,则使用这些模式进行模式匹配而不是原始字符串(尽管为了让开始定界符能够找到 closing-delimiter 信息,仍然需要这些模式,并且进行适当的 close-delimiter 处理)。
我认为这会满足您的需求。它可以做成更正式的扩展,但由于它相对较短,您可以相当轻松地使用它。
我可以指示 MathJax 接受多个基本分隔符对吗?
背景
我使用美元符号内联定界符在浏览器上呈现数学。
这会导致诸如 500$ + 200$
之类的文本出现问题,它与 MathJax 语法匹配并呈现为数学。避免将非数学内容呈现为数学内容的常用推荐方法是启用 processEscapes
.
MathJax = {
tex: {
inlineMath: [ ["$", "$"] ],
processEscapes: true,
},
};
问题
转义方法需要重写所有非数学语法的内容。之前的 500$ + 200$
变为 500$ + 200$
。这不是一个理想的解决方案,因为大多数内容都不是数学题。当内容代码繁多时情况更糟。
这是一个编码问题,我不想传递给内容作者。
一个简单的改进是期望所有内联数学内容都是 $tidy like this$
,其中表达式周围没有白色-space。 Obsidian 和可能的其他降价编辑器似乎都在遵循这种模式,尽管它仍然存在缺陷。
// This doesn't work, is there a similar approach that works?
inlineMath: [ [/$(?=[^\s])/, /(?<=[^\s])$/] ]
这确实是我用于 enable/disable 基于页面的数学渲染的分隔符表达式,如 MathJax 的 recommended。问题发生在 MathJax 解析整个页面的混合内容上。
我尝试过/考虑过的
1。使用分隔符集 [" $", "$ "], [" $", "$"], ["$", "$ "]
- 这不起作用。
- 这会消耗表达式周围的 space。它们可以用 CSS. 添加回来
- 有很多边缘情况,分隔内容的顺序和执行顺序将决定解析器将选择什么。
2。自己解析内容,将每个匹配的表达式分别发送给MathJax
- 这有效。
- 是否已经为此构建了解析器?
3。即时添加转义斜杠
- 这有效。
- 是否存在任何在构建、服务器或浏览器上执行此操作的东西?
这是一个允许您为您提供的分隔符指定模式的配置(同时仍然处理您不提供模式的分隔符)。模式必须与数组前两个条目中给出的定界符相匹配,但这是您的情况,因此对您来说应该不是问题。 (更通用的解决方案是可能的,但需要做更多您不需要的工作。)
MathJax = {
tex: {
inlineMath: [
['$', '$', /$(?=[^\s])/, /(?<=[^\s])$/], // adds two extra parameters for pattern to use
['\(', '\)']
]
},
startup: {
ready() {
const {FindTeX} = MathJax._.input.tex.FindTeX;
const {selectOptionsFromKeys} = MathJax._.util.Options;
//
// Subclass the FindTeX class to handle the delimiter patterns
//
class myFindTeX extends FindTeX {
addPattern(starts, delims, display) {
let [open, close, start, end] = delims;
//
// If the extra patterns are given...
//
if (start && end) {
//
// The patterns are expected as strings, so convert RegExp to strings without surrounding /
//
starts.push(start.toString().slice(1).replace(/\/$/, ''));
this.end[open] = [close, display, this.endPattern(null, end.toString().slice(1).replace(/\/$/, ''))];
} else {
//
// Otherwise do the usual delimiter handling
//
super.addPattern(starts, delims, display);
}
}
}
//
// Make an instance of our FindTeX subclass (with the configured options)
// and tell the TeX input jax to use our subclass
//
const options = selectOptionsFromKeys(MathJax.config.tex, myFindTeX.OPTIONS);
MathJax.config.tex.FindTeX = new myFindTeX(options);
MathJax.startup.defaultReady();
}
}
};
这里,我们subclass FindTeX
class 并重写保存分隔符匹配数据的方法。它检查是否给出了模式,如果是,则使用这些模式进行模式匹配而不是原始字符串(尽管为了让开始定界符能够找到 closing-delimiter 信息,仍然需要这些模式,并且进行适当的 close-delimiter 处理)。
我认为这会满足您的需求。它可以做成更正式的扩展,但由于它相对较短,您可以相当轻松地使用它。