from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.platypus import (SimpleDocTemplate, Table, TableStyle,
Paragraph, Spacer, PageBreak, HRFlowable)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
OUTPUT = "/mnt/user-data/outputs/Chinese_OLevel_Oral_2026_Notes.pdf"
W, H = A4
# Register Chinese font
pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
BLACK = colors.HexColor("#1A1A1A")
LGRAY = colors.HexColor("#F2F2F0")
MGRAY = colors.HexColor("#CCCCCA")
DGRAY = colors.HexColor("#555555")
WHITE = colors.white
BLUE = colors.HexColor("#1a3a8a")
LBLUE = colors.HexColor("#dce8ff")
GREEN = colors.HexColor("#1a5c3a")
LGREEN = colors.HexColor("#daf2ea")
PURPLE = colors.HexColor("#4a308a")
LPURP = colors.HexColor("#ede8fc")
ORANGE = colors.HexColor("#7a3a00")
LORANG = colors.HexColor("#fff0dc")
RED = colors.HexColor("#8a1a1a")
LRED = colors.HexColor("#fce8e8")
doc = SimpleDocTemplate(OUTPUT, pagesize=A4,
leftMargin=15*mm, rightMargin=15*mm,
topMargin=14*mm, bottomMargin=14*mm)
CW = W - 30*mm
def S(name, **kw):
styles = getSampleStyleSheet()
return ParagraphStyle(name, fontName='STSong-Light', fontSize=10, leading=16,
textColor=BLACK, **kw)
title_s = S("title_s", fontSize=18, leading=22, textColor=WHITE, alignment=TA_CENTER, fontName='STSong-Light')
sub_title= S("sub_title",fontSize=11, leading=14, textColor=WHITE, alignment=TA_CENTER, fontName='STSong-Light')
hdr_s = S("hdr_s", fontSize=13, leading=17, textColor=WHITE, fontName='STSong-Light')
body_s = S("body_s", fontSize=10, leading=16, textColor=BLACK, fontName='STSong-Light')
bold_s = S("bold_s", fontSize=10, leading=16, textColor=BLACK, fontName='STSong-Light')
small_s = S("small_s", fontSize=9, leading=13, textColor=DGRAY, fontName='STSong-Light')
bullet_s = S("bullet_s", fontSize=10, leading=16, textColor=BLACK, leftIndent=10, fontName='STSong-Light')
q_s = S("q_s", fontSize=10, leading=16, textColor=BLUE, fontName='STSong-Light')
ans_s = S("ans_s", fontSize=10, leading=16, textColor=BLACK, leftIndent=8, fontName='STSong-Light')
def P(txt, st=None): return Paragraph(txt, st or body_s)
def SP(h=4): return Spacer(1, h*mm)
def HR(): return HRFlowable(width="100%", thickness=0.5, color=MGRAY, spaceAfter=2*mm, spaceBefore=1*mm)
def color_box(content_list, bg=LBLUE, border=BLUE):
t = Table([[content_list]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),bg),
("BOX",(0,0),(-1,-1),1,border),
("TOPPADDING",(0,0),(-1,-1),8),
("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0),(-1,-1),10),
("RIGHTPADDING",(0,0),(-1,-1),8),
]))
return t
def section_header(text, bg=BLUE):
t = Table([[P(text, hdr_s)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),bg),
("TOPPADDING",(0,0),(-1,-1),7),
("BOTTOMPADDING",(0,0),(-1,-1),7),
("LEFTPADDING",(0,0),(-1,-1),10),
("ROUNDEDCORNERS",[4,4,4,4]),
]))
return t
def qa_table(qas, q_bg=LBLUE, a_bg=WHITE, border=BLUE):
rows = []
for q, a_lines in qas:
rows.append([P(f"Q: {q}", q_s)])
for line in a_lines:
rows.append([P(f"• {line}", ans_s)])
rows.append([P("", small_s)])
t = Table(rows, colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),WHITE),
("BOX",(0,0),(-1,-1),0.8,border),
("LINEBELOW",(0,0),(-1,-1),0.3,MGRAY),
("TOPPADDING",(0,0),(-1,-1),4),
("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
return t
def vocab_table(words, col_color=LBLUE, border=BLUE):
header = [P("词语", bold_s), P("意思/用法", bold_s)]
rows = [header] + [[P(w, body_s), P(m, body_s)] for w, m in words]
cw = [CW*0.35, CW*0.65]
t = Table(rows, colWidths=cw)
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),col_color),
("BOX",(0,0),(-1,-1),0.8,border),
("INNERGRID",(0,0),(-1,-1),0.3,MGRAY),
("TOPPADDING",(0,0),(-1,-1),5),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),7),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
return t
story = []
# ── COVER PAGE ─────────────────────────────────────────────────────
cover = Table([[
[SP(8),
P("2026年 华文 O水准", sub_title),
SP(2),
P("口试备考笔记", title_s),
SP(2),
P("Chinese O-Level Oral Examination Preparation Notes", sub_title),
SP(4),
P("适用话题 · 关键词语 · 范例回答", sub_title),
SP(8)]
]], colWidths=[CW])
cover.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),BLUE),
("BOX",(0,0),(-1,-1),2,BLUE),
("TOPPADDING",(0,0),(-1,-1),20),
("BOTTOMPADDING",(0,0),(-1,-1),20),
("LEFTPADDING",(0,0),(-1,-1),15),
]))
story.append(cover)
story.append(SP(6))
# Index box
story.append(color_box([
P("目录 Contents", bold_s),
SP(2),
P("话题一:科技与生活 (Technology & Life)", body_s),
P("话题二:环境保护 (Environmental Protection)", body_s),
P("话题三:教育与学习 (Education & Learning)", body_s),
P("话题四:社会与公民精神 (Society & Community)", body_s),
P("话题五:健康与生活方式 (Health & Lifestyle)", body_s),
P("话题六:文化与身份认同 (Culture & Identity)", body_s),
P("话题七:家庭与人际关系 (Family & Relationships)", body_s),
P("话题八:经济与工作 (Economy & Work)", body_s),
SP(1),
P("附录:口试技巧 · 万用句型 · 常用词汇", small_s),
], bg=LGRAY, border=MGRAY))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TOPIC 1: TECHNOLOGY
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("话题一:科技与生活 Technology & Life", BLUE))
story.append(SP(3))
story.append(color_box([
P("核心论点", bold_s),
SP(1),
P("✅ 科技的好处 Benefits of Technology:", body_s),
P("• 提高效率,节省时间和资源,让生活更便利", bullet_s),
P("• 促进沟通,让人与人之间的联系更紧密,即使身处异地", bullet_s),
P("• 推动医疗进步,改善人们的健康状况", bullet_s),
P("• 为学生提供更多学习资源,拓宽视野", bullet_s),
SP(2),
P("❌ 科技的弊处 Drawbacks of Technology:", body_s),
P("• 过度依赖科技可能导致人们缺乏独立思考的能力", bullet_s),
P("• 网络上充斥着虚假信息,容易误导大众", bullet_s),
P("• 长时间使用电子设备对身体健康有负面影响", bullet_s),
P("• 科技拉大了数字鸿沟,老年人和弱势群体难以适应", bullet_s),
], bg=LBLUE, border=BLUE))
story.append(SP(3))
story.append(qa_table([
("科技如何改变我们的日常生活?",
["科技让我们的生活变得更加便利,例如网上购物和电子支付让我们无需出门就能完成消费。",
"通讯科技如视频通话让人们能够跨越地理障碍保持联系。",
"然而,我们也要注意不要过度依赖科技,以免失去与人面对面交流的能力。"]),
("青少年沉迷于社交媒体,你怎么看?",
["这确实是一个值得关注的问题。过度使用社交媒体会影响学业,导致睡眠不足。",
"不过,社交媒体也有其积极的一面,它让年轻人能够分享想法、扩大社交圈。",
"关键在于适度使用,家长和学校也应引导青少年合理利用科技。"]),
("人工智能会取代人类的工作吗?",
["人工智能确实可能取代一些重复性的工作,但同时也会创造新的就业机会。",
"人类独有的创造力、同理心和批判性思维是机器难以复制的。",
"因此,我们应该积极学习新技能,与时俱进,才能在科技时代立于不败之地。"]),
], q_bg=LBLUE, border=BLUE))
story.append(SP(3))
story.append(vocab_table([
("科技 (kē jì)", "technology"),
("人工智能 (rén gōng zhì néng)", "artificial intelligence (AI)"),
("数字鸿沟 (shù zì hóng gōu)", "digital divide"),
("网络安全 (wǎng luò ān quán)", "cybersecurity"),
("虚假信息 (xū jiǎ xìn xī)", "false/fake information"),
("与时俱进 (yǔ shí jù jìn)", "keep up with the times"),
("过度依赖 (guò dù yī lài)", "over-reliance"),
("拓宽视野 (tuò kuān shì yě)", "broaden one's horizons"),
], col_color=LBLUE, border=BLUE))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TOPIC 2: ENVIRONMENT
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("话题二:环境保护 Environmental Protection", colors.HexColor("#1a5c3a")))
story.append(SP(3))
story.append(color_box([
P("核心论点", bold_s),
SP(1),
P("✅ 为什么环保重要 Why Environmental Protection Matters:", body_s),
P("• 地球是我们唯一的家园,我们有责任保护它留给下一代", bullet_s),
P("• 气候变化和全球暖化威胁生态系统和人类的生存", bullet_s),
P("• 良好的环境有助于居民的身心健康", bullet_s),
P("• 保护生物多样性,维护生态平衡", bullet_s),
SP(2),
P("🌿 新加坡的环保措施 Singapore's Efforts:", body_s),
P("• 新加坡实行四个国家水喉计划,解决水资源问题(新生水、海水淡化等)", bullet_s),
P("• 推行零废弃计划和循环再利用措施", bullet_s),
P("• 建设"花园城市",种植大量树木和绿色植物", bullet_s),
P("• 公共教育活动提高公众的环保意识", bullet_s),
], bg=LGREEN, border=GREEN))
story.append(SP(3))
story.append(qa_table([
("个人可以为环保做些什么?",
["我们可以从日常生活中的小事做起,例如减少使用一次性塑料制品,自备购物袋。",
"节约用水用电,出行时尽量选择公共交通或步行。",
"积极参与社区的回收活动,养成垃圾分类的习惯。",
"我认为,只要每个人都尽一份力,积少成多,我们的环境就会变得更美好。"]),
("经济发展和环境保护能否同时实现?",
["这是可以实现的,关键在于可持续发展的理念。",
"企业可以采用绿色技术,减少碳排放,同时保持生产效率。",
"政府可以通过政策引导企业走绿色发展道路,例如给予绿色企业税务优惠。",
"新加坡就是一个很好的例子,它在经济高速发展的同时,也保持了良好的城市环境。"]),
("气候变化对新加坡有什么影响?",
["作为一个低洼的岛国,新加坡面临海平面上升的威胁,沿海地区可能被淹没。",
"极端天气现象如暴雨和高温也变得更加频繁,影响居民生活。",
"因此,新加坡必须积极应对气候变化,制定长远的环保政策。"]),
], q_bg=LGREEN, border=GREEN))
story.append(SP(3))
story.append(vocab_table([
("全球暖化 (quán qiú nuǎn huà)", "global warming"),
("气候变化 (qì hòu biàn huà)", "climate change"),
("可持续发展 (kě chí xù fā zhǎn)", "sustainable development"),
("碳排放 (tàn pái fàng)", "carbon emissions"),
("生物多样性 (shēng wù duō yàng xìng)", "biodiversity"),
("循环再利用 (xún huán zài lì yòng)", "recycling / reuse"),
("生态系统 (shēng tài xì tǒng)", "ecosystem"),
("一次性塑料 (yī cì xìng sù liào)", "single-use plastics"),
("绿色能源 (lǜ sè néng yuán)", "green/renewable energy"),
], col_color=LGREEN, border=GREEN))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TOPIC 3: EDUCATION
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("话题三:教育与学习 Education & Learning", PURPLE))
story.append(SP(3))
story.append(color_box([
P("核心论点", bold_s),
SP(1),
P("✅ 教育的重要性 Importance of Education:", body_s),
P("• 教育是个人发展和社会进步的基石", bullet_s),
P("• 帮助个人掌握知识和技能,为未来的工作做好准备", bullet_s),
P("• 培养批判性思维、团队合作和解决问题的能力", bullet_s),
P("• 促进社会流动性,缩小贫富差距", bullet_s),
SP(2),
P("📚 新加坡教育制度的特点 Singapore's Education System:", body_s),
P("• 强调双语教育,学生需掌握英文和母语", bullet_s),
P("• 近年来推行"减少考试、注重全面发展"的改革", bullet_s),
P("• SkillsFuture计划鼓励终身学习", bullet_s),
P("• 提供多元化的升学道路,适合不同学生的需求", bullet_s),
], bg=LPURP, border=PURPLE))
story.append(SP(3))
story.append(qa_table([
("考试成绩重要吗?",
["考试成绩固然重要,因为它是衡量学生掌握知识程度的一种方式。",
"然而,成绩并不是衡量一个人能力的唯一标准。",
"品格、创造力、团队精神等非学术素质同样重要,这些都是未来职场上不可或缺的能力。",
"因此,我们应该在注重学业的同时,也积极参与课外活动,全面发展自己。"]),
("学生应该如何平衡学习和休闲?",
["学会时间管理是关键,制定合理的学习计划,保证学习效率。",
"适当的休息和娱乐活动能够帮助大脑放松,提高专注力。",
"参与体育运动或爱好不仅让人放松,也能培养意志力和团队精神。",
"总的来说,劳逸结合才能达到最佳的学习效果。"]),
("终身学习为何重要?",
["在这个瞬息万变的时代,知识和技能需要不断更新。",
"终身学习让我们能够适应社会的变化,保持竞争力。",
"新加坡的SkillsFuture计划就是为了鼓励国人持续学习、提升技能。"]),
], q_bg=LPURP, border=PURPLE))
story.append(SP(3))
story.append(vocab_table([
("批判性思维 (pī pàn xìng sī wéi)", "critical thinking"),
("全面发展 (quán miàn fā zhǎn)", "holistic development"),
("终身学习 (zhōng shēn xué xí)", "lifelong learning"),
("课外活动 (kè wài huó dòng)", "co-curricular activities (CCA)"),
("双语教育 (shuāng yǔ jiào yù)", "bilingual education"),
("社会流动性 (shè huì liú dòng xìng)", "social mobility"),
("劳逸结合 (láo yì jié hé)", "balance work and rest"),
("时间管理 (shí jiān guǎn lǐ)", "time management"),
], col_color=LPURP, border=PURPLE))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TOPIC 4: SOCIETY & COMMUNITY
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("话题四:社会与公民精神 Society & Community", colors.HexColor("#8a3a00")))
story.append(SP(3))
story.append(color_box([
P("核心论点", bold_s),
SP(1),
P("✅ 公民精神的重要性 Importance of Community Spirit:", body_s),
P("• 公民精神是维系社会和谐的重要纽带", bullet_s),
P("• 新加坡的多元种族社会需要每个人共同维护和谐", bullet_s),
P("• 义工活动和社区服务帮助弱势群体,促进社会凝聚力", bullet_s),
P("• 种族和宗教和谐是新加坡稳定发展的基石", bullet_s),
SP(2),
P("🤝 新加坡的社区措施 Community Initiatives in Singapore:", body_s),
P("• 人民协会(PA)组织各种社区活动,促进居民交流", bullet_s),
P("• 社区发展理事会(CDC)提供援助给有需要的家庭", bullet_s),
P("• 邻里守望相助计划鼓励居民互相关爱", bullet_s),
], bg=LORANG, border=colors.HexColor("#8a3a00")))
story.append(SP(3))
story.append(qa_table([
("为什么我们要帮助有需要的人?",
["帮助他人不仅是道德责任,也体现了一个社会的文明程度。",
"当我们伸出援手时,我们也在为建设更和谐的社会做出贡献。",
"在新加坡这样的多元社会中,互助互爱的精神更为重要,它能增强社会凝聚力。",
"此外,帮助他人也让我们感到满足和有意义,对自身的心理健康有益。"]),
("年轻人应该如何为社会做贡献?",
["年轻人可以积极参与义工活动,为老人、残障人士或贫困家庭提供帮助。",
"通过参与社区项目,年轻人可以培养同理心和责任感。",
"我们也可以在网上传播正能量,抵制网络欺凌和虚假信息。",
"我认为,从身边的小事做起,每个人都能为社会带来积极的改变。"]),
("如何在多元种族社会中维护和谐?",
["尊重不同文化、宗教和习俗是维护和谐的基础。",
"我们应该以开放的心态了解和欣赏其他族群的文化。",
"政府的种族和谐法令和公民教育也在维护社会和谐方面发挥了重要作用。"]),
], q_bg=LORANG, border=colors.HexColor("#8a3a00")))
story.append(SP(3))
story.append(vocab_table([
("公民精神 (gōng mín jīng shén)", "community/civic spirit"),
("社会凝聚力 (shè huì níng jù lì)", "social cohesion"),
("义工活动 (yì gōng huó dòng)", "volunteer activities"),
("种族和谐 (zhǒng zú hé xié)", "racial harmony"),
("弱势群体 (ruò shì qún tǐ)", "vulnerable groups"),
("守望相助 (shǒu wàng xiāng zhù)", "look out for one another"),
("同理心 (tóng lǐ xīn)", "empathy"),
("多元文化 (duō yuán wén huà)", "multicultural"),
], col_color=LORANG, border=colors.HexColor("#8a3a00")))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TOPIC 5: HEALTH & LIFESTYLE
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("话题五:健康与生活方式 Health & Lifestyle", colors.HexColor("#1a5c3a")))
story.append(SP(3))
story.append(color_box([
P("核心论点", bold_s),
SP(1),
P("✅ 健康生活的重要性 Why Healthy Living Matters:", body_s),
P("• 良好的健康是享受生活和实现目标的基础", bullet_s),
P("• 健康的生活方式可以预防慢性疾病,减轻医疗负担", bullet_s),
P("• 规律运动有助于减压,改善心理健康", bullet_s),
P("• 健康饮食能为身体提供所需营养,提升工作和学习效率", bullet_s),
SP(2),
P("🏃 新加坡的健康促进措施 Health Promotion in Singapore:", body_s),
P("• 健康促进局(HPB)推行各种健康活动和计划", bullet_s),
P("• "健康365"应用程序鼓励国人积极运动", bullet_s),
P("• 学校推行健康饮食计划,减少垃圾食品的销售", bullet_s),
], bg=LGREEN, border=GREEN))
story.append(SP(3))
story.append(qa_table([
("为什么现代人越来越不健康?",
["现代生活节奏快,人们工作压力大,往往忽视了健身运动和均衡饮食。",
"科技的发展导致人们的生活方式越来越静态,缺乏体力活动。",
"快餐文化盛行,高糖高脂的食物随处可见,导致肥胖和慢性病问题加剧。",
"因此,我们需要有意识地改变生活习惯,把健康放在首位。"]),
("我们应该如何保持身心健康?",
["定期运动是关键,每天至少进行30分钟的体育活动,如跑步、游泳或打球。",
"保持均衡饮食,多吃蔬菜水果,减少糖分和脂肪的摄入。",
"保证充足的睡眠,成年人每天需要7至8小时的睡眠。",
"学会管理压力,可以通过冥想、阅读或与朋友倾谈来放松心情。"]),
("心理健康为何同样重要?",
["心理健康和生理健康同等重要,两者相互影响。",
"心理问题如抑郁和焦虑可能影响一个人的日常功能和生活质量。",
"我们应该减少对心理健康问题的污名化,鼓励有需要的人寻求专业帮助。"]),
], q_bg=LGREEN, border=GREEN))
story.append(SP(3))
story.append(vocab_table([
("慢性疾病 (màn xìng jí bìng)", "chronic illness/disease"),
("均衡饮食 (jūn héng yǐn shí)", "balanced diet"),
("心理健康 (xīn lǐ jiàn kāng)", "mental health"),
("生活方式 (shēng huó fāng shì)", "lifestyle"),
("静态生活 (jìng tài shēng huó)", "sedentary lifestyle"),
("减压 (jiǎn yā)", "stress relief/management"),
("肥胖 (féi pàng)", "obesity"),
("污名化 (wū míng huà)", "stigmatization"),
], col_color=LGREEN, border=GREEN))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TOPIC 6: CULTURE & IDENTITY
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("话题六:文化与身份认同 Culture & Identity", PURPLE))
story.append(SP(3))
story.append(color_box([
P("核心论点", bold_s),
SP(1),
P("✅ 文化保护的重要性 Why Cultural Preservation Matters:", body_s),
P("• 文化是一个民族的灵魂,代代相传的传统和习俗构成了我们的身份认同", bullet_s),
P("• 多元文化是新加坡的优势和财富,值得珍惜和保护", bullet_s),
P("• 了解自己的文化根源有助于增强归属感和自豪感", bullet_s),
P("• 文化遗址和文物是连接过去与现在的重要纽带", bullet_s),
SP(2),
P("🏛️ 新加坡的文化保护 Cultural Preservation in Singapore:", body_s),
P("• 保留历史街区如牛车水、小印度和甘榜格南", bullet_s),
P("• 国家文物局保存和推广新加坡的文化遗产", bullet_s),
P("• 学校教授华文、马来文和淡米尔文,保存母语文化", bullet_s),
], bg=LPURP, border=PURPLE))
story.append(SP(3))
story.append(qa_table([
("年轻人为什么应该了解本族文化?",
["了解本族文化让年轻人知道自己的根源,从而建立更强烈的身份认同感。",
"文化知识也有助于我们与长辈沟通,增进代际关系。",
"在全球化的时代,独特的文化背景反而成为一种优势,让我们在国际舞台上脱颖而出。",
"因此,我认为年轻人应该积极学习和传承本族文化。"]),
("全球化对传统文化有什么影响?",
["全球化带来了文化交流,丰富了我们的生活,但也可能导致传统文化的流失。",
"年轻人受到外来文化的影响,可能对本族文化失去兴趣。",
"然而,只要我们有意识地保护和传承,传统文化就能与现代生活并行不悖。",
"新加坡政府和各社区也在积极推广文化活动,以保存各族文化。"]),
("如何在现代社会中传承传统文化?",
["我们可以在节日庆典中积极参与传统活动,如华人农历新年、马来开斋节等。",
"学习传统手艺、音乐或舞蹈,将这些技艺传授给下一代。",
"利用社交媒体和数字平台推广传统文化,吸引年轻人的关注。"]),
], q_bg=LPURP, border=PURPLE))
story.append(SP(3))
story.append(vocab_table([
("身份认同 (shēn fèn rèn tóng)", "identity"),
("文化遗产 (wén huà yí chǎn)", "cultural heritage"),
("归属感 (guī shǔ gǎn)", "sense of belonging"),
("全球化 (quán qiú huà)", "globalization"),
("代际关系 (dài jì guān xì)", "intergenerational relations"),
("传统习俗 (chuán tǒng xí sú)", "traditional customs"),
("文化多元 (wén huà duō yuán)", "cultural diversity"),
("传承 (chuán chéng)", "pass down / inherit"),
], col_color=LPURP, border=PURPLE))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TOPIC 7: FAMILY & RELATIONSHIPS
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("话题七:家庭与人际关系 Family & Relationships", RED))
story.append(SP(3))
story.append(color_box([
P("核心论点", bold_s),
SP(1),
P("✅ 家庭的重要性 Importance of Family:", body_s),
P("• 家庭是个人成长的摇篮,提供情感支持和安全感", bullet_s),
P("• 良好的家庭关系有助于个人的心理健康和幸福感", bullet_s),
P("• 父母是孩子的第一任老师,家庭教育对品格培养至关重要", bullet_s),
P("• 随着社会老龄化,敬老爱幼的传统价值观更显重要", bullet_s),
SP(2),
P("👨👩👧 现代家庭面对的挑战 Challenges Facing Modern Families:", body_s),
P("• 工作繁忙导致家庭成员相处时间减少", bullet_s),
P("• 科技的使用可能导致家庭成员各自沉浸在屏幕中", bullet_s),
P("• 代沟问题使父母与子女之间的沟通产生障碍", bullet_s),
P("• 生活费用高涨使许多年轻人面临结婚和生育的压力", bullet_s),
], bg=LRED, border=RED))
story.append(SP(3))
story.append(qa_table([
("现代年轻人应该如何照顾年迈的父母?",
["照顾父母是我们应尽的责任,体现了中华文化中孝道的精神。",
"我们可以多抽时间陪伴父母,聆听他们的心声,让他们感受到关爱。",
"在经济上提供支持,协助安排医疗保健,确保他们的晚年生活无忧。",
"即使工作繁忙,也应定期与父母联系,让他们知道我们一直在乎他们。"]),
("如何解决父母与子女之间的代沟问题?",
["沟通是解决代沟的关键,双方都应以开放和尊重的态度交流。",
"父母应该尝试了解子女的想法和兴趣,不要一味地以传统观念要求他们。",
"子女也应该体谅父母的出发点,理解他们的担忧和期望。",
"共同参与活动,如一起烹饪、运动或旅行,可以增进彼此的了解和感情。"]),
("家庭对个人的成长有什么影响?",
["家庭环境深刻影响一个人的价值观、性格和行为模式。",
"来自温暖和谐家庭的孩子往往更有安全感,更能与他人建立良好的关系。",
"父母的教育方式和榜样作用对子女的品格培养有深远影响。"]),
], q_bg=LRED, border=RED))
story.append(SP(3))
story.append(vocab_table([
("孝道 (xiào dào)", "filial piety"),
("代沟 (dài gōu)", "generation gap"),
("家庭和谐 (jiā tíng hé xié)", "family harmony"),
("品格培养 (pǐn gé péi yǎng)", "character development"),
("安全感 (ān quán gǎn)", "sense of security"),
("社会老龄化 (shè huì lǎo líng huà)", "aging society"),
("情感支持 (qíng gǎn zhī chí)", "emotional support"),
("沟通 (gōu tōng)", "communication"),
], col_color=LRED, border=RED))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# TOPIC 8: ECONOMY & WORK
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("话题八:经济与工作 Economy & Work", BLUE))
story.append(SP(3))
story.append(color_box([
P("核心论点", bold_s),
SP(1),
P("✅ 新加坡经济发展的特点 Singapore's Economic Development:", body_s),
P("• 新加坡是一个高度开放的经济体,依赖国际贸易和外来投资", bullet_s),
P("• 战略性地理位置使新加坡成为区域金融和物流中心", bullet_s),
P("• 拥有廉洁高效的政府和完善的法律制度,吸引跨国公司", bullet_s),
P("• 积极培育创新生态系统,发展科技和数码经济", bullet_s),
SP(2),
P("💼 未来工作的趋势 Future Work Trends:", body_s),
P("• 远程工作和弹性工作制度越来越普遍", bullet_s),
P("• 绿色经济创造新的就业机会", bullet_s),
P("• 数字技能成为职场必备能力", bullet_s),
P("• 创业精神和创新思维受到重视", bullet_s),
], bg=LBLUE, border=BLUE))
story.append(SP(3))
story.append(qa_table([
("新加坡年轻人在职场上面对哪些挑战?",
["竞争激烈是首要挑战,年轻人需要不断提升自己的技能以保持竞争力。",
"工作与生活的平衡也是一大挑战,尤其是在高压的工作环境中。",
"快速变化的经济环境要求年轻人具备适应能力和终身学习的精神。",
"尽管如此,新加坡也提供了许多机会,例如SkillsFuture计划帮助国人持续进修。"]),
("创业和打工各有什么优缺点?",
["创业的优点是自主性强,可以追求自己的梦想和创意,但风险也较高。",
"打工则提供稳定的收入和保障,但可能缺乏发展空间。",
"两者并无绝对的好坏,关键在于个人的性格、能力和人生目标。",
"无论选择哪条路,努力、坚持和不断学习都是成功的关键。"]),
("科技如何改变未来的工作模式?",
["人工智能和自动化将取代许多重复性工作,迫使人们转向更需要创造力和人际技能的岗位。",
"远程工作技术的发展让人们可以在世界任何地方工作。",
"因此,终身学习和技能升级将成为职场人士的必修课。"]),
], q_bg=LBLUE, border=BLUE))
story.append(SP(3))
story.append(vocab_table([
("创业精神 (chuàng yè jīng shén)", "entrepreneurial spirit"),
("竞争力 (jìng zhēng lì)", "competitiveness"),
("数字技能 (shù zì jì néng)", "digital skills"),
("远程工作 (yuǎn chéng gōng zuò)", "remote work"),
("跨国公司 (kuà guó gōng sī)", "multinational company (MNC)"),
("技能升级 (jì néng shēng jí)", "skills upgrading"),
("弹性工作 (tán xìng gōng zuò)", "flexible work arrangements"),
("绿色经济 (lǜ sè jīng jì)", "green economy"),
], col_color=LBLUE, border=BLUE))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════
# APPENDIX: ORAL TIPS & USEFUL PHRASES
# ═══════════════════════════════════════════════════════════════════
story.append(section_header("附录一:口试技巧 Oral Examination Tips", BLACK))
story.append(SP(3))
story.append(color_box([
P("开口前 Before You Speak:", bold_s),
P("• 仔细观察图片/视频,注意人物、地点、活动和情绪", bullet_s),
P("• 思考话题的不同角度,包括正面和负面的观点", bullet_s),
P("• 回忆相关词汇和表达方式", bullet_s),
SP(2),
P("表达意见时 When Expressing Opinions:", bold_s),
P("• 先表明立场,再给出理由和例子", bullet_s),
P("• 承认对立观点,然后反驳或补充", bullet_s),
P("• 用具体的新加坡例子来支持论点", bullet_s),
SP(2),
P("结尾时 When Concluding:", bold_s),
P("• 总结自己的看法,重申立场", bullet_s),
P("• 提出建议或展望未来", bullet_s),
P("• 保持语气平稳,不要太过激动或偏激", bullet_s),
], bg=LGRAY, border=MGRAY))
story.append(SP(4))
story.append(section_header("附录二:万用句型 Useful Sentence Patterns", BLACK))
story.append(SP(3))
phrases = [
("表达观点 Expressing Views",
["我认为/我觉得……(I think/feel that...)",
"在我看来……(In my opinion...)",
"就我个人而言……(As far as I personally am concerned...)",
"我同意/不同意这个观点,因为……(I agree/disagree because...)"]),
("举例说明 Giving Examples",
["以……为例……(Taking ... as an example...)",
"举个例子……(For example...)",
"以新加坡为例……(Taking Singapore as an example...)",
"根据……可以看出……(Based on ... we can see that...)"]),
("承认对立观点 Acknowledging Opposing Views",
["固然……但是……(Although ... however...)",
"虽然有人认为……但我觉得……(Although some may think ... I feel...)",
"不可否认……然而……(It cannot be denied that ... however...)",
"……有其道理,但是……(... has its merits, but...)"]),
("作出总结 Making Conclusions",
["总的来说……(In general / Overall...)",
"综上所述……(In conclusion...)",
"因此,我认为……(Therefore, I think...)",
"只要……就能……(As long as ... then we can...)"]),
]
for title, lines in phrases:
story.append(color_box([
P(f"{title}", bold_s),
SP(1),
] + [P(f"• {l}", bullet_s) for l in lines],
bg=LGRAY, border=MGRAY))
story.append(SP(2))
story.append(PageBreak())
story.append(section_header("附录三:描述图片/视频的句型 Describing Images/Videos", BLACK))
story.append(SP(3))
story.append(color_box([
P("描述内容 Describing Content:", bold_s),
P("• 从图片/视频中,我可以看到……(From the image/video, I can see...)", bullet_s),
P("• 图片/视频中有……(In the image/video, there is/are...)", bullet_s),
P("• 图片/视频描述了……的情景(The image/video depicts a scene of...)", bullet_s),
SP(2),
P("描述人物 Describing People:", bold_s),
P("• 图中的人物看起来……(The person in the image appears to be...)", bullet_s),
P("• 他/她的表情显示出……(His/her expression shows...)", bullet_s),
P("• 他们正在……(They are currently...)", bullet_s),
SP(2),
P("引出话题 Introducing the Topic:", bold_s),
P("• 这让我想到了……这个话题(This reminds me of the topic of...)", bullet_s),
P("• 这个场景反映了……的问题(This scene reflects the issue of...)", bullet_s),
P("• 关于……这个话题,我有以下几点想法(Regarding the topic of ..., I have the following thoughts)", bullet_s),
], bg=LGRAY, border=MGRAY))
story.append(SP(4))
story.append(HR())
story.append(SP(2))
story.append(P("祝你口试顺利!加油!Best of luck for your oral examination! 💪",
S("end_note", fontSize=12, alignment=TA_CENTER, textColor=BLUE)))
story.append(SP(1))
story.append(P("© 2026 华文O水准口试备考笔记 | 仅供个人学习使用",
S("footer", fontSize=8, alignment=TA_CENTER, textColor=DGRAY)))
doc.build(story)
print("Done:", OUTPUT)