From 8786cf5e203bc44560db701255e8d013b237813f Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 30 May 2026 11:53:17 +0300 Subject: [PATCH] =?UTF-8?q?fix(textbooks):=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BB=D1=8D=D1=88=D0=B8=20=D0=B2=20LaTeX-=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D1=83=D0=BB=D0=B0=D1=85=20(over-escaping)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Формулы в 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) --- backend/scripts/fix_overescaped_latex.js | 108 +++++++++++++++++++++++ frontend/textbooks/algebra_11_ch1.html | 12 +-- frontend/textbooks/algebra_11_ch2.html | 6 +- frontend/textbooks/algebra_11_ch3.html | 14 +-- frontend/textbooks/geometry_11_ch1.html | 8 +- frontend/textbooks/geometry_11_ch2.html | 30 +++---- frontend/textbooks/geometry_11_ch3.html | 36 ++++---- frontend/textbooks/geometry_11_ch4.html | 4 +- 8 files changed, 163 insertions(+), 55 deletions(-) create mode 100644 backend/scripts/fix_overescaped_latex.js 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 — интегрированные задачи по разделу."} ];