Reglas de renderizado de fórmulas matemáticas en Markdown y verificación
Cadena de activación: tres seguros para evitar que la habilidad no se ejecute
Esta habilidad garantiza su ejecución al escribir fórmulas mediante tres cadenas:
- Activación previa: esta descripción declara "antes de escribir cualquier fórmula matemática" para activarse, sin esperar a que falle el renderizado.
- Montaje en flujo de trabajo: la habilidad principal del repositorio
math-question-skill(D:\math_question\SKILL.md) referencia esta habilidad en sus reglas obligatorias: al resolver problemas, explicar o generar la pregunta diaria, siempre se pasa por esta cadena. - Autoverificación previa a la publicación: antes de finalizar un texto con fórmulas, se ejecuta
scripts/check_inline_math.pypara escanear; si se encuentra$...$en línea, debe cambiarse a fórmula en bloque o texto plano antes de enviar/escribir.
Reglas principales (obligatorias en Codex App)
La aplicación de escritorio Codex solo renderiza fórmulas en bloque independientes $$...$$, no las inline $...$ (confirmado por el issue #14985 oficial). La fórmula en sí no está mal, el problema es el delimitador:
❌ $f(x)=\sqrt[3]{x}$ ← inline $...$, la App no renderiza
❌ $\dfrac{f(x_0+h)-f(x_0)}{h}$ ← inline $...$, la App no renderiza
Solución: la fórmula debe estar en su propia línea, usando $$...$$:
✅ Por
$$
f'(x_0)=\lim_{h\to0}\dfrac{f(x_0+h)-f(x_0)}{h}
$$
se tiene que es derivable ⟺ el límite existe y es finito
Para expresiones cortas en línea, use caracteres Unicode matemáticos para embellecer, con apariencia similar al resultado renderizado:
- Superíndice/subíndice:
xˣ(U+02E3),10⁶,2ⁿ,x₀,x₁ - Raíz cuadrada:
√x(U+221A),∛x(U+221B raíz cúbica) - Fracción con superíndice:
x¹⁄³(¹ U+00B9 + ⁄ U+2044 + ³ U+00B3) - Apóstrofe de derivada:
f′(x)(U+2032, no usar apóstrofe recto') - Operadores/símbolos:
·,−,±,∞,≠,≤,≥,∈
⚠️ No usar notación de programación ^(...): x^(1/3) parece código fuente; use ∛x o x¹⁄³.
Las expresiones inline complejas (fracciones, raíces, límites) deben dividirse en bloques $$...$$, no forzarse como texto plano.
Qué hacer cuando el usuario solicita "conservar fórmulas inline" (las reglas duras no cambian)
En medio de una conversación, el usuario podría decir "conserva $...$ para fórmulas inline, solo corrige espacios" — esto no cambia el comportamiento de renderizado de la App. Las $...$ inline nunca se renderizan en Codex App, agregar espacios solo da "código fuente con espacios", empeora la apariencia y sigue siendo un fallo (lección histórica: después de corregir espacios, el usuario aún reportaba "estos lugares siguen teniendo problemas", la causa raíz era que las $...$ inline no se habían convertido a Unicode). Por lo tanto:
- Antes de finalizar, siga las reglas duras: las expresiones inline cortas se convierten a Unicode, las complejas se dividen en
$$...$$independientes. - Si el usuario insiste en conservar
$...$inline, primero explique las consecuencias (la App muestra el código fuente) y añada un "aviso de renderizado" al final del resultado. - No omita la autoverificación
check_inline_math.pypor petición del usuario;[FAIL]debe llegar a cero para considerar la tarea completada.
Tabla de conversión rápida: fórmula inline → Unicode
| Escenario | LaTeX inline (prohibido) | Corrección Unicode |
|---|---|---|
| Variable de una letra | $f$, $g$, $A$ | f, g, A (texto plano) |
| Superíndice/subíndice | $x^n$, $x_0$, $a_n$ | xⁿ, x₀, aₙ |
| Raíz | $\sqrt{x}$, $\sqrt[3]{x}$ | √x, ∛x |
| Fracción | $\frac1n$, $\frac{x^n}{1+x}$ | Corta 1/n; compleja dividir en bloque $$...$$ |
| Límite | $\lim_{n\to\infty}a_n$ | lim(n→∞) aₙ (Unicode no tiene flecha con subíndice, la condición de aproximación se incluye entre paréntesis dentro de lim; compleja dividir en bloque) |
| Integral | $\int_0^1 f(x)\,dx$ | Compleja dividir en bloque $$...$$, no forzar inline |
| Valor absoluto | $\lvert x\rvert$ | ` |
| Conjuntos/relaciones | $x\in[0,1]$, $f\le g$ | x∈[0,1], f ≤ g |
| Flechas | $x\to0$, $n\to\infty$ | x→0, n→∞ |
| Puntos suspensivos | $a_1+\cdots+a_k$ | a₁+…+aₖ |
Fórmulas dentro de tablas (segundo escenario más común en Codex App)
Las $...$ dentro de celdas de tabla no se renderizan; y $$...$$ independientes rompen la fila de la tabla. Nunca colocar delimitadores de fórmula dentro de celdas de tabla:
| Práctica | Explicación |
|---|---|
❌ Escribir $x^{1/3}$ en una celda | Inline no se renderiza, se muestra como código fuente |
❌ Escribir $$x^{1/3}$$ en una celda | Los delimitadores de varias líneas rompen la tabla |
| ✅ Solo texto plano/Unicode en la celda | ∛x, ` |
| ✅ Fórmula debajo de la tabla | Cada fórmula en su propia línea $$...$$, después de la tabla |
| ✅ El contenido es principalmente fórmula | Usar lista estructurada (subtítulo + $$...$$), no tabla |
Ejemplo: tres casos de no derivabilidad:
| Función | Modo de fallo en x = 0 |
|---|---|
| ∛x | Tangente vertical, cociente diferencial → +∞ |
| x·sin(1/x) | Oscilación violenta, el límite no existe |
Fórmula debajo de la tabla:
$$ \lim_{h\to0}\frac{h^{1/3}}{h}=+\infty $$
Autoverificación previa a la publicación (30 segundos, obligatorio antes de finalizar)
⚠️ Primero configure la consola en UTF-8: la consola de Windows por defecto es GBK, los scripts con caracteres chinos o emoji (como ✅) producirán UnicodeEncodeError o caracteres ilegibles. Antes de ejecutar la verificación, ejecute:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
$env:PYTHONIOENCODING = 'utf-8'
Para verificar un borrador de mensaje de chat:
python "D:\math_question\.agents\skills\markdown-math-render\scripts\check_inline_math.py" - < borrador.txt
Para verificar un archivo ya escrito:
python "D:\math_question\.agents\skills\markdown-math-render\scripts\check_inline_math.py" "D:\math_question\archivo_destino.md"
- Código de salida 0 (salida
[OK]) → limpio, se puede enviar/escribir - Código de salida 0 + aviso
[STYLE]→ hay^(...)de superíndice estilo código fuente (ej.x^(1/3)), apariencia de código, se sugiere cambiar a∛x/x¹⁄³o fórmula en bloque (sugerencia de estilo, no bloquea) - Código de salida 1 (salida
[FAIL]con número de línea) → dos tipos de problemas:$...$inline (cambiar a$$...$$independiente o texto plano Unicode);$$...$$no está en su propia línea (mover texto al inicio/fin de la línea que contiene$$). Corregir según la línea y volver a ejecutar hasta que no haya[FAIL]
Confirmar que la fórmula en sí no está rota (30 segundos)
El repositorio incluye KaTeX CLI, para verificar la sintaxis TeX:
@'
\dfrac{f(x_0+h)-f(x_0)}{h}
'@ | node scripts/node_modules/katex/cli.js
- Salida contiene
<annotation ...>y código de salida 0 → la fórmula es correcta, el problema es el delimitador/renderizador - Lanza ParseError → error de sintaxis TeX, corregir primero la fórmula
Principio en una frase
En Codex App, las fórmulas siempre deben estar en su propia línea usando
$$...$$; las expresiones cortas inline se embellecen con Unicode en superíndices/subíndices (xˣ, f′(x)); las celdas de tabla no contienen fórmulas, estas se colocan debajo de la tabla; ejecutecheck_inline_math.pycomo red de seguridad antes de publicar; prohibido el uso de$...$inline.