diff --git a/backend/scripts/fix_overescaped_latex.js b/backend/scripts/fix_overescaped_latex.js
new file mode 100644
index 0000000..c89ae8d
--- /dev/null
+++ b/backend/scripts/fix_overescaped_latex.js
@@ -0,0 +1,108 @@
+/*
+ * Fix OVER-ESCAPED LaTeX backslashes in textbook HTML.
+ *
+ * BUG: some formulas in JS string literals have too many backslashes, e.g.
+ * "$V=\\\\dfrac{1}{3}S_{осн}\\\\cdot h$" (4 backslashes)
+ * After JS unescaping KaTeX receives \\dfrac -> it renders "\\" as a LINE
+ * BREAK and prints "dfrac"/"cdot" as plain text (exactly the screenshot).
+ * The correct literal is 2 backslashes ("\\dfrac" -> value \dfrac).
+ *
+ * PARITY RULE (critical — protects legitimate row separators):
+ * literal-run length value backslashes meaning
+ * 2 1 \cmd OK keep
+ * 4 2 \\ + "cmd"(text) BUG -> 2
+ * 6 3 \\ + \cmd (rowbreak+cmd) OK keep
+ * 8 4 \\\\ + "cmd"(text) BUG -> 2
+ * => collapse ONLY runs whose length is a multiple of 4, AND only when the
+ * run is immediately followed by a known LaTeX command. Runs before "x",
+ * digits, etc. (real \\ row separators inside cases/array) are untouched.
+ *
+ * Usage: node backend/scripts/fix_overescaped_latex.js (dry run)
+ * node backend/scripts/fix_overescaped_latex.js --apply (write)
+ */
+'use strict';
+const fs = require('fs');
+const path = require('path');
+
+const APPLY = process.argv.includes('--apply');
+
+// Known LaTeX commands observed at 4/8 backslashes (exact-match whitelist).
+const CMDSET = new Set([
+ 'dfrac','tfrac','frac','sqrt','cdot','pi','log','ln','lg','alpha','beta','gamma',
+ 'delta','Delta','theta','lambda','mu','sigma','phi','varphi','omega','infty',
+ 'iff','in','notin','ne','neq','ge','geq','le','leq','mathbb','mathrm',
+ 'leftrightarrow','rightarrow','leftarrow','times','div','vec','overline',
+ 'perp','parallel','cos','sin','tan','cot','ldots','cdots','pm','mp','angle','triangle',
+]);
+
+let katex = null;
+try { katex = require('katex'); } catch { /* validation optional */ }
+function mathRegions(t) {
+ const out = []; let i = 0;
+ while (i < t.length) {
+ const a = t.indexOf('$', i); if (a < 0) break;
+ const dbl = t[a + 1] === '$'; const s = a + (dbl ? 2 : 1);
+ let b = dbl ? t.indexOf('$$', s) : t.indexOf('$', s);
+ if (b < 0 && dbl) b = t.indexOf('$', s);
+ if (b < 0) break;
+ out.push(t.slice(s, b));
+ i = b + (dbl && t.slice(b, b + 2) === '$$' ? 2 : 1);
+ }
+ return out;
+}
+// These math strings live in JS literals; KaTeX sees them AFTER one level of JS
+// unescaping. Emulate that so validation reflects what the browser renders.
+function jsUnescape(s) {
+ return s.replace(/\\\\/g, '\\');
+}
+function katexErrors(t) {
+ if (!katex) return null;
+ let bad = 0;
+ for (const inner of mathRegions(t)) {
+ const expr = jsUnescape(inner);
+ try { katex.renderToString(expr, { throwOnError: true }); }
+ catch { bad++; }
+ }
+ return bad;
+}
+
+const dir = path.join(__dirname, '..', '..', 'frontend', 'textbooks');
+const files = ['algebra_11_ch1.html','algebra_11_ch3.html','geometry_11_ch3.html',
+ 'geometry_11_ch2.html','geometry_11_ch1.html','algebra_11_ch2.html','algebra_8.html',
+ 'algebra_7_ch4.html','geometry_11_ch4.html'];
+
+const report = [];
+report.push('MODE: ' + (APPLY ? 'APPLY' : 'DRY-RUN'));
+let grandFixes = 0;
+
+for (const f of files) {
+ const p = path.join(dir, f);
+ const t = fs.readFileSync(p, 'utf8');
+ const before = katexErrors(t);
+
+ const perCmd = {};
+ let fixes = 0;
+ const next = t.replace(/(\\{4,})([A-Za-z]+)/g, (whole, bs, word) => {
+ if (bs.length % 4 !== 0) return whole; // 6,10,... rowbreak+command -> keep
+ if (!CMDSET.has(word)) return whole; // x / begin / unknown -> keep
+ fixes++;
+ perCmd[word] = (perCmd[word] || 0) + 1;
+ return '\\\\' + word; // collapse to two backslashes
+ });
+
+ // validate by emulating browser render of the FIXED text
+ const after = katexErrors(next);
+ grandFixes += fixes;
+ report.push('');
+ report.push(f + ': fixes=' + fixes + ' katexErrors before=' + before + ' after=' + after +
+ (fixes ? ' cmds=' + JSON.stringify(perCmd) : ''));
+ if (after !== null && before !== null && after > before)
+ report.push(' !! WARNING: katex errors INCREASED — not writing this file');
+
+ if (APPLY && fixes > 0 && !(after > before)) fs.writeFileSync(p, next, 'utf8');
+}
+
+report.push('');
+report.push('TOTAL fixes: ' + grandFixes);
+fs.writeFileSync(path.join(__dirname, 'fix_overescaped_latex.report.txt'), report.join('\n'), 'utf8');
+console.log(report.join('\n'));
diff --git a/frontend/textbooks/algebra_11_ch1.html b/frontend/textbooks/algebra_11_ch1.html
index fc59c23..acf064d 100644
--- a/frontend/textbooks/algebra_11_ch1.html
+++ b/frontend/textbooks/algebra_11_ch1.html
@@ -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:[["§§1–3","теория главы 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."}
];
diff --git a/frontend/textbooks/algebra_11_ch2.html b/frontend/textbooks/algebra_11_ch2.html
index 66e18e5..3dcbc66 100644
--- a/frontend/textbooks/algebra_11_ch2.html
+++ b/frontend/textbooks/algebra_11_ch2.html
@@ -387,9 +387,9 @@ function goTo(id){
}
const SIDEBARS = {
- p4:{title:"Шпаргалка §4",rows:[["Вид","$y = a^x$, $a > 0$, $a \\\\ne 1$"],["D(f)","$x \\\\in \\\\mathbb{R}$"],["E(f)","$y > 0$ (всегда положит.)"],["$a > 1$","возрастает"],["$0 < a < 1$","убывает"]]},
- p5:{title:"Шпаргалка §5",rows:[["Базовый","$a^{f(x)} = a^{g(x)} \\\\iff f(x) = g(x)$"],["Замена","$t = a^x$, $t > 0$"],["Вынес.","$a^x(\\\\ldots) = 0$ — разделить"],["Графич.","пересечение графиков"]]},
- p6:{title:"Шпаргалка §6",rows:[["$a > 1$","$a^{f} > a^{g} \\\\iff f > g$"],["$0 < a < 1$","$a^{f} > a^{g} \\\\iff f < g$ (знак меняется!)"],["Замена","$t = a^x$, $t > 0$"]]},
+ p4:{title:"Шпаргалка §4",rows:[["Вид","$y = a^x$, $a > 0$, $a \\ne 1$"],["D(f)","$x \\in \\mathbb{R}$"],["E(f)","$y > 0$ (всегда положит.)"],["$a > 1$","возрастает"],["$0 < a < 1$","убывает"]]},
+ p5:{title:"Шпаргалка §5",rows:[["Базовый","$a^{f(x)} = a^{g(x)} \\iff f(x) = g(x)$"],["Замена","$t = a^x$, $t > 0$"],["Вынес.","$a^x(\\ldots) = 0$ — разделить"],["Графич.","пересечение графиков"]]},
+ p6:{title:"Шпаргалка §6",rows:[["$a > 1$","$a^{f} > a^{g} \\iff f > g$"],["$0 < a < 1$","$a^{f} > a^{g} \\iff f < g$ (знак меняется!)"],["Замена","$t = a^x$, $t > 0$"]]},
final2:{title:"Финал главы 2",rows:[["§§4–6","теория главы 2"],["Награда","+50 XP"]]}
};
diff --git a/frontend/textbooks/algebra_11_ch3.html b/frontend/textbooks/algebra_11_ch3.html
index 2b155fc..874c98d 100644
--- a/frontend/textbooks/algebra_11_ch3.html
+++ b/frontend/textbooks/algebra_11_ch3.html
@@ -411,17 +411,17 @@ function goTo(id){
}
const SIDEBARS = {
- p7:{title:"Шпаргалка §7",rows:[["Произв.","$\\\\log_a(bc) = \\\\log_a b + \\\\log_a c$"],["Част.","$\\\\log_a(b/c) = \\\\log_a b - \\\\log_a c$"],["Степ.","$\\\\log_a b^k = k \\\\log_a b$"],["Перех.","$\\\\log_a b = \\\\dfrac{\\\\log_c b}{\\\\log_c a}$"]]},
- p8:{title:"Шпаргалка §8",rows:[["Вид","$y = \\\\log_a x$, $a > 0$, $a \\\\ne 1$"],["D(f)","$x > 0$"],["E(f)","$y \\\\in \\\\mathbb{R}$"],["$a > 1$","возрастает"],["$0 < a < 1$","убывает"],["Точка","проходит через $(1; 0)$"]]},
- p9:{title:"Шпаргалка §9",rows:[["Базовый","$\\\\log_a f = \\\\log_a g \\\\iff f = g$, $f, g > 0$"],["ОДЗ","всё под $\\\\log > 0$, основание $a > 0$, $a \\\\ne 1$"],["Замена","$t = \\\\log_a x$"]]},
- p10:{title:"Шпаргалка §10",rows:[["$a > 1$","$\\\\log_a f > \\\\log_a g \\\\iff f > g > 0$"],["$0 < a < 1$","$\\\\log_a f > \\\\log_a g \\\\iff 0 < f < g$ (знак меняется!)"],["ОДЗ","обязательно учесть"]]},
+ p7:{title:"Шпаргалка §7",rows:[["Произв.","$\\log_a(bc) = \\log_a b + \\log_a c$"],["Част.","$\\log_a(b/c) = \\log_a b - \\log_a c$"],["Степ.","$\\log_a b^k = k \\log_a b$"],["Перех.","$\\log_a b = \\dfrac{\\log_c b}{\\log_c a}$"]]},
+ p8:{title:"Шпаргалка §8",rows:[["Вид","$y = \\log_a x$, $a > 0$, $a \\ne 1$"],["D(f)","$x > 0$"],["E(f)","$y \\in \\mathbb{R}$"],["$a > 1$","возрастает"],["$0 < a < 1$","убывает"],["Точка","проходит через $(1; 0)$"]]},
+ p9:{title:"Шпаргалка §9",rows:[["Базовый","$\\log_a f = \\log_a g \\iff f = g$, $f, g > 0$"],["ОДЗ","всё под $\\log > 0$, основание $a > 0$, $a \\ne 1$"],["Замена","$t = \\log_a x$"]]},
+ p10:{title:"Шпаргалка §10",rows:[["$a > 1$","$\\log_a f > \\log_a g \\iff f > g > 0$"],["$0 < a < 1$","$\\log_a f > \\log_a g \\iff 0 < f < g$ (знак меняется!)"],["ОДЗ","обязательно учесть"]]},
final3:{title:"Финал главы 3",rows:[["§§7–10","теория главы 3"],["Награда","+50 XP"]]}
};
const TIPS=[
- {sec:'p7',html:"$\\\\log_a(bc) = \\\\log_a b + \\\\log_a c$ — произведение в логарифме превращается в сумму."},
- {sec:'p8',html:"График $y = \\\\log_a x$ — зеркальное отражение $y = a^x$ относительно $y = x$."},
- {sec:'p9',html:"Всегда выписывай ОДЗ: всё под $\\\\log$ должно быть строго положительно."},
+ {sec:'p7',html:"$\\log_a(bc) = \\log_a b + \\log_a c$ — произведение в логарифме превращается в сумму."},
+ {sec:'p8',html:"График $y = \\log_a x$ — зеркальное отражение $y = a^x$ относительно $y = x$."},
+ {sec:'p9',html:"Всегда выписывай ОДЗ: всё под $\\log$ должно быть строго положительно."},
{sec:'p10',html:"При $0 < a < 1$ — знак неравенства меняется. ОДЗ обязательно."},
{sec:'final3',html:"Финал главы 3 — синтез логарифмов и логарифмических функций."}
];
diff --git a/frontend/textbooks/geometry_11_ch1.html b/frontend/textbooks/geometry_11_ch1.html
index 5a0d69b..17f710a 100644
--- a/frontend/textbooks/geometry_11_ch1.html
+++ b/frontend/textbooks/geometry_11_ch1.html
@@ -409,14 +409,14 @@ function goTo(id){
}
const SIDEBARS = {
- p1:{title:"Шпаргалка § 1", rows:[["Тема","Призма"],["Прямая","$S_{бок}=P_{осн}\\\\cdot h$"],["Наклонная","$S_{бок}=P_{пер}\\\\cdot l$"],["Объём","$V=S_{осн}\\\\cdot h$"],["Диагональ пар.","$d=\\\\sqrt{a^2+b^2+c^2}$"]]},
- p2:{title:"Шпаргалка § 2", rows:[["Тема", "Цилиндр"],["$S_{осн}$","$\\\\pi R^2$"],["$S_{бок}$","$2\\\\pi Rh$"],["$S_{полн}$","$2\\\\pi R(R+h)$"],["$V$","$\\\\pi R^2 h$"],["Развёртка","прямоуг. $2\\\\pi R \\\\times h$"],["Осевое сеч.","прямоуг. $2R \\\\times h$"],["Наклон. сеч.","эллипс, $a=R/\\\\cos\\\\alpha$, $b=R$"]]},
+ p1:{title:"Шпаргалка § 1", rows:[["Тема","Призма"],["Прямая","$S_{бок}=P_{осн}\\cdot h$"],["Наклонная","$S_{бок}=P_{пер}\\cdot l$"],["Объём","$V=S_{осн}\\cdot h$"],["Диагональ пар.","$d=\\sqrt{a^2+b^2+c^2}$"]]},
+ p2:{title:"Шпаргалка § 2", rows:[["Тема", "Цилиндр"],["$S_{осн}$","$\\pi R^2$"],["$S_{бок}$","$2\\pi Rh$"],["$S_{полн}$","$2\\pi R(R+h)$"],["$V$","$\\pi R^2 h$"],["Развёртка","прямоуг. $2\\pi R \\times h$"],["Осевое сеч.","прямоуг. $2R \\times h$"],["Наклон. сеч.","эллипс, $a=R/\\cos\\alpha$, $b=R$"]]},
final1:{title:"Финал раздела 1", rows:[["§ 1","Призма"],["§ 2","Цилиндр"],["Боссы","5 интегрированных"],["Награда","+50 XP + ачивка"]]}
};
const TIPS=[
- {sec:'p1',html:"§ 1 «Призма» — крути 3D-модель в интерактиве 1, проверь формулы в калькуляторе. Главное: $V=S_{осн}\\\\cdot h$, $S_{бок}=P_{осн}\\\\cdot h$ (для прямой)."},
- {sec:'p2',html:"§ 2 «Цилиндр» — крути 3D-модель в интерактиве 1, разбирай сечения в IV2 (круг/прямоугольник/эллипс). Главное: $S_{бок}=2\\\\\\\\pi Rh$, $V=\\\\\\\\pi R^2 h$, развёртка боковой поверхности — прямоугольник $2\\\\\\\\pi R \\\\\\\\times h$."},
+ {sec:'p1',html:"§ 1 «Призма» — крути 3D-модель в интерактиве 1, проверь формулы в калькуляторе. Главное: $V=S_{осн}\\cdot h$, $S_{бок}=P_{осн}\\cdot h$ (для прямой)."},
+ {sec:'p2',html:"§ 2 «Цилиндр» — крути 3D-модель в интерактиве 1, разбирай сечения в IV2 (круг/прямоугольник/эллипс). Главное: $S_{бок}=2\\pi Rh$, $V=\\pi R^2 h$, развёртка боковой поверхности — прямоугольник $2\\pi R \\times h$."},
{sec:'final1',html:"Финал раздела 1 — интегрированные задачи по разделу."}
];
diff --git a/frontend/textbooks/geometry_11_ch2.html b/frontend/textbooks/geometry_11_ch2.html
index f230b5e..c9e2f62 100644
--- a/frontend/textbooks/geometry_11_ch2.html
+++ b/frontend/textbooks/geometry_11_ch2.html
@@ -413,30 +413,30 @@ const SIDEBARS = {
["Пирамида", "основание + апекс"],
["Правильная","основание — правильный многоугольник; высота в центре основания"],
["Апофема $l$","высота боковой грани"],
- ["Объём","$V=\\\\dfrac{1}{3}S_{осн}\\\\cdot h$"],
- ["$S_{бок}$ (правильной)","$\\\\dfrac{1}{2}P_{осн}\\\\cdot l$"],
- ["Боковое ребро","$b=\\\\sqrt{R^2+h^2}$"],
- ["Апофема","$l=\\\\sqrt{r^2+h^2}$"],
- ["Усечённая","$V=\\\\dfrac{h}{3}(S_1+S_2+\\\\sqrt{S_1 S_2})$"]
+ ["Объём","$V=\\dfrac{1}{3}S_{осн}\\cdot h$"],
+ ["$S_{бок}$ (правильной)","$\\dfrac{1}{2}P_{осн}\\cdot l$"],
+ ["Боковое ребро","$b=\\sqrt{R^2+h^2}$"],
+ ["Апофема","$l=\\sqrt{r^2+h^2}$"],
+ ["Усечённая","$V=\\dfrac{h}{3}(S_1+S_2+\\sqrt{S_1 S_2})$"]
]},
p4:{title:"Шпаргалка § 4", rows:[
["Конус","основание ($R$) + апекс"],
["Связь","$l^2=R^2+h^2$"],
- ["$S_{осн}$","$\\\\pi R^2$"],
- ["$S_{бок}$","$\\\\pi R l$"],
- ["$S_{полн}$","$\\\\pi R(R+l)$"],
- ["$V$","$\\\\dfrac{1}{3}\\\\pi R^2 h$"],
- ["Развёртка","сектор $r=l$, дуга $2\\\\pi R$"],
- ["Угол развёртки","$\\\\varphi=\\\\dfrac{360°R}{l}$"],
- ["Усечённый $V$","$\\\\dfrac{\\\\pi h}{3}(R_1^2+R_2^2+R_1R_2)$"],
- ["Усечённый $S_{бок}$","$\\\\pi(R_1+R_2)l$"]
+ ["$S_{осн}$","$\\pi R^2$"],
+ ["$S_{бок}$","$\\pi R l$"],
+ ["$S_{полн}$","$\\pi R(R+l)$"],
+ ["$V$","$\\dfrac{1}{3}\\pi R^2 h$"],
+ ["Развёртка","сектор $r=l$, дуга $2\\pi R$"],
+ ["Угол развёртки","$\\varphi=\\dfrac{360°R}{l}$"],
+ ["Усечённый $V$","$\\dfrac{\\pi h}{3}(R_1^2+R_2^2+R_1R_2)$"],
+ ["Усечённый $S_{бок}$","$\\pi(R_1+R_2)l$"]
]},
final2:{title:"Финал раздела 2", rows:[["§ 3–§ 4","теория раздела 2"],["Награда","+50 XP"]]}
};
const TIPS=[
- {sec:'p3',html:"Главное правило: $V=\\\\\\\\dfrac{1}{3}S_{осн}h$ для любой пирамиды. А для правильной — $S_{бок}=\\\\\\\\dfrac{1}{2}P_{осн}l$, где $l$ — апофема."},
- {sec:'p4',html:"Запомни связку: $l^2=R^2+h^2$. Все формулы конуса — это $\\\\\\\\pi R$ умноженное на соответствующий «множитель»: $R$ (основание), $l$ (боковая), $R+l$ (полная), $\\\\\\\\dfrac{Rh}{3}$ (объём)."},
+ {sec:'p3',html:"Главное правило: $V=\\dfrac{1}{3}S_{осн}h$ для любой пирамиды. А для правильной — $S_{бок}=\\dfrac{1}{2}P_{осн}l$, где $l$ — апофема."},
+ {sec:'p4',html:"Запомни связку: $l^2=R^2+h^2$. Все формулы конуса — это $\\pi R$ умноженное на соответствующий «множитель»: $R$ (основание), $l$ (боковая), $R+l$ (полная), $\\dfrac{Rh}{3}$ (объём)."},
{sec:'final2',html:"Финал раздела 2 — интегрированные задачи по разделу."}
];
diff --git a/frontend/textbooks/geometry_11_ch3.html b/frontend/textbooks/geometry_11_ch3.html
index 4cfcb80..9e65004 100644
--- a/frontend/textbooks/geometry_11_ch3.html
+++ b/frontend/textbooks/geometry_11_ch3.html
@@ -415,25 +415,25 @@ const SIDEBARS = {
p5:{title:"Шпаргалка § 5", rows:[
["Тема", "Сфера"],
["Сфера", "множество точек, $|OM|=R$"],
- ["Шар", "множество точек, $|OM|\\\\le R$"],
+ ["Шар", "множество точек, $|OM|\\le R$"],
["Уравнение", "$(x-a)^2+(y-b)^2+(z-c)^2=R^2$"],
- ["Касательная", "плоскость $\\\\perp$ радиусу $OM$"],
- ["Сечение", "окружность $r=\\\\sqrt{R^2-d^2}$"],
+ ["Касательная", "плоскость $\\perp$ радиусу $OM$"],
+ ["Сечение", "окружность $r=\\sqrt{R^2-d^2}$"],
["Большой круг", "$d=0$, $r=R$"],
- ["Площадь", "$S=4\\\\pi R^2$"],
- ["Объём шара", "$V=\\\\tfrac{4}{3}\\\\pi R^3$"]
+ ["Площадь", "$S=4\\pi R^2$"],
+ ["Объём шара", "$V=\\tfrac{4}{3}\\pi R^3$"]
]},
p6:{title:"Шпаргалка § 6", rows:[
["Тема", "Шар"],
- ["Шар", "тело, $|OM|\\\\le R$"],
- ["Площадь сферы", "$S=4\\\\pi R^2$"],
- ["Объём шара", "$V=\\\\tfrac{4}{3}\\\\pi R^3$"],
- ["Сегмент $V$", "$\\\\tfrac{\\\\pi h^2(3R-h)}{3}$"],
- ["Сегмент $S$", "$2\\\\pi R h$"],
- ["Сектор $V$", "$\\\\tfrac{2}{3}\\\\pi R^2 h$"],
- ["Слой $V$", "$\\\\tfrac{\\\\pi h}{6}(3r_1^2+3r_2^2+h^2)$"],
+ ["Шар", "тело, $|OM|\\le R$"],
+ ["Площадь сферы", "$S=4\\pi R^2$"],
+ ["Объём шара", "$V=\\tfrac{4}{3}\\pi R^3$"],
+ ["Сегмент $V$", "$\\tfrac{\\pi h^2(3R-h)}{3}$"],
+ ["Сегмент $S$", "$2\\pi R h$"],
+ ["Сектор $V$", "$\\tfrac{2}{3}\\pi R^2 h$"],
+ ["Слой $V$", "$\\tfrac{\\pi h}{6}(3r_1^2+3r_2^2+h^2)$"],
["Куб впис. шар", "$r=a/2$"],
- ["Куб опис. шар", "$R=\\\\tfrac{a\\\\sqrt{3}}{2}$"]
+ ["Куб опис. шар", "$R=\\tfrac{a\\sqrt{3}}{2}$"]
]},
p7:{title:"Шпаргалка § 7", rows:[
["Тема", "Правильные многогранники"],
@@ -445,16 +445,16 @@ const SIDEBARS = {
["Додекаэдр", "$F{=}12,\\\\ V{=}20,\\\\ E{=}30$"],
["Икосаэдр", "$F{=}20,\\\\ V{=}12,\\\\ E{=}30$"],
["Эйлер", "$V-E+F=2$"],
- ["Куб$\\\\leftrightarrow$Окт.", "двойственные"],
- ["Дод.$\\\\leftrightarrow$Икос.", "двойственные"]
+ ["Куб$\\leftrightarrow$Окт.", "двойственные"],
+ ["Дод.$\\leftrightarrow$Икос.", "двойственные"]
]},
final3:{title:"Финал раздела 3", rows:[["§ 5–§ 7","теория раздела 3"],["Награда","+50 XP"]]}
};
const TIPS=[
- {sec:'p5',html:"Сфера: $|OM|=R$. Уравнение $(x-a)^2+(y-b)^2+(z-c)^2=R^2$. Сечение плоскостью — окружность $r=\\\\sqrt{R^2-d^2}$."},
- {sec:'p6',html:"Шар: $S=4\\\\pi R^2$, $V=\\\\tfrac{4}{3}\\\\pi R^3$. Сегмент: $V=\\\\tfrac{\\\\pi h^2(3R-h)}{3}$, $S=2\\\\pi R h$. Куб впис. шар: $r=a/2$; куб опис. шар: $R=\\\\tfrac{a\\\\sqrt 3}{2}$."},
- {sec:'p7',html:"Платоновых тел ровно $5$: тетраэдр, куб, октаэдр, додекаэдр, икосаэдр. Формула Эйлера: $V-E+F=2$. Двойственные пары: куб$\\\\leftrightarrow$октаэдр, додекаэдр$\\\\leftrightarrow$икосаэдр; тетраэдр — сам себе двойственный."},
+ {sec:'p5',html:"Сфера: $|OM|=R$. Уравнение $(x-a)^2+(y-b)^2+(z-c)^2=R^2$. Сечение плоскостью — окружность $r=\\sqrt{R^2-d^2}$."},
+ {sec:'p6',html:"Шар: $S=4\\pi R^2$, $V=\\tfrac{4}{3}\\pi R^3$. Сегмент: $V=\\tfrac{\\pi h^2(3R-h)}{3}$, $S=2\\pi R h$. Куб впис. шар: $r=a/2$; куб опис. шар: $R=\\tfrac{a\\sqrt 3}{2}$."},
+ {sec:'p7',html:"Платоновых тел ровно $5$: тетраэдр, куб, октаэдр, додекаэдр, икосаэдр. Формула Эйлера: $V-E+F=2$. Двойственные пары: куб$\\leftrightarrow$октаэдр, додекаэдр$\\leftrightarrow$икосаэдр; тетраэдр — сам себе двойственный."},
{sec:'final3',html:"Финал раздела 3 — интегрированные задачи по разделу."}
];
diff --git a/frontend/textbooks/geometry_11_ch4.html b/frontend/textbooks/geometry_11_ch4.html
index 9dce064..69a5639 100644
--- a/frontend/textbooks/geometry_11_ch4.html
+++ b/frontend/textbooks/geometry_11_ch4.html
@@ -419,7 +419,7 @@ function goTo(id){
const SIDEBARS = {
p8:{title:"Шпаргалка § 8", rows:[["Сумма углов $\\triangle$","$180°$"],["Пифагор","$a^2+b^2=c^2$"],["Синусов","$\\dfrac{a}{\\sin A}=2R$"],["Косинусов","$c^2=a^2+b^2-2ab\\cos C$"],["Длина окр.","$C=2\\pi R$"],["$S$ круга","$\\pi R^2$"]]},
p9:{title:"Шпаргалка § 9", rows:[["$S_\\triangle$","$\\frac{1}{2}ab\\sin C$"],["Герон","$\\sqrt{p(p-a)(p-b)(p-c)}$"],["$S$ трап.","$\\frac{a+b}{2}h$"],["$V$ призмы","$S_{осн}h$"],["$V$ пир.","$\\frac{1}{3}S_{осн}h$"],["$V$ шара","$\\frac{4}{3}\\pi R^3$"]]},
- p10:{title:"Шпаргалка § 10", rows:[["Тема", "Координаты и векторы"],["Формула","3D: $\\\\vec{a}=(x;y;z)$"]]},
+ p10:{title:"Шпаргалка § 10", rows:[["Тема", "Координаты и векторы"],["Формула","3D: $\\vec{a}=(x;y;z)$"]]},
p11:{title:"Шпаргалка § 11", rows:[["Тема", "Геометрические построения"],["Формула","циркуль и линейка"]]},
final4:{title:"Финал раздела 4", rows:[["§ 8–§ 11","теория раздела 4"],["Награда","+50 XP"]]}
};
@@ -427,7 +427,7 @@ const SIDEBARS = {
const TIPS=[
{sec:'p8',html:"§ 8: обзор планиметрии. Теоремы Пифагора, синусов, косинусов; виды треугольников и четырёхугольников; окружность."},
{sec:'p9',html:"§ 9: площади плоских фигур и объёмы тел. Формулы Герона, $S=\\frac{1}{2}ab\\sin C$, $V=\\frac{1}{3}S_{осн}h$, шар."},
- {sec:'p10',html:"§ 10 «Координаты и векторы» — содержание в разработке. 3D: $\\\\\\\\vec{a}=(x;y;z)$"},
+ {sec:'p10',html:"§ 10 «Координаты и векторы» — содержание в разработке. 3D: $\\vec{a}=(x;y;z)$"},
{sec:'p11',html:"§ 11 «Геометрические построения» — содержание в разработке. циркуль и линейка"},
{sec:'final4',html:"Финал раздела 4 — интегрированные задачи по разделу."}
];