fix(textbooks): убраны лишние слэши в LaTeX-формулах (over-escaping)

Формулы в JS-литералах имели \\\\dfrac / \\\\\\\\dfrac (4/8 слэшей) вместо
\\dfrac (2). После JS-анескейпа KaTeX получал \\dfrac, трактовал \\ как
перенос строки и печатал dfrac/cdot/sqrt/pi как текст (карточка пирамиды и
конуса в geometry_11_ch2, и др.).

Схлопнуты прогоны слэшей кратные 4 перед LaTeX-командой -> 2. Прогоны из
3 слэшей (\\ перенос строки + \cmd в \begin{cases}) и перед x/цифрой не
тронуты. 150 правок в 7 файлах (algebra_11_ch1/ch2/ch3, geometry_11_ch1..ch4).

БД чиста: questions (1398) text/explanation/correct_text + options (5187) -
0 багов. Скрипт: backend/scripts/fix_overescaped_latex.js (идемпотентный,
dry-run по умолчанию, --apply, с KaTeX-валидацией).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 11:53:17 +03:00
parent 3801d0cfa8
commit 8786cf5e20
8 changed files with 163 additions and 55 deletions
+6 -6
View File
@@ -407,16 +407,16 @@ function goTo(id){
}
const SIDEBARS = {
p1:{title:"Шпаргалка §1",rows:[["Корень","$\\\\sqrt[n]{a^m} = a^{m/n}$, $a \\\\ge 0$, $n \\\\in \\\\mathbb{N}$"],["Свойства","$a^p \\\\cdot a^q = a^{p+q}$, $(a^p)^q = a^{pq}$"],["Дробный","$a^{1/n} = \\\\sqrt[n]{a}$, $a^{-p} = 1/a^p$"],["Действ.","показатель — любое $x \\\\in \\\\mathbb{R}$"]]},
p2:{title:"Шпаргалка §2",rows:[["Вид","$y = x^\\\\alpha$, $\\\\alpha \\\\in \\\\mathbb{R}$"],["$\\\\alpha > 0$","возрастает на $(0; +\\\\infty)$"],["$\\\\alpha < 0$","убывает на $(0; +\\\\infty)$"],["Чёт./нечёт.","зависит от $\\\\alpha$"]]},
p3:{title:"Шпаргалка §3",rows:[["Опр.","$\\\\log_a b = c \\\\iff a^c = b$"],["Условия","$a > 0$, $a \\\\ne 1$, $b > 0$"],["Тождество","$a^{\\\\log_a b} = b$"],["$\\\\lg, \\\\ln$","$\\\\lg = \\\\log_{10}$, $\\\\ln = \\\\log_e$"]]},
p1:{title:"Шпаргалка §1",rows:[["Корень","$\\sqrt[n]{a^m} = a^{m/n}$, $a \\ge 0$, $n \\in \\mathbb{N}$"],["Свойства","$a^p \\cdot a^q = a^{p+q}$, $(a^p)^q = a^{pq}$"],["Дробный","$a^{1/n} = \\sqrt[n]{a}$, $a^{-p} = 1/a^p$"],["Действ.","показатель — любое $x \\in \\mathbb{R}$"]]},
p2:{title:"Шпаргалка §2",rows:[["Вид","$y = x^\\alpha$, $\\alpha \\in \\mathbb{R}$"],["$\\alpha > 0$","возрастает на $(0; +\\infty)$"],["$\\alpha < 0$","убывает на $(0; +\\infty)$"],["Чёт./нечёт.","зависит от $\\alpha$"]]},
p3:{title:"Шпаргалка §3",rows:[["Опр.","$\\log_a b = c \\iff a^c = b$"],["Условия","$a > 0$, $a \\ne 1$, $b > 0$"],["Тождество","$a^{\\log_a b} = b$"],["$\\lg, \\ln$","$\\lg = \\log_{10}$, $\\ln = \\log_e$"]]},
final1:{title:"Финал главы 1",rows:[["§§13","теория главы 1"],["Награда","+50 XP"]]}
};
const TIPS=[
{sec:'p1',html:"Дробный показатель: $a^{m/n} = \\\\sqrt[n]{a^m}$. База $a \\\\ge 0$ для произвольного $m/n$."},
{sec:'p2',html:"Степенная функция $y = x^\\\\alpha$: при $\\\\alpha > 0$ возрастает на $(0; +\\\\infty)$, при $\\\\alpha < 0$ — убывает."},
{sec:'p3',html:"$\\\\log_a b$ — это показатель, в который надо возвести $a$, чтобы получить $b$."},
{sec:'p1',html:"Дробный показатель: $a^{m/n} = \\sqrt[n]{a^m}$. База $a \\ge 0$ для произвольного $m/n$."},
{sec:'p2',html:"Степенная функция $y = x^\\alpha$: при $\\alpha > 0$ возрастает на $(0; +\\infty)$, при $\\alpha < 0$ — убывает."},
{sec:'p3',html:"$\\log_a b$ — это показатель, в который надо возвести $a$, чтобы получить $b$."},
{sec:'final1',html:"Финал главы 1 — интегрированные задачи по §§1–3."}
];