fix(textbooks): Физика 9 — STATE collision, KaTeX escape, авто-init симуляций

Три бага из жалобы пользователя:

1) phys9_legacy.js упал с 'Identifier STATE has already been declared' —
   const STATE в монолите конфликтовал с const STATE в chapter inline JS.
   Скрипт extract_phys9_legacy.cjs теперь оборачивает извлечённый код в IIFE
   и явно экспортит через window 70 функций (upd*/draw*/init*/start*/lab*/
   check*/toggle*/render*/show*/...) + 7 const-массивов (TASKS_PN, PUZ_PN).

2) В боковой панели формулы рендерились как 'Delta vecr' вместо Δr⃗ —
   мой переход на JSON.stringify в gen_phys9_ch.js добавил лишний слой
   escape backslash. Уменьшил \\ → \ в SIDEBAR_ROWS, TIPS_HTML,
   PARA_SUBS, LR_SUBS (90 строк). Цепочка теперь: source \Delta → string
   \Delta → JSON "\\Delta" → HTML JS \Delta → runtime \Delta →
   KaTeX \Delta ✓.

3) 'не работают симуляции' — функции из legacy.js были доступны, но
   chapter goTo(id) их не вызывал. Добавлен авто-вызов upd<N>(),
   startAnim<N>(), init<N>(), draw<N>() при переключении на параграф,
   и updLab<N>(), drawLab<N>() — для ЛР.
This commit is contained in:
Maxim Dolgolyov
2026-05-30 09:06:20 +03:00
parent c26423b7d4
commit 66bd7ac1f4
8 changed files with 412 additions and 194 deletions
+48 -31
View File
@@ -15,7 +15,6 @@
<script src="/js/api.js" defer></script>
<script src="/js/xp.js" defer></script>
<script src="/js/phys.js" defer></script>
<script src="/js/phys9_legacy.js" defer></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800;900&family=Unbounded:wght@700;800;900&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
<style>
:root{
@@ -635,17 +634,17 @@ const _TB_SLUG = 'physics-9-ch1';
const PARAS = [
{ id:"p1", num:"§ 1", name:"Механическое движение", sub:"материальная точка" },
{ id:"p2", num:"§ 2", name:"Относительность движения. Система отсчёта", sub:"СО · относительность" },
{ id:"p3", num:"§ 3", name:"Скалярные и векторные величины. Действия над векторами", sub:"$\\\\vec a + \\\\vec b$" },
{ id:"p4", num:"§ 4", name:"Проекция вектора на ось", sub:"$a_x = a\\\\cos\\\\alpha$" },
{ id:"p5", num:"§ 5", name:"Путь и перемещение", sub:"$s$ vs $\\\\Delta\\\\vec r$" },
{ id:"p6", num:"§ 6", name:"Равномерное прямолинейное движение. Скорость", sub:"$\\\\Delta\\\\vec r = \\\\vec v t$" },
{ id:"p3", num:"§ 3", name:"Скалярные и векторные величины. Действия над векторами", sub:"$\\vec a + \\vec b$" },
{ id:"p4", num:"§ 4", name:"Проекция вектора на ось", sub:"$a_x = a\\cos\\alpha$" },
{ id:"p5", num:"§ 5", name:"Путь и перемещение", sub:"$s$ vs $\\Delta\\vec r$" },
{ id:"p6", num:"§ 6", name:"Равномерное прямолинейное движение. Скорость", sub:"$\\Delta\\vec r = \\vec v t$" },
{ id:"p7", num:"§ 7", name:"Графическое представление равномерного движения", sub:"графики $v(t)$, $x(t)$" },
{ id:"p8", num:"§ 8", name:"Неравномерное движение. Средняя и мгновенная скорость", sub:"$\\\\langle v\\\\rangle = s/t$" },
{ id:"p9", num:"§ 9", name:"Сложение скоростей", sub:"$\\\\vec v_{1,3} = \\\\vec v_{1,2} + \\\\vec v_{2,3}$" },
{ id:"p10", num:"§ 10", name:"Ускорение", sub:"$\\\\vec a = \\\\Delta\\\\vec v/\\\\Delta t$" },
{ id:"p11", num:"§ 11", name:"Скорость при равноускоренном движении", sub:"$\\\\vec v = \\\\vec v_0 + \\\\vec a t$" },
{ id:"p8", num:"§ 8", name:"Неравномерное движение. Средняя и мгновенная скорость", sub:"$\\langle v\\rangle = s/t$" },
{ id:"p9", num:"§ 9", name:"Сложение скоростей", sub:"$\\vec v_{1,3} = \\vec v_{1,2} + \\vec v_{2,3}$" },
{ id:"p10", num:"§ 10", name:"Ускорение", sub:"$\\vec a = \\Delta\\vec v/\\Delta t$" },
{ id:"p11", num:"§ 11", name:"Скорость при равноускоренном движении", sub:"$\\vec v = \\vec v_0 + \\vec a t$" },
{ id:"p12", num:"§ 12", name:"Перемещение, координата и путь при равноускоренном движении", sub:"$x = x_0 + v_0 t + at^2/2$" },
{ id:"p13", num:"§ 13", name:"Линейная и угловая скорости", sub:"$v = \\\\omega R$" },
{ id:"p13", num:"§ 13", name:"Линейная и угловая скорости", sub:"$v = \\omega R$" },
{ id:"p14", num:"§ 14", name:"Ускорение точки при движении по окружности", sub:"$a_n = v^2/R$" },
{ id:"final1", num:'\u2605', name:'Финал главы', sub:"Итоги · боссы главы 1", final:true }
];
@@ -786,24 +785,42 @@ function goTo(id){
window.scrollTo({top:0,behavior:'smooth'});
if((STATE.progress[id]||0)<10) bumpProgress(id, 10);
if(window.renderMathInElement) setTimeout(()=>renderMath(el), 0);
// Auto-init legacy simulations: call upd<N>() / startAnim<N>() / draw<N>() if defined in phys9_legacy.js.
if(id.startsWith('p')){
const n = id.slice(1);
setTimeout(()=>{
['upd','startAnim','init','draw'].forEach(prefix=>{
const fn = window[prefix + n];
if(typeof fn === 'function'){ try{ fn(); }catch(e){ console.warn(prefix + n + ' init:', e.message); } }
});
}, 50);
} else if(id.startsWith('lr')){
const n = id.slice(2);
setTimeout(()=>{
['updLab','drawLab'].forEach(prefix=>{
const fn = window[prefix + n];
if(typeof fn === 'function'){ try{ fn(); }catch(e){} }
});
}, 50);
}
markLastPara(id);
}
const SIDEBARS = {
p1:{title:"Шпаргалка §1",rows:[["Кинематика","описывает движение без причин"],["Мат. точка","тело с пренебр. размерами"],["Поступательное","все точки движутся одинаково"]]},
p2:{title:"Шпаргалка §2",rows:[["СО","тело отсчёта + оси + часы"],["Относ.","скорость, путь, траектория"],["Земля","чаще всего тело отсчёта"]]},
p3:{title:"Шпаргалка §3",rows:[["Скаляр","число"],["Вектор","число + направление"],["$\\\\vec a + \\\\vec b$","правило треугольника / параллелограмма"]]},
p4:{title:"Шпаргалка §4",rows:[["Проекция","$a_x = a\\\\cos\\\\alpha$"],["Знак","зависит от $\\\\alpha$"],["Сумма","$(\\\\vec a + \\\\vec b)_x = a_x + b_x$"]]},
p5:{title:"Шпаргалка §5",rows:[["Путь","скаляр $s \\\\ge 0$"],["Перемещ.","вектор $\\\\Delta\\\\vec r$"],["$s \\\\ge |\\\\Delta\\\\vec r|$",""]]},
p6:{title:"Шпаргалка §6",rows:[["$\\\\vec v = \\\\text{const}$","равномерное"],["$\\\\Delta\\\\vec r = \\\\vec v t$",""],["$x = x_0 + v_x t$","координата"]]},
p3:{title:"Шпаргалка §3",rows:[["Скаляр","число"],["Вектор","число + направление"],["$\\vec a + \\vec b$","правило треугольника / параллелограмма"]]},
p4:{title:"Шпаргалка §4",rows:[["Проекция","$a_x = a\\cos\\alpha$"],["Знак","зависит от $\\alpha$"],["Сумма","$(\\vec a + \\vec b)_x = a_x + b_x$"]]},
p5:{title:"Шпаргалка §5",rows:[["Путь","скаляр $s \\ge 0$"],["Перемещ.","вектор $\\Delta\\vec r$"],["$s \\ge |\\Delta\\vec r|$",""]]},
p6:{title:"Шпаргалка §6",rows:[["$\\vec v = \\text{const}$","равномерное"],["$\\Delta\\vec r = \\vec v t$",""],["$x = x_0 + v_x t$","координата"]]},
p7:{title:"Шпаргалка §7",rows:[["$v(t)$","прямая"],["$x(t)$","наклонная прямая"],["Площадь","под $v(t)$ = путь"]]},
p8:{title:"Шпаргалка §8",rows:[["Средняя","$\\\\langle v\\\\rangle = s/t$"],["Мгновенная","предел $\\\\Delta s/\\\\Delta t$"],["Спидометр","показывает мгн. $v$"]]},
p9:{title:"Шпаргалка §9",rows:[["$\\\\vec v_{1,3} = \\\\vec v_{1,2} + \\\\vec v_{2,3}$",""],["Лодка/река","$\\\\vec v_{л,б} = \\\\vec v_{л,в} + \\\\vec v_{в,б}$"],["По теч.","скорости складываются"]]},
p10:{title:"Шпаргалка §10",rows:[["$\\\\vec a = \\\\Delta\\\\vec v/\\\\Delta t$",""],["Ед.","м/с²"],["Знак","совпадает с $\\\\Delta\\\\vec v$"]]},
p11:{title:"Шпаргалка §11",rows:[["$\\\\vec v = \\\\vec v_0 + \\\\vec a t$",""],["Проекция","$v_x = v_{0x} + a_x t$"],["",""]]},
p12:{title:"Шпаргалка §12",rows:[["$\\\\Delta\\\\vec r = \\\\vec v_0 t + \\\\vec a t^2/2$",""],["$v^2 - v_0^2 = 2a_x\\\\Delta x$","без $t$"],["",""]]},
p13:{title:"Шпаргалка §13",rows:[["$\\\\omega = 2\\\\pi/T$",""],["$v = \\\\omega R$",""],["$\\\\omega$","рад/с"]]},
p14:{title:"Шпаргалка §14",rows:[["$a_n = v^2/R$",""],["$a_n = \\\\omega^2 R$",""],["К центру","направление"]]},
p8:{title:"Шпаргалка §8",rows:[["Средняя","$\\langle v\\rangle = s/t$"],["Мгновенная","предел $\\Delta s/\\Delta t$"],["Спидометр","показывает мгн. $v$"]]},
p9:{title:"Шпаргалка §9",rows:[["$\\vec v_{1,3} = \\vec v_{1,2} + \\vec v_{2,3}$",""],["Лодка/река","$\\vec v_{л,б} = \\vec v_{л,в} + \\vec v_{в,б}$"],["По теч.","скорости складываются"]]},
p10:{title:"Шпаргалка §10",rows:[["$\\vec a = \\Delta\\vec v/\\Delta t$",""],["Ед.","м/с²"],["Знак","совпадает с $\\Delta\\vec v$"]]},
p11:{title:"Шпаргалка §11",rows:[["$\\vec v = \\vec v_0 + \\vec a t$",""],["Проекция","$v_x = v_{0x} + a_x t$"],["",""]]},
p12:{title:"Шпаргалка §12",rows:[["$\\Delta\\vec r = \\vec v_0 t + \\vec a t^2/2$",""],["$v^2 - v_0^2 = 2a_x\\Delta x$","без $t$"],["",""]]},
p13:{title:"Шпаргалка §13",rows:[["$\\omega = 2\\pi/T$",""],["$v = \\omega R$",""],["$\\omega$","рад/с"]]},
p14:{title:"Шпаргалка §14",rows:[["$a_n = v^2/R$",""],["$a_n = \\omega^2 R$",""],["К центру","направление"]]},
final1:{title:"Финал главы 1",rows:[["§§114","теория главы 1"],["Награда","+50 XP"]]}
};
@@ -811,17 +828,17 @@ const TIPS=[
{sec:"p1",html:"Кинематика — раздел физики о движении без причин. Мат. точка — тело, размерами которого можно пренебречь."},
{sec:"p2",html:"СО = тело отсчёта + система координат + часы. Скорость, путь и траектория зависят от выбора СО."},
{sec:"p3",html:"Скаляры — число (масса, путь). Векторы — число + направление (сила, скорость). Сумма векторов: правило треугольника или параллелограмма."},
{sec:"p4",html:"Проекция вектора $\\\\vec a$ на ось: $a_x = a\\\\cos\\\\alpha$. Знак зависит от угла $\\\\alpha$. Сумма проекций = проекция суммы."},
{sec:"p5",html:"Путь $s$ — скаляр $\\\\ge 0$. Перемещение $\\\\Delta\\\\vec r$ — вектор. Всегда $s \\\\ge |\\\\Delta\\\\vec r|$."},
{sec:"p6",html:"Равномерное движение: $\\\\vec v = \\\\text{const}$. $\\\\Delta\\\\vec r = \\\\vec v t$, координата $x = x_0 + v_x t$."},
{sec:"p4",html:"Проекция вектора $\\vec a$ на ось: $a_x = a\\cos\\alpha$. Знак зависит от угла $\\alpha$. Сумма проекций = проекция суммы."},
{sec:"p5",html:"Путь $s$ — скаляр $\\ge 0$. Перемещение $\\Delta\\vec r$ — вектор. Всегда $s \\ge |\\Delta\\vec r|$."},
{sec:"p6",html:"Равномерное движение: $\\vec v = \\text{const}$. $\\Delta\\vec r = \\vec v t$, координата $x = x_0 + v_x t$."},
{sec:"p7",html:"График $v(t)$ — прямая параллельная оси $t$. График $x(t)$ — наклонная прямая. Площадь под $v(t)$ = пройденный путь."},
{sec:"p8",html:"Средняя скорость: $\\\\langle v\\\\rangle = s/t$. Мгновенная — предел $\\\\Delta s/\\\\Delta t$ при $\\\\Delta t \\\\to 0$. Спидометр показывает мгновенную."},
{sec:"p9",html:"Закон сложения скоростей: $\\\\vec v_{1,3} = \\\\vec v_{1,2} + \\\\vec v_{2,3}$. По течению — скорости складываются, против — вычитаются."},
{sec:"p10",html:"Ускорение: $\\\\vec a = \\\\Delta\\\\vec v / \\\\Delta t$. Единица м/с². Направление совпадает с $\\\\Delta\\\\vec v$."},
{sec:"p11",html:"При равноускоренном движении: $\\\\vec v = \\\\vec v_0 + \\\\vec a t$. В проекциях: $v_x = v_{0x} + a_x t$."},
{sec:"p12",html:"Перемещение: $\\\\Delta\\\\vec r = \\\\vec v_0 t + \\\\vec a t^2/2$. Без времени: $v^2 - v_0^2 = 2a_x\\\\Delta x$."},
{sec:"p13",html:"Угловая скорость $\\\\omega = 2\\\\pi/T = 2\\\\pi\\\\nu$ (рад/с). Связь с линейной: $v = \\\\omega R$."},
{sec:"p14",html:"Центростремит. ускорение: $a_n = v^2/R = \\\\omega^2 R$. Направлено к центру окружности."},
{sec:"p8",html:"Средняя скорость: $\\langle v\\rangle = s/t$. Мгновенная — предел $\\Delta s/\\Delta t$ при $\\Delta t \\to 0$. Спидометр показывает мгновенную."},
{sec:"p9",html:"Закон сложения скоростей: $\\vec v_{1,3} = \\vec v_{1,2} + \\vec v_{2,3}$. По течению — скорости складываются, против — вычитаются."},
{sec:"p10",html:"Ускорение: $\\vec a = \\Delta\\vec v / \\Delta t$. Единица м/с². Направление совпадает с $\\Delta\\vec v$."},
{sec:"p11",html:"При равноускоренном движении: $\\vec v = \\vec v_0 + \\vec a t$. В проекциях: $v_x = v_{0x} + a_x t$."},
{sec:"p12",html:"Перемещение: $\\Delta\\vec r = \\vec v_0 t + \\vec a t^2/2$. Без времени: $v^2 - v_0^2 = 2a_x\\Delta x$."},
{sec:"p13",html:"Угловая скорость $\\omega = 2\\pi/T = 2\\pi\\nu$ (рад/с). Связь с линейной: $v = \\omega R$."},
{sec:"p14",html:"Центростремит. ускорение: $a_n = v^2/R = \\omega^2 R$. Направлено к центру окружности."},
{sec:"final1",html:"Финал главы 1 — интегрированные задачи по §§1–14. В разработке (Phase 1+)."}
];