¿Puedo indicar a MathJax que acepte más de un par de delimitadores básicos?
Estoy usando el delimitador en línea del signo de dólar para representar matemáticas en un navegador.
Esto causa problemas para texto como 500$ + 200$ que coincide con la sintaxis de MathJax y se representa como matemática. El enfoque comúnmente recomendado para evitar que el contenido no matemático se represente como matemático es habilitar processEscapes .
MathJax = { tex: { inlineMath: [ ["$", "$"] ], processEscapes: true, }, }; El método de escape requiere reescribir todo el contenido que no sea sintaxis matemática. Los 500$ + 200$ anteriores se convierten en 500\$ + 200\$ . Esta no es una solución ideal donde la mayoría del contenido no es muy matemático. Es peor cuando el contenido tiene mucho código.
Este es un problema de codificación que preferiría no transmitir a los autores de contenido.
Una mejora simple será esperar que todo el contenido matemático en línea esté $tidy like this$ , donde no hay espacios en blanco alrededor de la expresión. Obsidian y posiblemente otros editores de rebajas parecen estar siguiendo este patrón a pesar de que todavía tiene algunas trampas.
// This doesn't work, is there a similar approach that works? inlineMath: [ [/\$(?=[^\s])/, /(?<=[^\s])\$/] ]De hecho, esta es la expresión delimitadora que uso para habilitar/deshabilitar la representación matemática en una página, según lo recomendado por MathJax. El problema ocurre en contenido mixto donde MathJax analiza toda la página.
[" $", "$ "], [" $", "$"], ["$", "$ "]Aquí hay una configuración que le permitirá especificar patrones para los delimitadores que proporcione (mientras sigue manejando delimitadores donde no proporciona patrones). Los patrones deben coincidir con los delimitadores dados en las dos primeras entradas de la matriz, pero ese es el caso de su situación, por lo que no debería ser un problema para usted. (Sería posible una solución más general, pero requeriría más trabajo que no necesitaba).
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(); } } }; Aquí, creamos una subclase de la clase FindTeX y anulamos el método que guarda los datos para la coincidencia de delimitadores. Comprueba si se proporcionan los patrones y, de ser así, los utiliza para la coincidencia de patrones en lugar de las cadenas originales (aunque todavía se necesitan para que el delimitador de apertura pueda ubicar la información del delimitador de cierre y para que sea adecuado). procesamiento de delimitador cerrado).
Creo que esto hará lo que estás buscando. Podría convertirse en una extensión más formal, pero dado que es relativamente corto, puede usarlo de esta manera con bastante facilidad.