简介一份面向四川大学固体物理课程期末备考的复习大纲PPT适合物理类本科生考前系统梳理知识框架、查漏补缺。课件以晶体结构开篇涵盖Miller指数标定、sc/bcc/fcc/hcp/diamond及闪锌矿等典型结构随后依次展开对称性与晶体点群、衍射理论Bragg定律、倒格子与Laue方程、布里渊区与结构因子、晶体结合力离子键、共价键、金属键及Madelung势以及晶格振动和晶体热学性质色散关系、声学支与光学支、Debye模型等内容并将固体缺陷、扩散机制一并纳入总结。压缩包内含1个pptx文件大小仅133KB体量轻便、结构清晰可配合教材各章节定向复习也可用于考前快速过一遍核心公式与概念实用性强。已有95人学习下载适合需要重点突破固体物理难点、提高复习效率的本科学生。1. 先别翻页四川大学固体物理期末复习大纲PPT学习教案后半部分才是整套内容的真正入口拿到“四川大学固体物理期末复习大纲PPT学习教案.pptx”这个文件我的第一反应不是逐页翻看布洛赫定理推导而是把它当成一份半结构化数据来处理。文件名本身已经把信息层次交代清楚了课程名是固体物理资源类型是期末复习大纲载体是 PPT 学习教案。对常年和课件打交道的工程师来说这类文件的价值并不只在最后的成绩而在于它背后的知识拓扑——哪一章前置、哪一章是核心枢纽、哪几个概念被反复引用。固体物理又恰恰是一门高度链式的课布拉伐格子、倒格子、布里渊区、能带、费米面每一步都踩着上一步的结论往前走。所以这篇文章想解决的是更实际的问题如何从这份复习大纲里把知识骨架抽出来、整理成可检索的结构再变成期末前真正能执行的复习计划。2. 用 python-pptx 把复习大纲 PPT 拆成可检索的知识 JSON2.1 先分辨 .pptx 里哪些形状才值得提取PPT 看起来是自由排版但底层结构比大多数人想得规矩。一个 .pptx 本质上是一个 ZIP 压缩包里面按 XML 描述每张幻灯片上的形状对象。对于复习大纲类课件我们会遇到的形状基本逃不出几类标题占位符、正文文本框、表格、公式图片、组织结构图。如果一上来就盲目提取全部文本最后得到的是一堆带页码的杂乱字符串连“哪句话属于哪一章”都无法还原。先用 python-pptx 做一个最小探测看看每张幻灯片上到底有什么from pptx import Presentation from pptx.enum.shapes import MSO_SHAPE_TYPE prs Presentation(四川大学固体物理期末复习大纲PPT学习教案.pptx) for slide_idx, slide in enumerate(prs.slides, 1): for shape in slide.shapes: print(slide_idx, shape.shape_type, shape.name)这段代码遍历每张幻灯片上的全部形状打印页码、形状类型枚举和形状名称。shape_type返回的是MSO_SHAPE_TYPE枚举对象shape.name则是 PowerPoint 给每个形状分配的内部名通常是“标题 1”“文本框 2”这样的值。相比直接打印文本先看类型分布更容易判断材料的“干净程度”如果大量出现GROUP说明内容被组团了后面解析时要递归展开如果大量出现PICTURE说明公式或结构图是以图片形式嵌入的文本提取覆盖不到这部分知识。下表给出了复习大纲 PPT 中常见的形状类型和它们的实际含义MSO_SHAPE_TYPE 枚举典型内容提取策略PLACEHOLDER幻灯片标题、正文占位符优先提取层级信息最可靠TEXT_BOX手工加的文本框、注释提取但层级要靠字体大小辅助判断TABLE公式对比表、参数表逐单元格读取横向转成关系PICTURE晶体结构图、公式截图转 OCR 或手工标注不能直接取文本GROUP组合图形递归展开子形状后再判断2.2 按字号与位置还原大纲层级识别出值得提取的形状之后下一步是还原大纲层级。复习大纲 PPT 的排版通常遵循一个规律章标题字大节标题字小正文最小章标题靠左上知识点正文缩进靠右。这个规律不是绝对的但足够作为初版启发规则。下面这个函数对于捕捉每个文本形状的第一个 paragraph就足够作为初版解析的核心逻辑def shape_to_basic_node(shape, slide_width): if not shape.has_text_frame: return None raw_text shape.text_frame.text.strip() if not raw_text: return None first_para shape.text_frame.paragraphs[0] font_size None for run in first_para.runs: if run.font.size is not None: font_size run.font.size.pt break left_ratio round(shape.left / slide_width, 2) if slide_width else None return { text: raw_text, size_pt: font_size, left_ratio: left_ratio, level: first_para.level, }这里的关键参数有两个font_size和left_ratio。font_size是段落里第一个非空字号的像素值通常章标题大于 28pt节标题在 20pt 到 28pt 之间正文在 14pt 到 18pt 之间。但很多课件并没有在每个 run 上显式设置字号此时font_size会是None这时就要看first_para.level。paragraph.level是 PowerPoint 里真正的提纲层级0 表示顶级1 表示一级缩进这个值不依赖设计者的字体习惯比字号判断更稳定。left_ratio是形状左侧坐标与幻灯片宽度的比值用来区分左侧章节栏和右侧正文区。如果某个形状的left_ratio小于 0.3且字号又大于 24pt那基本可以断定它是章节标题如果它在 0.3 到 0.7 之间则多半是知识条目。这一步不是银弹但能覆盖绝大多数模板化课件的排版规律。提示很多由 WPS 转存的 .pptx 不会在每个 run 上写font.size而是依赖占位符继承母版的样式。这种情况下不要硬猜字号直接用paragraph.level作为层级主依据。2.3 导出的 JSON 字段应该怎么设计把每页文本按层级合并之后我建议输出成树形的 JSON而不是平铺数组。平铺数组只能回答“这页讲了什么”树形结构才能回答“这个知识点属于哪一章、和谁是兄弟节点”。树的构建规则是遇到章标题就开新树根遇到节标题就挂到当前章下遇到正文节点就挂到当前节下。一条文本到底属于标题还是正文用字号阈值加正则过滤双条件判断。下面是导出节点的结构示例{ id: ch3_node7, title: 一维单原子链的色散关系, level: 2, parent: ch3, chapter: 晶格振动与声子, keywords: [色散关系, 声学支, 格波], raw_text: ω² (4K/M) sin²(qa/2), source_slide: 12 }我通常要求 JSON 至少包含id、title、level、parent、chapter和source_slide这六个字段。source_slide是溯源的关键任何后续生成的知识卡片如果出了问题都可以立刻定位回原始页keywords则用于第 4 章的卡片生成避免手工维护关键词表。这一步做完你得到的就不再是一份 PPT而是一棵可以查询、剪枝、重新渲染的课程知识树。3. 对据知识 JSON 固化成固体物理「考点依赖」图3.1 先把知识的先修关系补上去JSON 树只能告诉我们“知识点在目录里属于哪一章”但固体物理的复习难点恰恰在于跨章节依赖。比如不先弄清楚倒格子布里渊区的边界条件就无从谈起不理解布洛赫定理能带图中的 k 轴就只是个符号不了解费米分布金属比热的推导会卡在两三条公式处。树形结构是层级关系依赖图才是真正的认知关系。常见的做法是先生成树再人工补边。我一般会在 JSON 解析完成后对照课程大纲把跨章节的先修关系整理成一张边表。以固体物理的核心主线为例这张表长这样起点终点依赖原因晶体结构倒格子倒格子定义依赖正格子的基矢倒格子布里渊区布里渊区是倒空间的原胞划分布里渊区能带理论能带 E(k) 定义在布里渊区中晶格振动声子声子是晶格振动量子化的结果能带理论半导体带隙概念是半导体器件的起点自由电子气能带理论能带几乎总是在自由电子模型上作修正这张边表最直接的作用是告诉我们哪些节点是不能跳过的枢纽。如果复习时间只剩一周倒格子、布里渊区、能带理论三个节点必须优先保证因为它们是整个依赖图里出度最高的节点。3.2 用 NetworkX 找出复习主线有了树和边表就可以用 NetworkX 建一个有向无环图然后做拓扑排序。拓扑排序的结果就是一份不违背认知顺序的复习序列。import networkx as nx G nx.DiGraph() edges [ (晶体结构, 倒格子), (倒格子, 布里渊区), (布里渊区, 能带理论), (晶格振动, 声子), (自由电子气, 能带理论), (能带理论, 半导体), ] G.add_edges_from(edges) try: review_order list(nx.topological_sort(G)) print(复习主线:, - .join(review_order)) except nx.NetworkXUnfeasible: print(图中存在环路需要先做环消解)topological_sort返回的是节点的一个线性排列保证每一条有向边都从前往后出现。这里有一个参数层面的讲究同一批先修关系中拓扑排序的结果并不唯一默认返回的顺序取决于节点的插入顺序。如果你想更接近真实课程节奏可以把边按“原 PPT 中出现顺序”排序后再建图。如果依赖图里出现环比如“能带理论”和“费米面”互相前置拓扑排序会直接抛NetworkXUnfeasible。换个实现角度试验时发现环不要急着删边先把强连通分量合并成一个超节点再排序。nx.strongly_connected_components可以完成这个操作合并后复习主线依然成立。3.3 用硬规则做知识空洞校验光有顺序还不够还要防止“漏掉某个必考块”。固体物理课程里通常有三类知识空洞最容易出现倒格子定义被跳过的同时直接被用在了布里渊区作图里能带理论的推导只记结论却忽略了布洛赫定理的周期性边界条件声子色散和比热模型之间缺乏联系。这三种空洞的共同点是它们在原 PPT 里可能只是几行小字却会被高阶知识大量引用。做法上是写一个简单的规则校验器对每个知识点节点打标记required_pairs [ (布里渊区, 倒格子), (能带理论, 布洛赫定理), (声子比热, 色散关系), ] missing [] for concept, base in required_pairs: if concept in node_titles and base not in node_titles: missing.append((concept, base)) print(缺失的依赖组合:, missing if missing else 无)这里node_titles是从知识 JSON 汇总出的全部节点标题集合。规则的意义在于校验依赖的完整性当一个高阶考点存在、基础考点却缺失时复习材料一定有漏洞。这类规则不需要写太多一门课维护 10 到 20 条就够覆盖的是考点之间最可靠的引用关系。4. 把复习大纲变成可执行复习计划固体物理 FSRS 记忆卡生成管线4.1 为什么大纲不能代替记忆卡大纲解决的是“知道要看什么”记忆卡解决的是“看过之后还记不记得”。很多人期末复习都会经历这个过程翻开大纲觉得全部眼熟合上之后连“倒格子”的定义都说不完整。这是因为识别式记忆和提取式记忆是两码事。真正有效的复习是反复提取而不是反复阅读。间隔重复系统为此提供了可靠的实验基础每次复习间隔应该随记忆强度指数增长而不是每天平均分配。Anki 默认采用的是基于 FSRS 算法的调度方案它用历史复习记录预测每个卡片的记忆稳定性再根据预期记忆保留率计算下一次出现时间。把固体物理的考点逐条做成卡片后这套调度就可以在期末周开始前自动完成筛排。4.2 从 JSON 直接生成 Anki 导入 CSV生成卡片不需要手工录解析出来的知识 JSON 可以直接转成 Anki 的 CSV 导入文件。典型的导入格式是前两列是卡片正面和背面第三列是标签。import csv cards [] for node in knowledge_nodes: if node.get(level) 2 and node.get(title): front f{node[chapter]}{node[title]} back node.get(raw_text, 见原 PPT 对应页) cards.append([front, back, 固体物理]) with open(solid_state_cards.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([Front, Back, Tags]) writer.writerows(cards)这里有两处容易踩坑。第一utf-8-sig不是随便写的Anki 在 Windows 读取 CSV 时如果检测不到 BOM 头中文可能乱码utf-8-sig会在文件开头写入 BOM消除这个问题。第二卡片粒度决定了复习效率。按知识点生成卡片而不是按教材段落生成避免一张卡片承载太多信息量。导入 Anki 时直接选择“Basic”笔记类型CSV 第一行作为字段名字段分隔符保持默认的英文逗号导入即可。Anki 会自动生成空缺的标签字段并把同类卡片归入同一记忆库。4.3 三个参数直接决定期末复习效率卡片生成只是第一步真正影响复习效果的是 FSRS 的三个初始化参数。这三个参数在 Anki 的 FSRS4Anki 插件或新版本内置 FSRS 调度器中均可配置参数名推荐初始值影响desired retention0.9目标记忆保留率越高复习越频繁maximum interval365 天卡片最长间隔期末阶段可缩短newly introduced cards/day20 至 30每日新卡上限防止积压desired retention是最值得调的一个参数。0.9 表示系统试图让你在每次复习时还有 90% 概率记得这个值压到 0.85 会明显减少每日复习量但考试风险会上升。期末周前把新卡上限调到每天 20 到 30 是合理节奏既能覆盖大纲知识点又不会因为累计复习量超过 200 张而直接弃坑。maximum interval在期末场景下不用拉太长考后如果不打算继续维持记忆可以保持在 90 天以内减少对后续记忆队列的污染。提示FSRS 的参数只对“复习时间点”起作用卡片内容质量依然由人决定。生成卡片时在 Back 里保留source_slide字段遇到记忆模糊的卡片可以一键回原 PPT 定位原始语境这个做法比反复看整本课件效率高得多。5. 归档前必做把生成的复习材料打回原大纲做反向 diff5.1 从 JSON 反向渲染 Markdown 大纲整套管线的最后一步是验证生成的卡片集合是否覆盖了原大纲的全部一级和二级标题。最直接的办法是把知识 JSON 反向渲染成 Markdown再与原 PPT 提取出的纯文本大纲做一次 diff。如果两个版本的章节标题能逐行对上说明解析层级和卡片生成没有问题如果出现大段错位多半是字号阈值或层级判断出了问题。先做一个最精简的反向渲染函数def render_markdown(node, lines): prefix # * (node[level] 1) lines.append(f{prefix} {node[title]}) for child in node.get(children, []): render_markdown(child, lines) return lines md_lines render_markdown(knowledge_tree, []) raw_lines [node[raw_text] for node in raw_ppt_nodes] import difflib diff list(difflib.unified_diff(raw_lines, md_lines, lineterm)) print(\n.join(diff[:80]))difflib.unified_diff的输出和命令行 diff 一致-开头的行是原大纲独有开头的行是渲染后的 Markdown 独有。检查时不需要逐句看全部差异只看两个地方一级标题是否都对齐关键词集中的节点是否有成片丢失。5.2 用层级参数兜底旧版 .ppt 转存差异最后一类很常见的问题来自文件本身的格式差异。旧版.ppt被转换成.pptx时python-pptx 读到的字体信息常常大面积缺失字号字段会返回 None这时按left_ratio和paragraph.level联合判断就比单独依赖字号要可靠。另一个实际经验是教师用 WPS 编辑后另存为 .pptx形状的left坐标使用 EMU 绝对值虽然没有单位换算问题但形状的位置可能和 PowerPoint 排版时不同所以left_ratio不能死卡 0.5设置成一个范围区间会降低误判率。真正棘手的场景是公式图片文本提取天然无效这时我会在 JSON 的keywords字段里手工补上“倒格子基矢”这类搜索锚点让图片节点至少能被检索定位到。这一层兜底做完这份复习大纲才算真正从 PPT 变成了能查询、能排序、能反向验证的知识资产。本文还有配套的精品资源点击获取
