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
+38 -21
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{
@@ -627,14 +626,14 @@ const _TB_SLUG = 'physics-9-ch2';
const PARAS = [
{ id:"p15", num:"§ 15", name:"Взаимодействие тел. Сила. ИСО. 1-й закон Ньютона", sub:"1-й закон Ньютона" },
{ id:"p16", num:"§ 16", name:"Масса", sub:"$m_1/m_2 = a_2/a_1$" },
{ id:"p17", num:"§ 17", name:"Второй закон Ньютона", sub:"$\\\\vec F = m\\\\vec a$" },
{ id:"p18", num:"§ 18", name:"Третий закон Ньютона. Принцип относительности Галилея", sub:"$\\\\vec F_{12} = -\\\\vec F_{21}$" },
{ id:"p17", num:"§ 17", name:"Второй закон Ньютона", sub:"$\\vec F = m\\vec a$" },
{ id:"p18", num:"§ 18", name:"Третий закон Ньютона. Принцип относительности Галилея", sub:"$\\vec F_{12} = -\\vec F_{21}$" },
{ id:"p19", num:"§ 19", name:"Деформация тел. Сила упругости. Закон Гука", sub:"$F = -kx$" },
{ id:"p20", num:"§ 20", name:"Силы трения. Силы сопротивления среды", sub:"$F_{тр} = \\\\mu N$" },
{ id:"p20", num:"§ 20", name:"Силы трения. Силы сопротивления среды", sub:"$F_{тр} = \\mu N$" },
{ id:"p21", num:"§ 21", name:"Движение тела под действием силы тяжести", sub:"$h = gt^2/2$" },
{ id:"p22", num:"§ 22", name:"Движение тела, брошенного под углом к горизонту", sub:"$L = v_0^2\\\\sin 2\\\\alpha/g$" },
{ id:"p22", num:"§ 22", name:"Движение тела, брошенного под углом к горизонту", sub:"$L = v_0^2\\sin 2\\alpha/g$" },
{ id:"p23", num:"§ 23", name:"Закон всемирного тяготения", sub:"$F = Gm_1m_2/r^2$" },
{ id:"p24", num:"§ 24", name:"Вес. Невесомость и перегрузки", sub:"$P = m(g \\\\pm a)$" },
{ id:"p24", num:"§ 24", name:"Вес. Невесомость и перегрузки", sub:"$P = m(g \\pm a)$" },
{ id:"final2", num:'\u2605', name:'Финал главы', sub:"Итоги · боссы главы 2", final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -770,34 +769,52 @@ 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 = {
p15:{title:"Шпаргалка §15",rows:[["ИСО","системы, в которых выполняется 1-й закон"],["1-й Н.","$\\\\sum\\\\vec F = 0 \\\\Rightarrow \\\\vec v = \\\\text{const}$"],["Инерция","свойство сохранять скорость"]]},
p15:{title:"Шпаргалка §15",rows:[["ИСО","системы, в которых выполняется 1-й закон"],["1-й Н.","$\\sum\\vec F = 0 \\Rightarrow \\vec v = \\text{const}$"],["Инерция","свойство сохранять скорость"]]},
p16:{title:"Шпаргалка §16",rows:[["Масса","мера инертности"],["$m_1/m_2 = a_2/a_1$",""],["Ед.","кг (эталон)"]]},
p17:{title:"Шпаргалка §17",rows:[["$\\\\vec a = \\\\vec F/m$",""],["$\\\\vec F = m\\\\vec a$",""],["Принцип суперп.","$\\\\vec F = \\\\sum\\\\vec F_i$"]]},
p18:{title:"Шпаргалка §18",rows:[["3-й Н.","$\\\\vec F_{12} = -\\\\vec F_{21}$"],["Разные тела","силы действуют на разные тела"],["Галилей","законы одинаковы во всех ИСО"]]},
p17:{title:"Шпаргалка §17",rows:[["$\\vec a = \\vec F/m$",""],["$\\vec F = m\\vec a$",""],["Принцип суперп.","$\\vec F = \\sum\\vec F_i$"]]},
p18:{title:"Шпаргалка §18",rows:[["3-й Н.","$\\vec F_{12} = -\\vec F_{21}$"],["Разные тела","силы действуют на разные тела"],["Галилей","законы одинаковы во всех ИСО"]]},
p19:{title:"Шпаргалка §19",rows:[["Закон Гука","$F = -kx$"],["Жёсткость","$k$, ед. Н/м"],["Лин. упр.","при малых деформациях"]]},
p20:{title:"Шпаргалка §20",rows:[["Покоя","до начала движения"],["Скольж.","$F_{тр} = \\\\mu N$"],["$\\\\mu$","коэф. трения"]]},
p21:{title:"Шпаргалка §21",rows:[["$g \\\\approx 9{,}81$ м/с²",""],["$h = gt^2/2$","свободное падение"],["$v = gt$",""]]},
p22:{title:"Шпаргалка §22",rows:[["$L = v_0^2 \\\\sin 2\\\\alpha / g$","дальность"],["$H = v_0^2\\\\sin^2\\\\alpha/(2g)$","высота"],["$\\\\alpha = 45°$","макс. дальность"]]},
p23:{title:"Шпаргалка §23",rows:[["$F = G m_1 m_2 / r^2$",""],["$G = 6{,}67\\\\cdot 10^{-11}$ Н·м²/кг²",""],["$g = GM/R^2$","на поверх. Земли"]]},
p24:{title:"Шпаргалка §24",rows:[["Вес $P$","сила на опору/подвес"],["$P = m(g \\\\pm a)$",""],["$P = 0$","невесомость"]]},
p20:{title:"Шпаргалка §20",rows:[["Покоя","до начала движения"],["Скольж.","$F_{тр} = \\mu N$"],["$\\mu$","коэф. трения"]]},
p21:{title:"Шпаргалка §21",rows:[["$g \\approx 9{,}81$ м/с²",""],["$h = gt^2/2$","свободное падение"],["$v = gt$",""]]},
p22:{title:"Шпаргалка §22",rows:[["$L = v_0^2 \\sin 2\\alpha / g$","дальность"],["$H = v_0^2\\sin^2\\alpha/(2g)$","высота"],["$\\alpha = 45°$","макс. дальность"]]},
p23:{title:"Шпаргалка §23",rows:[["$F = G m_1 m_2 / r^2$",""],["$G = 6{,}67\\cdot 10^{-11}$ Н·м²/кг²",""],["$g = GM/R^2$","на поверх. Земли"]]},
p24:{title:"Шпаргалка §24",rows:[["Вес $P$","сила на опору/подвес"],["$P = m(g \\pm a)$",""],["$P = 0$","невесомость"]]},
final2:{title:"Финал главы 2",rows:[["§§1524","теория главы 2"],["Награда","+50 XP"]]}
};
const TIPS=[
{sec:"p15",html:"ИСО — система, в которой выполняется 1-й закон Ньютона. В отсутствие сил тело сохраняет скорость (инерция)."},
{sec:"p16",html:"Масса — мера инертности. $m_1/m_2 = a_2/a_1$. Единица — килограмм, эталонная."},
{sec:"p17",html:"2-й закон Ньютона: $\\\\vec a = \\\\vec F/m$. Или $\\\\vec F = m\\\\vec a$. Принцип суперпозиции: $\\\\vec F = \\\\sum \\\\vec F_i$."},
{sec:"p18",html:"3-й закон Ньютона: $\\\\vec F_{12} = -\\\\vec F_{21}$. Силы приложены к разным телам! Принцип относ. Галилея: законы одинаковы во всех ИСО."},
{sec:"p17",html:"2-й закон Ньютона: $\\vec a = \\vec F/m$. Или $\\vec F = m\\vec a$. Принцип суперпозиции: $\\vec F = \\sum \\vec F_i$."},
{sec:"p18",html:"3-й закон Ньютона: $\\vec F_{12} = -\\vec F_{21}$. Силы приложены к разным телам! Принцип относ. Галилея: законы одинаковы во всех ИСО."},
{sec:"p19",html:"Закон Гука: $F_{упр} = -kx$, где $k$ — жёсткость пружины (Н/м). Линейность только при малых деформациях."},
{sec:"p20",html:"Сила трения скольжения: $F_{тр} = \\\\mu N$, где $\\\\mu$ — коэф. трения. Сила сопротивления среды растёт со скоростью."},
{sec:"p21",html:"Свободное падение: $g \\\\approx 9{,}81$ м/с² у поверхности Земли. $h = gt^2/2$, $v = gt$."},
{sec:"p22",html:"Тело, брошенное под углом: $L = v_0^2 \\\\sin 2\\\\alpha/g$ — дальность; $H = v_0^2\\\\sin^2\\\\alpha/(2g)$ — высота. Макс. $L$ при $\\\\alpha = 45°$."},
{sec:"p23",html:"Закон всемирного тяготения: $F = G m_1 m_2/r^2$. $G = 6{,}67\\\\cdot 10^{-11}$ Н·м²/кг². У поверхности: $g = GM/R^2$."},
{sec:"p24",html:"Вес $P$ — сила, с которой тело давит на опору / тянет подвес. $P = m(g \\\\pm a)$. При свободном падении $P = 0$ — невесомость."},
{sec:"p20",html:"Сила трения скольжения: $F_{тр} = \\mu N$, где $\\mu$ — коэф. трения. Сила сопротивления среды растёт со скоростью."},
{sec:"p21",html:"Свободное падение: $g \\approx 9{,}81$ м/с² у поверхности Земли. $h = gt^2/2$, $v = gt$."},
{sec:"p22",html:"Тело, брошенное под углом: $L = v_0^2 \\sin 2\\alpha/g$ — дальность; $H = v_0^2\\sin^2\\alpha/(2g)$ — высота. Макс. $L$ при $\\alpha = 45°$."},
{sec:"p23",html:"Закон всемирного тяготения: $F = G m_1 m_2/r^2$. $G = 6{,}67\\cdot 10^{-11}$ Н·м²/кг². У поверхности: $g = GM/R^2$."},
{sec:"p24",html:"Вес $P$ — сила, с которой тело давит на опору / тянет подвес. $P = m(g \\pm a)$. При свободном падении $P = 0$ — невесомость."},
{sec:"final2",html:"Финал главы 2 — интегрированные задачи по §§15–24. В разработке (Phase 2+)."}
];