Règles de rendu des formules mathématiques Markdown et vérification
Chaîne de déclenchement : trois garanties pour éviter que la compétence ne soit pas exécutée
Cette compétence est garantie d'être exécutée lors de l'écriture de formules par trois mécanismes :
- Déclenchement préalable : cette description déclare « avant d'écrire toute formule mathématique », sans attendre un échec de rendu pour corriger.
- Intégration au workflow : la compétence principale du dépôt
math-question-skill(D:\math_question\SKILL.md) l'inclut dans ses règles obligatoires – tout exercice, explication ou question quotidienne passe par cette chaîne. - Auto-vérification avant publication : avant la finalisation d'un contenu contenant des formules, exécutez
scripts/check_inline_math.pypour analyser ; toute occurrence de$...$inline doit être convertie en formule bloc ou en texte brut avant envoi/écriture.
Règles principales (obligatoires dans l'application Codex)
L'application de bureau Codex ne rend que les formules bloc indépendantes $$...$$, et pas les formules inline $...$ (confirmé par l'issue #14985 officielle). L'erreur ne vient pas de la formule elle-même mais du délimiteur utilisé :
❌ $f(x)=\sqrt[3]{x}$ ← inline $...$, non rendu par l'application
❌ $\dfrac{f(x_0+h)-f(x_0)}{h}$ ← inline $...$, non rendu par l'application
Correction : mettez la formule sur sa propre ligne avec $$...$$ :
✅ Ainsi
$$
f'(x_0)=\lim_{h\to0}\dfrac{f(x_0+h)-f(x_0)}{h}
$$
est dérivable ⇔ cette limite existe et est finie
Pour les courtes expressions inline, utilisez des symboles Unicode mathématiques pour un rendu esthétique proche :
- Exposant/indice :
xˣ(U+02E3),10⁶,2ⁿ,x₀,x₁ - Racine :
√x(U+221A),∛x(U+221B racine cubique) - Fraction en exposant :
x¹⁄³(¹ U+00B9 + ⁄ U+2044 + ³ U+00B3) - Apostrophe de dérivée :
f′(x)(U+2032, ne pas utiliser l'apostrophe droite') - Opérateurs/relations :
·,−,±,∞,≠,≤,≥,∈
⚠️ N'utilisez pas l'écriture programmatique ^(...) : x^(1/3) ressemble à du code source ; utilisez ∛x ou x¹⁄³ à la place.
Les formules inline complexes (fractions, racines, limites) doivent être décomposées en blocs $$...$$, ne les forcez pas en texte brut.
Que faire si l'utilisateur demande de « conserver les formules inline » (règle dure inchangée)
Dans la conversation, l'utilisateur peut demander de « conserver les formules inline $...$, seulement corriger les espaces collés » – cela ne change pas le comportement de rendu de l'application. Les formules inline $...$ ne sont jamais rendues dans l'application Codex ; ajouter des espaces ne fait que « source + espaces », donnant un rendu encore pire, et reste un échec (leçon tirée de l'expérience : après correction des espaces collés, l'utilisateur a signalé que « ces endroits ont toujours des problèmes », la cause racine étant que les $...$ inline n'avaient pas été convertis en Unicode). Par conséquent :
- Avant la finalisation, suivez toujours les règles dures : courtes expressions inline converties en Unicode, complexes décomposées en blocs
$$...$$indépendants ; - Si l'utilisateur insiste explicitement pour conserver les
$...$inline, expliquez d'abord les conséquences (l'application affichera le code source), et ajoutez un « rappel de rendu » à la fin de la sortie ; - Ne sautez pas l'auto-vérification
check_inline_math.pyà cause de la demande de l'utilisateur ;[FAIL]doit être réduit à zéro pour que la tâche soit considérée comme terminée.
Tableau de conversion rapide : formule inline → Unicode
| Scénario | LaTeX inline (interdit) | Correction Unicode |
|---|---|---|
| Variable simple | $f$, $g$, $A$ | f, g, A (texte brut) |
| Exposant/indice | $x^n$, $x_0$, $a_n$ | xⁿ, x₀, aₙ |
| Radical | $\sqrt{x}$, $\sqrt[3]{x}$ | √x, ∛x |
| Fraction | $\frac1n$, $\frac{x^n}{1+x}$ | Court 1/n ; complexe décomposer en bloc $$...$$ |
| Limite | $\lim_{n\to\infty}a_n$ | lim(n→∞) aₙ (Unicode n'a pas de flèche en indice, la condition d'approche est incluse dans lim entre parenthèses ; complexe décomposer en bloc) |
| Intégrale | $\int_0^1 f(x)\,dx$ | Complexe décomposer en bloc $$...$$, ne pas forcer en inline |
| Valeur absolue | $\lvert x\rvert$ | ` |
| Ensemble/relation | $x\in[0,1]$, $f\le g$ | x∈[0,1], f ≤ g |
| Flèche | $x\to0$, $n\to\infty$ | x→0, n→∞ |
| Points de suspension | $a_1+\cdots+a_k$ | a₁+…+aₖ |
Formules dans les tableaux (deuxième scénario le plus fréquent dans l'application Codex)
Dans les cellules d'un tableau, $...$ n'est pas rendu ; et $$...$$ sur une ligne séparée briserait la ligne du tableau. Ne mettez jamais de délimiteurs de formule dans une cellule de tableau :
| Pratique | Explication |
|---|---|
❌ Écrire $x^{1/3}$ dans une cellule | Inline non rendu, affiché comme code source |
❌ Écrire $$x^{1/3}$$ dans une cellule | Délimiteur multiligne brise le tableau |
| ✅ Mettre uniquement du texte brut/Unicode dans la cellule | ∛x, ` |
| ✅ Mettre la formule sous le tableau | Chaque formule sur sa propre ligne $$...$$, après le tableau |
| ✅ Si le contenu est principalement des formules | Utilisez une liste structurée (sous-titre + $$...$$), pas de tableau |
Exemple – trois exemples de non-dérivabilité :
| Fonction | Mode d'échec en x = 0 |
|---|---|
| ∛x | Tangente verticale, taux de variation → +∞ |
| x·sin(1/x) | Oscillation violente, limite inexistante |
Formules sous le tableau :
$$ \lim_{h\to0}\frac{h^{1/3}}{h}=+\infty $$
Auto-vérification avant publication (30 secondes, obligatoire avant finalisation)
⚠️ Définissez d'abord l'encodage de la console sur UTF-8 : la console Windows par défaut utilise GBK, et la sortie du script contenant du chinois ou des emoji (comme ✅) peut provoquer une UnicodeEncodeError ou des caractères illisibles. Avant d'exécuter la vérification :
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
$env:PYTHONIOENCODING = 'utf-8'
Pour un brouillon de réponse chat :
python "D:\math_question\.agents\skills\markdown-math-render\scripts\check_inline_math.py" - < brouillon.txt
Pour vérifier un fichier déjà écrit :
python "D:\math_question\.agents\skills\markdown-math-render\scripts\check_inline_math.py" "D:\math_question\fichier_cible.md"
- Code de retour 0 (sortie
[OK]) → propre, peut être envoyé/écrit - Code de retour 0 + avertissement
[STYLE]→ présence d'exposant programmatique^()(ex.x^(1/3)), aspect de code source, suggestion de passer à∛x/x¹⁄³ou formule bloc (conseil de style, non bloquant) - Code de retour 1 (sortie
[FAIL]avec numéro de ligne) → deux types de problèmes :$...$inline (convertir en$$...$$indépendant ou Unicode texte brut) ;$$...$$non indépendant (déplacer le texte en début/fin de ligne). Corrigez ligne par ligne et relancez jusqu'à ce qu'il n'y ait plus de[FAIL]
Vérification que la formule elle-même n'est pas cassée (30 secondes)
Le dépôt embarque KaTeX CLI pour valider la syntaxe TeX :
@'
\dfrac{f(x_0+h)-f(x_0)}{h}
'@ | node scripts/node_modules/katex/cli.js
- Sortie contenant
<annotation ...>et code de retour 0 → la formule est correcte, le problème vient du délimiteur/du moteur de rendu - ParseError → erreur de syntaxe TeX, corrigez d'abord la formule
Règle en une phrase
Dans l'application Codex, toutes les formules doivent être sur leur propre ligne avec
$$...$$; les courtes expressions inline sont mises en forme avec des exposants/indices Unicode (xˣ, f′(x)) ; les cellules de tableau ne contiennent pas de formules, celles-ci sont placées sous le tableau ; avant finalisation, exécutezcheck_inline_math.pypour garantir l'absence de formules inline$...$.