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
+108
View File
@@ -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'));
+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."}
];
+3 -3
View File
@@ -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:[["§§46","теория главы 2"],["Награда","+50 XP"]]}
};
+7 -7
View File
@@ -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:[["§§710","теория главы 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:"<b>Всегда</b> выписывай ОДЗ: всё под $\\\\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:"<b>Всегда</b> выписывай ОДЗ: всё под $\\log$ должно быть строго положительно."},
{sec:'p10',html:"При $0 < a < 1$ — знак неравенства меняется. ОДЗ обязательно."},
{sec:'final3',html:"Финал главы 3 — синтез логарифмов и логарифмических функций."}
];
+4 -4
View File
@@ -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 — интегрированные задачи по разделу."}
];
+15 -15
View File
@@ -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:"Главное правило: <b>$V=\\\\\\\\dfrac{1}{3}S_{осн}h$</b> для <i>любой</i> пирамиды. А для правильной — $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:"Главное правило: <b>$V=\\dfrac{1}{3}S_{осн}h$</b> для <i>любой</i> пирамиды. А для правильной — $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 — интегрированные задачи по разделу."}
];
+18 -18
View File
@@ -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 — интегрированные задачи по разделу."}
];
+2 -2
View File
@@ -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 — интегрированные задачи по разделу."}
];