File size: 32,824 Bytes
905b7fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
#!/usr/bin/env python3
"""Rewrite the lesson bodies in pack.json, leaving the matching config alone.

Triggers, keywords, blockers and requires were tuned against a 24-question test
set; retyping them by hand to edit prose would risk silently breaking that. So
this script replaces only each scenario's "lesson" and leaves everything else
byte-identical.

Board grammar these lessons rely on:
  figure  -> pinned in the left pane, stays put while the working accumulates
  latex   -> a new line in the right-hand column
  text    -> same, plain words
  board omitted -> the teacher talks, the board does not change
  section -> a dashed rule labelling a sub-part ("Câu a")
  highlight -> frame the line, used for the answer
"""

import json
import pathlib

F = lambda ref: {"kind": "figure", "ref": ref}  # noqa: E731
L = lambda c, box=False: {"kind": "latex", "content": c, "highlight": box}  # noqa: E731
T = lambda c, box=False: {"kind": "text", "content": c, "highlight": box}  # noqa: E731


def step(say, board=None, section=None):
    out = {"say": say}
    if board is not None:
        out["board"] = board
    if section is not None:
        out["section"] = section
    return out


LESSONS = {}

LESSONS["dinh-nghia-tu-giac"] = {
    "title": "Định nghĩa tứ giác",
    "steps": [
        step("Chào em. Hôm nay thầy trò mình bắt đầu từ câu hỏi đơn giản nhất: thế nào là một tứ giác.",
             F("tu-giac-abcd")),
        step("Tứ giác A B C D là hình gồm bốn đoạn thẳng A B, B C, C D và D A.",
             T("Gồm 4 đoạn: AB, BC, CD, DA")),
        step("Nhưng chỉ bốn đoạn thẳng thì chưa đủ. Còn một điều kiện nữa, và chính điều kiện đó mới làm nên định nghĩa.",
             T("… và một điều kiện nữa")),
        step("Điều kiện là: không có hai đoạn thẳng nào cùng nằm trên một đường thẳng.",
             T("Không hai đoạn nào thẳng hàng", box=True)),
        step("Em thử nghĩ xem vì sao lại cần điều kiện ấy. Nếu hai đoạn thẳng kề nhau mà thẳng hàng thì chúng nhập lại thành một, hình chỉ còn ba cạnh, thành ra tam giác chứ không phải tứ giác nữa.",
             T("Thẳng hàng thì chỉ còn 3 cạnh")),
        step("Đó là lý do trong sách, hình ba chấm hai d không được gọi là tứ giác.",
             T("Vì vậy Hình 3.2d bị loại")),
        step("Cuối cùng là tên gọi các thành phần. Bốn điểm A, B, C, D là các đỉnh. Bốn đoạn thẳng nối chúng là các cạnh.",
             L(r"\text{Đỉnh: } A, B, C, D \qquad \text{Cạnh: } AB, BC, CD, DA")),
    ],
}

LESSONS["tu-giac-loi"] = {
    "title": "Tứ giác lồi",
    "steps": [
        step("Không phải tứ giác nào cũng giống nhau. Thầy vẽ hai hình để em so sánh.",
             F("loi-va-khong-loi")),
        step("Định nghĩa nghe hơi dài, em nghe từ từ nhé. Tứ giác lồi là tứ giác mà hai đỉnh thuộc một cạnh bất kì luôn nằm về một phía của đường thẳng đi qua hai đỉnh còn lại.",
             T("Hai đỉnh của một cạnh — cùng một phía")),
        step("Em thử với hình bên trái. Lấy cạnh A B, rồi kẻ đường thẳng đi qua hai đỉnh còn lại là C và D. Hai đỉnh A và B nằm cùng một phía của đường đó.",
             T("Cạnh AB, xét đường thẳng CD")),
        step("Quan trọng là phải thử với mọi cạnh, chứ không phải một cạnh. Thử hết bốn cạnh đều đúng, nên đây là tứ giác lồi.",
             T("Đúng với cả 4 cạnh nên là tứ giác lồi", box=True)),
        step("Hình bên phải thì khác. Đỉnh G thụt vào trong, và có một cạnh làm hai đỉnh còn lại rơi về hai phía khác nhau. Chỉ cần một cạnh như vậy là hình mất tính lồi.",
             T("Chỉ cần một cạnh sai là mất tính lồi")),
        step("Có một mẹo nhận biết nhanh hơn nhiều. Em nhìn hai đường chéo: tứ giác lồi thì hai đường chéo cắt nhau bên trong hình, không lồi thì chúng cắt nhau ở ngoài.",
             T("Mẹo: hai đường chéo cắt nhau bên trong")),
        step("Và một quy ước em cần nhớ suốt chương này. Từ nay khi nói tứ giác mà không chú thích gì thêm, ta hiểu đó là tứ giác lồi.",
             T("Nói “tứ giác” = tứ giác lồi", box=True)),
    ],
}

LESSONS["dinh-doi-canh-doi-duong-cheo"] = {
    "title": "Đỉnh đối, cạnh đối, góc đối, đường chéo",
    "steps": [
        step("Bài này có bốn từ mới, nhưng cả bốn đều xoay quanh đúng một ý: thế nào là hai thứ đối nhau.",
             F("duong-cheo")),
        step("Bắt đầu từ đỉnh. Hai đỉnh không cùng thuộc một cạnh thì gọi là hai đỉnh đối nhau. Ở đây A và C đối nhau, B và D đối nhau.",
             L(r"\text{Đỉnh đối: } (A, C) \ \text{và} \ (B, D)")),
        step("Nối hai đỉnh đối nhau lại thì được một đường chéo. Vì có hai cặp đỉnh đối nên tứ giác có đúng hai đường chéo.",
             L(r"\text{Đường chéo: } AC \ \text{và} \ BD")),
        step("Em để ý là đường chéo không phải cạnh. Cạnh nằm trên viền hình, còn đường chéo cắt qua bên trong.",
             T("Đường chéo cắt qua trong hình, không phải cạnh")),
        step("Sang cạnh. Hai cạnh không có đỉnh chung là một cặp cạnh đối. Cạnh A B và cạnh C D không dính nhau ở đỉnh nào, nên chúng đối nhau.",
             L(r"\text{Cạnh đối: } (AB, CD) \ \text{và} \ (AD, BC)")),
        step("Cuối cùng là góc. Góc tại hai đỉnh đối nhau thì gọi là hai góc đối. Vì A đối C nên góc A đối góc C, và tương tự góc B đối góc D.",
             L(r"\text{Góc đối: } (\hat{A}, \hat{C}) \ \text{và} \ (\hat{B}, \hat{D})")),
        step("Nhìn lại cả bảng, em thấy mọi thứ đều đi theo cặp, và đều bắt nguồn từ hai cặp đỉnh đối nhau ban đầu.",
             T("Tất cả đều xuất phát từ 2 cặp đỉnh đối", box=True)),
    ],
}

LESSONS["cach-goi-ten"] = {
    "title": "Cách gọi tên tứ giác",
    "steps": [
        step("Một hình nhưng có nhiều cách gọi tên, và không phải cách nào cũng đúng. Thầy nói rõ luật cho em.",
             F("tu-giac-abcd")),
        step("Luật chỉ có một câu: đọc tên theo thứ tự các đỉnh liền nhau, đi vòng quanh hình theo một chiều.",
             T("Đọc vòng quanh hình, theo một chiều", box=True)),
        step("Đi theo chiều này thì được A B C D, B C D A, C D A B, D A B C. Bốn cách, vì bắt đầu từ đỉnh nào cũng được.",
             T("ABCD = BCDA = CDAB = DABC")),
        step("Đi ngược chiều lại được bốn cách nữa. Vậy tổng cộng một tứ giác có tám tên gọi khác nhau, tất cả đều chỉ cùng một hình.",
             T("Ngược chiều: ADCB = DCBA = CBAD = BADC")),
        step("Ngược lại, cho trước bốn điểm thì em phải chọn thứ tự sao cho các đoạn thẳng không cắt nhau. Chẳng hạn với bốn điểm E, F, G, H thì E G F H có thể là một cách đặt tên hợp lệ, tuỳ vị trí bốn điểm đó.",
             T("Cho 4 điểm: chọn thứ tự sao cho các cạnh không cắt nhau")),
    ],
}

LESSONS["tong-cac-goc"] = {
    "title": "Tổng các góc của một tứ giác",
    "steps": [
        step("Đây là định lí quan trọng nhất của bài, và cũng là thứ em sẽ dùng nhiều nhất khi làm bài tập.",
             T("Định lí")),
        step("Tổng các góc của một tứ giác bằng ba trăm sáu mươi độ. Luôn luôn, với mọi tứ giác.",
             L(r"\hat{A}+\hat{B}+\hat{C}+\hat{D}=360^{\circ}", box=True)),
        step("Nhưng vì sao lại là ba trăm sáu mươi. Thầy chứng minh cho em, và cách chứng minh cũng chính là mẹo để nhớ.",
             F("chia-hai-tam-giac")),
        step("Ý tưởng là đưa cái chưa biết về cái đã biết. Ta đã biết tổng ba góc trong một tam giác, nên hãy biến tứ giác thành tam giác.",
             T("Đưa về tam giác — thứ ta đã biết")),
        step("Kẻ đường chéo B D. Nó chia tứ giác thành hai tam giác A B D và C B D.",
             T("Kẻ BD, được 2 tam giác")),
        step("Trong mỗi tam giác, tổng ba góc bằng một trăm tám mươi độ.",
             L(r"\begin{aligned}\hat{A}+\hat{B_1}+\hat{D_1}&=180^{\circ}\\ \hat{C}+\hat{B_2}+\hat{D_2}&=180^{\circ}\end{aligned}")),
        step("Bây giờ cộng hai dòng lại. Điểm mấu chốt nằm ở chỗ này: góc B một cộng góc B hai chính là góc B của tứ giác, và góc D một cộng góc D hai chính là góc D.",
             L(r"\hat{B_1}+\hat{B_2}=\hat{B}, \qquad \hat{D_1}+\hat{D_2}=\hat{D}")),
        step("Vậy tổng bốn góc của tứ giác đúng bằng tổng các góc của hai tam giác, tức hai lần một trăm tám mươi, bằng ba trăm sáu mươi độ.",
             L(r"\hat{A}+\hat{B}+\hat{C}+\hat{D}=180^{\circ}+180^{\circ}=360^{\circ}", box=True)),
    ],
}

LESSONS["tom-tat-bai"] = {
    "title": "Tóm tắt Bài 10: Tứ giác",
    "steps": [
        step("Thầy tóm tắt lại cả bài. Bài này chỉ có hai phần, phần một là khái niệm, phần hai là một định lí.",
             T("I. Tứ giác lồi   ·   II. Tổng các góc")),
        step("Phần một. Tứ giác A B C D gồm bốn đoạn thẳng, với điều kiện không có hai đoạn nào cùng nằm trên một đường thẳng.",
             F("tu-giac-abcd")),
        step("Tứ giác lồi là tứ giác mà hai đỉnh của một cạnh bất kì luôn nằm về một phía của đường thẳng qua hai đỉnh còn lại. Nói tứ giác mà không chú thích gì thêm thì hiểu là tứ giác lồi.",
             T("Tứ giác lồi — và đó là mặc định")),
        step("Trong tứ giác, mọi thứ đi theo cặp: hai đường chéo, hai cặp cạnh đối, hai cặp góc đối.",
             L(r"AC,\ BD \quad (AB,CD),(AD,BC) \quad (\hat{A},\hat{C}),(\hat{B},\hat{D})")),
        step("Phần hai là định lí tổng các góc.",
             L(r"\hat{A}+\hat{B}+\hat{C}+\hat{D}=360^{\circ}", box=True)),
        step("Cách chứng minh em nên nhớ, vì nó cũng là cách nhớ luôn con số: kẻ một đường chéo, tứ giác thành hai tam giác, mỗi tam giác một trăm tám mươi độ.",
             T("Kẻ 1 đường chéo → 2 tam giác → 2 × 180°")),
        step("Từ định lí này ra dạng bài phổ biến nhất: biết ba góc thì luôn tính được góc thứ tư.",
             L(r"\hat{D}=360^{\circ}-\left(\hat{A}+\hat{B}+\hat{C}\right)")),
        step("Và một biến thể hay gặp: nếu đề cho góc ngoài thì em đổi sang góc trong bằng quan hệ kề bù trước đã, rồi mới áp dụng định lí.",
             L(r"\text{góc trong}=180^{\circ}-\text{góc ngoài}")),
    ],
}

LESSONS["ve-tu-giac"] = {
    "title": "Vẽ tứ giác ABCD",
    "steps": [
        step("Thầy vẽ từng bước, em vẽ theo vào vở nhé.",
             T("Vẽ theo 3 bước")),
        step("Bước một, lấy bốn điểm A, B, C, D sao cho không có ba điểm nào thẳng hàng.",
             T("1. Lấy 4 điểm, không 3 điểm nào thẳng hàng")),
        step("Bước hai, nối lần lượt A với B, B với C, C với D, rồi từ D nối về lại A. Nhớ là nối vòng quanh, đừng nối tắt.",
             F("tu-giac-abcd")),
        step("Bốn điểm vừa lấy là bốn đỉnh, bốn đoạn vừa nối là bốn cạnh.",
             L(r"\text{Đỉnh: } A, B, C, D \qquad \text{Cạnh: } AB, BC, CD, DA")),
        step("Bước ba, nối hai đỉnh đối nhau để được hai đường chéo A C và B D.",
             F("duong-cheo")),
        step("Em nhìn chỗ hai đường chéo cắt nhau. Chúng cắt nhau ở bên trong hình, đó là dấu hiệu cho biết em vừa vẽ đúng một tứ giác lồi.",
             T("Cắt nhau bên trong → tứ giác lồi", box=True)),
    ],
}

LESSONS["ve-loi-khong-loi"] = {
    "title": "Lồi và không lồi",
    "steps": [
        step("Thầy vẽ hai hình cạnh nhau, em nhìn kỹ chỗ khác biệt.",
             F("loi-va-khong-loi")),
        step("Hình bên trái là tứ giác lồi. Hình bên phải cũng là tứ giác đấy, đủ bốn cạnh, nhưng không lồi.",
             T("Cả hai đều là tứ giác — chỉ một hình lồi")),
        step("Khác biệt nằm ở đỉnh G. Nó thụt vào trong, làm góc tại G lớn hơn một trăm tám mươi độ.",
             T("Đỉnh G thụt vào, góc G lớn hơn 180°")),
        step("Muốn kiểm tra theo đúng định nghĩa thì em kẻ đường thẳng qua từng cặp đỉnh, khá mất công.",
             T("Kiểm tra theo định nghĩa: chậm")),
        step("Mẹo nhanh hơn nhiều là nhìn hai đường chéo. Lồi thì chúng cắt nhau bên trong hình, không lồi thì cắt nhau bên ngoài.",
             T("Mẹo: hai đường chéo cắt nhau bên trong", box=True)),
    ],
}

LESSONS["ve-chung-minh-360"] = {
    "title": "Chia tứ giác thành hai tam giác",
    "steps": [
        step("Hình này là chìa khoá của cả bài, nên em vẽ vào vở và nhớ kỹ.",
             T("Hình chìa khoá của bài")),
        step("Thầy kẻ đường chéo B D. Chỉ một nét thôi, mà tứ giác A B C D thành hai tam giác A B D và C B D.",
             F("chia-hai-tam-giac")),
        step("Em để ý hai góc A và C giữ nguyên, không bị nét kẻ chạm vào.",
             T("Góc A và góc C giữ nguyên")),
        step("Còn góc B và góc D thì bị chia đôi, thành B một với B hai, và D một với D hai.",
             L(r"\hat{B}=\hat{B_1}+\hat{B_2}, \qquad \hat{D}=\hat{D_1}+\hat{D_2}")),
        step("Chính vì chia đôi rồi cộng lại vẫn bằng chính nó, nên không có góc nào bị mất hay bị thừa khi ta gộp hai tam giác.",
             T("Không góc nào mất, không góc nào thừa")),
        step("Vậy tổng bốn góc của tứ giác đúng bằng tổng các góc của hai tam giác.",
             L(r"2 \times 180^{\circ}=360^{\circ}", box=True)),
    ],
}

LESSONS["vi-du-hinh-3-6"] = {
    "title": "Ví dụ — Hình 3.6",
    "steps": [
        step("Đề cho tứ giác A B C D với ba góc đã biết, và hỏi góc D.",
             F("hinh-3-6")),
        step("Em ghi lại dữ kiện cho gọn: góc A một trăm mười độ, góc B một trăm hai mươi độ, góc C tám mươi độ.",
             L(r"\hat{A}=110^{\circ}, \quad \hat{B}=120^{\circ}, \quad \hat{C}=80^{\circ}")),
        step("Biết ba góc, hỏi góc thứ tư. Đúng dạng dùng định lí tổng các góc.",
             L(r"\hat{A}+\hat{B}+\hat{C}+\hat{D}=360^{\circ}")),
        step("Chuyển vế, góc D bằng ba trăm sáu mươi độ trừ đi tổng ba góc đã biết.",
             L(r"\hat{D}=360^{\circ}-\left(110^{\circ}+120^{\circ}+80^{\circ}\right)")),
        step("Tính trong ngoặc trước: một trăm mười cộng một trăm hai mươi cộng tám mươi bằng ba trăm mười.",
             L(r"110^{\circ}+120^{\circ}+80^{\circ}=310^{\circ}")),
        step("Vậy góc D bằng ba trăm sáu mươi trừ ba trăm mười, bằng năm mươi độ.",
             L(r"\hat{D}=360^{\circ}-310^{\circ}=50^{\circ}", box=True)),
        step("Em kiểm tra lại bằng mắt xem có hợp lý không. Góc D nhìn trong hình là góc nhọn, mà năm mươi độ đúng là góc nhọn. Thói quen kiểm tra này giúp em phát hiện lỗi tính rất nhanh.",
             T("Nhìn hình: góc D nhọn — 50° hợp lý")),
    ],
}

LESSONS["luyen-tap-hinh-3-7"] = {
    "title": "Luyện tập — Hình 3.7",
    "steps": [
        step("Bài này giống ví dụ vừa rồi, nhưng dữ kiện được cho bằng ký hiệu trên hình chứ không viết bằng số.",
             F("hinh-3-7")),
        step("Em nhìn hai ô vuông nhỏ ở đỉnh E và đỉnh G. Đó là ký hiệu góc vuông, nghĩa là hai góc ấy bằng chín mươi độ.",
             T("Ô vuông nhỏ = góc vuông = 90°")),
        step("Cộng với góc H đã ghi là năm mươi lăm độ, ta có đủ ba góc.",
             L(r"\hat{E}=\hat{G}=90^{\circ}; \quad \hat{H}=55^{\circ}")),
        step("Áp dụng định lí tổng các góc của tứ giác.",
             L(r"\hat{E}+\hat{F}+\hat{G}+\hat{H}=360^{\circ}")),
        step("Thay số vào, ta được chín mươi cộng góc F cộng chín mươi cộng năm mươi lăm bằng ba trăm sáu mươi.",
             L(r"90^{\circ}+\hat{F}+90^{\circ}+55^{\circ}=360^{\circ}")),
        step("Ba góc đã biết cộng lại là hai trăm ba mươi lăm độ, nên góc F bằng một trăm hai mươi lăm độ.",
             L(r"\hat{F}=360^{\circ}-235^{\circ}=125^{\circ}", box=True)),
        step("Lại kiểm tra bằng mắt. Góc F trong hình trông tù, mà một trăm hai mươi lăm độ đúng là góc tù. Khớp.",
             T("Nhìn hình: góc F tù — 125° hợp lý")),
    ],
}

LESSONS["bai-toan-mo-dau"] = {
    "title": "Bài toán mở đầu",
    "steps": [
        step("Đây là bài toán mở đầu chương. Em cắt bốn tứ giác giống hệt nhau bằng giấy, đánh số bốn góc của mỗi cái là một, hai, ba, bốn, rồi ghép chúng lại quanh một điểm.",
             F("ghep-bon-tu-giac")),
        step("Câu hỏi thứ nhất: có ghép khít được không. Câu trả lời là có.",
             T("Ghép khít được")),
        step("Câu hỏi thứ hai mới là chỗ hay. Bốn góc gặp nhau tại điểm chung là những góc nào.",
             T("Bốn góc tại điểm chung là góc nào?")),
        step("Vì bốn tứ giác giống hệt nhau, và mỗi cái góp đúng một góc khác nhau vào điểm chung, nên bốn góc tụ lại đó chính là bốn góc của một tứ giác.",
             T("Chính là 4 góc của một tứ giác")),
        step("Mà tổng bốn góc của một tứ giác bằng ba trăm sáu mươi độ, vừa đúng một vòng tròn quanh điểm đó. Nên chúng ghép khít, không hở cũng không chồng lên nhau.",
             L(r"\hat{1}+\hat{2}+\hat{3}+\hat{4}=360^{\circ}", box=True)),
        step("Em thấy không, cái thí nghiệm cắt giấy tưởng chỉ để chơi, thực ra chính là định lí của bài hôm nay.",
             T("Thí nghiệm cắt giấy = định lí của bài")),
    ],
}

LESSONS["trac-nghiem"] = {
    "title": "Bài tập trắc nghiệm",
    "steps": [
        step("Câu một yêu cầu chọn câu sai. Em đọc kỹ chữ sai nhé, rất nhiều bạn mất điểm chỉ vì đọc lướt.",
             T("Câu 1 — chọn câu SAI"), section="Câu 1"),
        step("Đáp án là B, vì tổng các góc của một tứ giác bằng ba trăm sáu mươi độ chứ không phải một trăm tám mươi độ. Một trăm tám mươi là của tam giác.",
             L(r"\textbf{B} \quad 180^{\circ} \text{ là của tam giác}", box=True)),
        step("Câu hai hỏi các góc của tứ giác có thể là gì.",
             T("Câu 2 — bốn góc có thể là gì"), section="Câu 2"),
        step("Đáp án C. Bốn góc vuông cho tổng đúng ba trăm sáu mươi độ. Còn bốn góc nhọn thì tổng nhỏ hơn ba trăm sáu mươi, bốn góc tù thì lớn hơn, nên đều không được.",
             L(r"\textbf{C} \quad 4 \times 90^{\circ}=360^{\circ}", box=True)),
        step("Câu ba cho tổng hai góc ngoài tại B và C bằng hai trăm độ, hỏi tổng hai góc ngoài còn lại.",
             T("Câu 3 — góc ngoài"), section="Câu 3"),
        step("Em dùng tính chất tổng bốn góc ngoài của một tứ giác cũng bằng ba trăm sáu mươi độ. Lấy ba trăm sáu mươi trừ hai trăm được một trăm sáu mươi độ, đáp án A.",
             L(r"\textbf{A} \quad 360^{\circ}-200^{\circ}=160^{\circ}", box=True)),
        step("Câu bốn cho tổng góc A và góc B bằng một trăm bốn mươi độ, hỏi tổng góc C và góc D.",
             T("Câu 4 — tổng hai góc còn lại"), section="Câu 4"),
        step("Đây là câu dễ nhất, chỉ cần lấy ba trăm sáu mươi trừ một trăm bốn mươi, bằng hai trăm hai mươi độ. Đáp án A.",
             L(r"\textbf{A} \quad \hat{C}+\hat{D}=360^{\circ}-140^{\circ}=220^{\circ}", box=True)),
        step("Câu năm chọn định nghĩa đúng nhất của tứ giác.",
             T("Câu 5 — định nghĩa đúng nhất"), section="Câu 5"),
        step("Đáp án B. Chỉ mình nó nêu đủ điều kiện không có hai đoạn thẳng nào cùng nằm trên một đường thẳng. Đáp án A thiếu điều kiện đó, nên chưa đủ.",
             L(r"\textbf{B} \quad \text{đủ điều kiện không thẳng hàng}", box=True)),
    ],
}

LESSONS["bai-3-1"] = {
    "title": "Bài 3.1 (SGK trang 51)",
    "steps": [
        step("Bài này có hai câu. Câu a dễ, câu b có một bẫy nhỏ mà thầy sẽ chỉ cho em.",
             F("hinh-3-8a"), section="Câu a"),
        step("Tứ giác A B C D có ba ô vuông nhỏ ở A, B và D, nghĩa là ba góc đó đều vuông.",
             L(r"\hat{A}=\hat{B}=\hat{D}=90^{\circ}")),
        step("Lấy ba trăm sáu mươi trừ đi ba góc vuông, ta được góc C bằng chín mươi độ. Vậy nó là hình chữ nhật.",
             L(r"\hat{C}=360^{\circ}-90^{\circ}-90^{\circ}-90^{\circ}=90^{\circ}", box=True)),
        step("Sang câu b. Tứ giác ở đây là R S U V, và em để ý ngay hai cạnh được kéo dài ra ngoài hình.",
             F("hinh-3-8b"), section="Câu b"),
        step("Đó chính là cái bẫy. Sáu mươi độ và một trăm mười độ nằm ở phía ngoài, nên chúng là góc ngoài chứ không phải góc trong. Không được thay thẳng vào định lí.",
             T("Bẫy: 60° và 110° là góc NGOÀI")),
        step("Góc trong và góc ngoài tại cùng một đỉnh thì kề bù, tức cộng lại bằng một trăm tám mươi độ.",
             L(r"\text{góc trong}+\text{góc ngoài}=180^{\circ}")),
        step("Áp dụng vào đỉnh U và đỉnh S, ta đổi được sang góc trong.",
             L(r"\begin{aligned}\hat{U}&=180^{\circ}-60^{\circ}=120^{\circ}\\ \hat{S}&=180^{\circ}-110^{\circ}=70^{\circ}\end{aligned}")),
        step("Thêm góc V vuông đã cho trên hình, giờ ta đã có đủ ba góc trong.",
             L(r"\hat{V}=90^{\circ}, \quad \hat{U}=120^{\circ}, \quad \hat{S}=70^{\circ}")),
        step("Bây giờ mới dùng định lí tổng các góc, được góc R bằng tám mươi độ.",
             L(r"\hat{R}=360^{\circ}-90^{\circ}-120^{\circ}-70^{\circ}=80^{\circ}", box=True)),
    ],
}

LESSONS["bai-3-2"] = {
    "title": "Bài 3.2 (SGK trang 51)",
    "steps": [
        step("Bài này khác kiểu. Đề không cho đủ ba góc, mà cho một mối liên hệ giữa hai góc chưa biết.",
             F("hinh-3-9")),
        step("Cụ thể: góc G bằng năm mươi độ, góc F bằng sáu mươi độ, và góc H lớn hơn góc E mười độ.",
             L(r"\hat{G}=50^{\circ}, \quad \hat{F}=60^{\circ}, \quad \hat{H}=\hat{E}+10^{\circ}")),
        step("Có hai ẩn là góc E và góc H, mà chỉ có một phương trình tổng các góc. Cách gỡ là dùng mối liên hệ để đưa về một ẩn duy nhất.",
             T("2 ẩn → thay để còn 1 ẩn")),
        step("Thầy thay góc H bằng góc E cộng mười độ vào định lí tổng các góc.",
             L(r"\hat{E}+60^{\circ}+50^{\circ}+\left(\hat{E}+10^{\circ}\right)=360^{\circ}")),
        step("Gom hai góc E lại thành hai lần góc E, rồi chuyển các số sang vế phải.",
             L(r"2\hat{E}=360^{\circ}-60^{\circ}-50^{\circ}-10^{\circ}=240^{\circ}")),
        step("Chia hai vế cho hai, được góc E bằng một trăm hai mươi độ.",
             L(r"\hat{E}=120^{\circ}")),
        step("Quay lại mối liên hệ ban đầu để tìm góc H, bằng một trăm hai mươi cộng mười, tức một trăm ba mươi độ.",
             L(r"\hat{H}=\hat{E}+10^{\circ}=130^{\circ}", box=True)),
        step("Em kiểm tra lại cho chắc: một trăm hai mươi cộng một trăm ba mươi cộng năm mươi cộng sáu mươi bằng ba trăm sáu mươi. Đúng rồi.",
             L(r"120^{\circ}+130^{\circ}+50^{\circ}+60^{\circ}=360^{\circ}")),
    ],
}

LESSONS["bai-3-3"] = {
    "title": "Bài 3.3 — hình cái diều",
    "steps": [
        step("Tứ giác A B C D có A B bằng A D và C B bằng C D. Hình dáng giống con diều nên người ta gọi là hình cái diều.",
             F("hinh-3-10-cai-dieu"), section="Câu a"),
        step("Câu a yêu cầu chứng minh A C là đường trung trực của đoạn thẳng B D. Em nhớ lại: đường trung trực của một đoạn thẳng là tập hợp những điểm cách đều hai đầu đoạn thẳng đó.",
             T("Trung trực = tập điểm cách đều hai đầu")),
        step("Vậy muốn chứng minh cả đường thẳng A C là trung trực, ta chỉ cần chỉ ra điểm A cách đều B và D, rồi điểm C cũng cách đều B và D.",
             T("Chỉ cần A và C đều cách đều B, D")),
        step("Xét tam giác A B D. Vì A B bằng A D nên nó cân tại A, nghĩa là A cách đều B và D, nên trung trực của B D đi qua A.",
             L(r"AB=AD \Rightarrow \triangle ABD \text{ cân tại } A \Rightarrow A \in \text{trung trực } BD")),
        step("Hoàn toàn tương tự, tam giác C B D cân tại C nên trung trực của B D cũng đi qua C.",
             L(r"CB=CD \Rightarrow \triangle CBD \text{ cân tại } C \Rightarrow C \in \text{trung trực } BD")),
        step("Một đường thẳng đi qua cả hai điểm A và C thì chính là đường thẳng A C. Vậy A C là trung trực của B D, xong câu a.",
             L(r"\Rightarrow AC \text{ là trung trực của } BD", box=True)),
        step("Câu b cho góc A bằng một trăm độ, góc C bằng sáu mươi độ, hỏi góc B và góc D.",
             L(r"\hat{A}=100^{\circ}, \quad \hat{C}=60^{\circ}"), section="Câu b"),
        step("Chỉ biết hai góc mà phải tìm hai góc, nên ta cần thêm một quan hệ nữa. Quan hệ đó nằm ở tính đối xứng của hình.",
             T("Cần thêm một quan hệ — lấy từ tính đối xứng")),
        step("Xét hai tam giác A B C và A D C. Chúng có A C là cạnh chung, A B bằng A D, C B bằng C D, nên bằng nhau theo trường hợp cạnh cạnh cạnh. Suy ra góc B bằng góc D.",
             L(r"\triangle ABC=\triangle ADC \ (c.c.c) \Rightarrow \hat{B}=\hat{D}")),
        step("Thay vào tổng bốn góc, ta có một trăm cộng sáu mươi cộng hai lần góc B bằng ba trăm sáu mươi.",
             L(r"100^{\circ}+60^{\circ}+2\hat{B}=360^{\circ}")),
        step("Giải ra, góc B bằng một trăm độ, và góc D cũng bằng một trăm độ.",
             L(r"\hat{B}=\frac{360^{\circ}-100^{\circ}-60^{\circ}}{2}=100^{\circ}=\hat{D}", box=True)),
    ],
}

LESSONS["bai-tap-them"] = {
    "title": "Bài tập thêm — tỉ lệ 1:2:3:4",
    "steps": [
        step("Bài này có ba câu và khó dần lên. Đề cho tứ giác A B C D với bốn góc tỉ lệ với một, hai, ba, bốn.",
             F("bai-tap-them"), section="Câu a"),
        step("Tỉ lệ với một, hai, ba, bốn nghĩa là bốn góc chia cho một, hai, ba, bốn thì được cùng một kết quả. Ta đặt các tỉ số ấy bằng nhau.",
             L(r"\frac{\hat{A}}{1}=\frac{\hat{B}}{2}=\frac{\hat{C}}{3}=\frac{\hat{D}}{4}")),
        step("Dùng tính chất dãy tỉ số bằng nhau: cộng hết tử với nhau, cộng hết mẫu với nhau. Tử là tổng bốn góc, bằng ba trăm sáu mươi. Mẫu là một cộng hai cộng ba cộng bốn, bằng mười.",
             L(r"=\frac{\hat{A}+\hat{B}+\hat{C}+\hat{D}}{1+2+3+4}=\frac{360^{\circ}}{10}=36^{\circ}")),
        step("Nhân ngược trở lại, mỗi góc bằng ba mươi sáu độ nhân với phần tương ứng của nó.",
             L(r"\hat{A}=36^{\circ}; \ \hat{B}=72^{\circ}; \ \hat{C}=108^{\circ}; \ \hat{D}=144^{\circ}", box=True)),
        step("Câu b yêu cầu chứng minh A B song song với C D. Em nhìn cặp góc A và D, chúng là hai góc trong cùng phía của hai đường thẳng A B và C D.",
             T("Góc A và góc D là hai góc trong cùng phía"), section="Câu b"),
        step("Cộng lại thì ba mươi sáu cộng một trăm bốn mươi bốn bằng một trăm tám mươi độ. Hai góc trong cùng phía bù nhau thì hai đường thẳng song song.",
             L(r"\hat{A}+\hat{D}=36^{\circ}+144^{\circ}=180^{\circ} \Rightarrow AB \parallel CD", box=True)),
        step("Câu c. Gọi E là giao điểm của A D và B C, ta phải tính ba góc của tam giác C D E.",
             T("E là giao của AD và BC"), section="Câu c"),
        step("Góc E D C nằm kề bù với góc D của tứ giác, vì A, D, E thẳng hàng. Nên nó bằng một trăm tám mươi trừ một trăm bốn mươi bốn.",
             L(r"\hat{EDC}=180^{\circ}-144^{\circ}=36^{\circ}")),
        step("Tương tự, góc E C D kề bù với góc C, nên bằng một trăm tám mươi trừ một trăm lẻ tám.",
             L(r"\hat{ECD}=180^{\circ}-108^{\circ}=72^{\circ}")),
        step("Còn góc E thì lấy tổng ba góc trong tam giác trừ đi hai góc vừa tìm, được bảy mươi hai độ.",
             L(r"\hat{E}=180^{\circ}-36^{\circ}-72^{\circ}=72^{\circ}", box=True)),
    ],
}

LESSONS["huong-dan-ve-nha"] = {
    "title": "Hướng dẫn về nhà",
    "steps": [
        step("Về nhà em làm ba việc sau nhé.",
             T("3 việc")),
        step("Việc thứ nhất, ghi nhớ kiến thức trong bài: định nghĩa tứ giác, thế nào là tứ giác lồi, và định lí tổng các góc.",
             L(r"\hat{A}+\hat{B}+\hat{C}+\hat{D}=360^{\circ}", box=True)),
        step("Nếu quên con số ba trăm sáu mươi, em chỉ cần nhớ mẹo kẻ một đường chéo là ra lại ngay.",
             T("Quên thì kẻ 1 đường chéo → 2 × 180°")),
        step("Việc thứ hai, hoàn thành các bài tập trong sách bài tập.",
             T("Hoàn thành bài tập trong SBT")),
        step("Việc thứ ba, chuẩn bị trước Bài mười một, Hình thang cân. Bài đó dùng lại đúng định lí hôm nay, nên em nắm chắc phần này sẽ học rất nhẹ.",
             T("Chuẩn bị Bài 11. Hình thang cân")),
    ],
}


def main() -> int:
    path = pathlib.Path(__file__).resolve().parents[1] / "content" / "bai-10-tu-giac" / "pack.json"
    pack = json.loads(path.read_text(encoding="utf-8"))

    ids = {s["id"] for s in pack["scenarios"]}
    missing = ids - set(LESSONS)
    extra = set(LESSONS) - ids
    if missing or extra:
        print(f"Lệch scenario — thiếu: {sorted(missing)}, thừa: {sorted(extra)}")
        return 1

    for scenario in pack["scenarios"]:
        scenario["lesson"] = LESSONS[scenario["id"]]

    path.write_text(json.dumps(pack, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    total = sum(len(l["steps"]) for l in LESSONS.values())
    print(f"Đã ghi {len(LESSONS)} giáo án, tổng {total} bước.")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())