新增课程教学执行大纲 LaTeX 模板(course/) #2

Closed
opened 2026-10-26 09:43:38 +00:00 by laoyang · 1 comment
Owner

需求来源

把学校下发的《2025秋数字逻辑课程执行大纲.docx》处理成 LaTeX 模板,放入仓库独立子目录 course/。

用户原话:

把这个文件,也处理成 latex,比较复杂,仔细比对。弄一个虚拟课程出来,别用我的真实数据。

三条硬要求:

  1. 版式尽量与原 docx 一模一样;
  2. 该文档比前两个表格(form/、form2/)复杂得多,要求逐项精细核对版式;
  3. 内容全部虚构,不得保留真实数据(课程名、课程代码、开课号、任课教师、教材作者、思政案例)。

涉及范围

  • 新增 course/:ouccourse.sty(版式宏包)、课程执行大纲.tex(虚构示例)、README.md
  • 更新根 README.md 目录表,补 course/ 一行

原 docx 的关键结构(解析结论)

  • sectPr:pgSz 11910×16840(WPS 的非标准 A4)、pgMar top 1420 / right 1300 / bottom **280** / left 1560
  • 下边距只有 4.94mm,明显是为塞进 5 页压出来的
  • 2 张表、214 个段落、5 页
  • 46 处 w:ins 插入修订、0 处 w:del;1 处硬分页(在「年 月 日」之后)
  • 无页眉页脚、无页码
  • 字号分布:9pt×200 / 12pt×172 / 14pt×34 / 10.5pt×22 / 15pt×3 / 18pt×1
  • 字体:方正小标宋简体、方正仿宋_GB2312、黑体、宋体 —— 前两个是商业字体,本机未安装

验收标准

  1. 编译零错误、零 Overfull、零 Underfull
  2. 页数 = 5 页(与原 docx 一致)
  3. 表 0(成绩综合评分体系):宽 156.93mm、5 行 × 8.01mm、两列 131.921/25.012mm
  4. 表 1(教学日历):宽 165.54mm(超版心 5.91mm,需居中溢出)、6 列宽度逐列对齐 gridCol、16 行
  5. 表 1 跨第 4/5 页,跨页处不重复表头、无续页提示(原 docx 无 tblHeader)
  6. 纵向合并 5 组(R1-R2 / R3-R4 / R5-R6 / R7-R8 / R9-R10)、R14/R15 整行合并
  7. 字号:正文 12pt、表 0 12pt、表 1 9pt、表头 11pt、R15 10.5pt
  8. 真实数据零残留:数字逻辑 / 080502101231 / 杨永全 / 25252029 / 王玉龙 / 玛考威茨 / 华为 / 抗美援朝 / 秦依康 / 逻辑代数 / 卡诺图 / 触发器 / 译码器 / 2025
  9. course/README.md 写清用法、参数表、版式数据来源、字体降级、坑位、校验方法
## 需求来源 把学校下发的《2025秋数字逻辑课程执行大纲.docx》处理成 LaTeX 模板,放入仓库独立子目录 `course/`。 用户原话: > 把这个文件,也处理成 latex,比较复杂,仔细比对。弄一个虚拟课程出来,别用我的真实数据。 三条硬要求: 1. 版式尽量与原 docx **一模一样**; 2. 该文档比前两个表格(form/、form2/)复杂得多,要求**逐项精细核对**版式; 3. 内容**全部虚构**,不得保留真实数据(课程名、课程代码、开课号、任课教师、教材作者、思政案例)。 ## 涉及范围 - 新增 `course/`:`ouccourse.sty`(版式宏包)、`课程执行大纲.tex`(虚构示例)、`README.md` - 更新根 `README.md` 目录表,补 `course/` 一行 ## 原 docx 的关键结构(解析结论) - `sectPr`:`pgSz 11910×16840`(WPS 的非标准 A4)、`pgMar top 1420 / right 1300 / bottom **280** / left 1560` - 下边距只有 **4.94mm**,明显是为塞进 5 页压出来的 - 2 张表、214 个段落、5 页 - 46 处 `w:ins` 插入修订、0 处 `w:del`;1 处硬分页(在「年 月 日」之后) - 无页眉页脚、无页码 - 字号分布:9pt×200 / 12pt×172 / 14pt×34 / 10.5pt×22 / 15pt×3 / 18pt×1 - 字体:方正小标宋简体、方正仿宋_GB2312、黑体、宋体 —— 前两个是**商业字体,本机未安装** ## 验收标准 1. 编译**零错误、零 Overfull、零 Underfull** 2. 页数 = **5 页**(与原 docx 一致) 3. 表 0(成绩综合评分体系):宽 156.93mm、5 行 × 8.01mm、两列 131.921/25.012mm 4. 表 1(教学日历):宽 165.54mm(超版心 5.91mm,需居中溢出)、6 列宽度逐列对齐 gridCol、16 行 5. 表 1 跨第 4/5 页,跨页处**不重复表头**、**无续页提示**(原 docx 无 `tblHeader`) 6. 纵向合并 5 组(R1-R2 / R3-R4 / R5-R6 / R7-R8 / R9-R10)、R14/R15 整行合并 7. 字号:正文 12pt、表 0 12pt、表 1 9pt、表头 11pt、R15 10.5pt 8. 真实数据**零残留**:数字逻辑 / 080502101231 / 杨永全 / 25252029 / 王玉龙 / 玛考威茨 / 华为 / 抗美援朝 / 秦依康 / 逻辑代数 / 卡诺图 / 触发器 / 译码器 / 2025 9. `course/README.md` 写清用法、参数表、版式数据来源、字体降级、坑位、校验方法
Author
Owner

已完成并推送 main:e032aec..6584dfa(2 个提交,均带 #2)。

交付物

文件 大小 说明
course/ouccourse.sty 20.6 KB 版式宏包,尺寸全部从 OOXML 量出
course/课程执行大纲.tex 18.1 KB 虚构课程「信号与系统基础」完整示例
course/课程执行大纲.pdf 5 页 编译产物
course/README.md 12.6 KB 用法 / 参数 / twips→mm 对照 / 字体降级 / 六个坑 / 校验方法
根 README.md — 目录表补 course/ 一行

验收结果:26/26 项量化达标

页数        5            (与原 docx 一致)
编译        零错误、零 Overfull、零 Underfull

表 0 宽     156.753      目标 156.930    差 −0.177
     左      27.608      目标  27.520
     高      40.040      目标  40.050
     列     131.830 / 24.924    目标 131.921 / 25.012
     行高     8.010      目标 8.010(5 行全等)

表 1 宽     165.358      目标 165.540    差 −0.182
     左      22.320      目标  22.270
     列      14.894 / 19.971 / 33.076 / 14.965 / 49.975 / 32.477
             目标 14.922 / 20.002 / 33.108 / 14.993 / 50.006 / 32.508
             (逐列误差均 < 0.032mm)
     R0      16.334      目标 16.170
     R14     32.385      目标 32.190
     R15     56.339      atLeast 下限 18.930,被 12 段内容撑高(Word 里同样如此)

各页最低点   286.53 / 263.23 / 240.09 / 284.82 / 125.19 mm
            均 ≤ 292.06(版心下沿),无越界

字号        正文 12pt、表 0 12pt、表 1 9pt、表头 11pt、R15 10.5pt  全部一致

真实数据零残留(逐词扫描)

数字逻辑 0    080502101231 0    杨永全 0    25252029 0    王玉龙 0
玛考威茨 0    Marcovitz 0      华为 0      抗美援朝 0    秦依康 0
逻辑代数 0    卡诺图 0          触发器 0    译码器 0      2025 0

虚构课程对标:信号与系统基础 / 081203304517 / 99663311 / ××× / 电子信息工程。
思政案例全部换掉(改北斗导航、高速模数转换芯片、反馈放大器自激振荡)。

过程中踩到的六个坑(已全部写进 README)

  1. 表宽 > 版心时不能按比例缩列宽。我先按 159.55/165.54 = 0.9638 缩了,结果表宽虽对了,但长文字提前折行、行高全变、页数从 5 掉到 4。正解是列宽照抄 gridCol,用 \leftskip 把整块左移 5.29mm。
  2. \hspace* 对 longtblr 的 \halign 盒子无效,会被吞掉,横向位移一点没生效。
  3. wd= 是内容宽,不含竖线自身 0.5pt。表 1 是 6 列 7 线,每列要承担 7/6 条;漏算会让总宽多出 1mm。同理 ht= 含横线预算,要 8.01mm 得给 ht=7.834mm。
  4. presep/headsep 是 outer 键,误写进 inner spec 不报错,但会把 0pt 当表内容印在表头 —— 第一版渲染出来表头有一串 0pt0pt0pt0pt 垃圾字。表级默认字号也一样:必须写 cells={font=...},单独写 font= 被静默忽略,表内退回 12pt。
  5. longtblr 跨页提示要清两组模板。只清 contHead/contFoot 实例不够(第 5 页仍出现「表0:」和「(Continued)」);而 conthead-text 又不能设成 empty,会报 LaTeX3 Error: Erroneous variable \l__tblr_template_conthead_text_tl。要用 \DefTblrTemplate{...}{normal}{} 重定义为空。
  6. \linespread 乘的是外层基准字号,不是当前字号。在 \ccszix(9pt) 上下文里写 \linespread{1.2} 得到的是 10.8pt 而非 12.6pt,空行高度直接失控(5 个空行占 39.85mm)。要钉死得用 \fontsize{10.5}{12.6}。

两个已知偏差(可接受)

项目 docx 本模板 原因
纸张 210.08 × 297.04 210 × 297 标准 A4,差 0.07/0.04mm,肉眼不可辨
字体 方正小标宋简体 / 方正仿宋_GB2312 宋体加粗 / 仿宋 商业字体本机未安装,README 写明装了之后改哪 4 行

校验方法

不靠肉眼。用 pymupdf 读 PDF 的 get_drawings() 拿线段坐标、get_text('dict') 拿 span bbox,全部换算成 mm(原点左上、与 docx 同向)后逐项比对。

一个容易踩的脚本坑:同一条竖线会被重复计入多次(每个单元格一段),做列宽计算前必须 sorted(set(round(x,2) ...)) 去重,否则 xs[1]-xs[0] 算出来恒为 0 —— 我第一版校验脚本就栽在这里,误报了 6 项 FAIL。

已完成并推送 `main`:`e032aec..6584dfa`(2 个提交,均带 `#2`)。 ## 交付物 | 文件 | 大小 | 说明 | |---|---|---| | `course/ouccourse.sty` | 20.6 KB | 版式宏包,尺寸全部从 OOXML 量出 | | `course/课程执行大纲.tex` | 18.1 KB | 虚构课程「信号与系统基础」完整示例 | | `course/课程执行大纲.pdf` | 5 页 | 编译产物 | | `course/README.md` | 12.6 KB | 用法 / 参数 / twips→mm 对照 / 字体降级 / 六个坑 / 校验方法 | | 根 `README.md` | — | 目录表补 `course/` 一行 | ## 验收结果:26/26 项量化达标 ``` 页数 5 (与原 docx 一致) 编译 零错误、零 Overfull、零 Underfull 表 0 宽 156.753 目标 156.930 差 −0.177 左 27.608 目标 27.520 高 40.040 目标 40.050 列 131.830 / 24.924 目标 131.921 / 25.012 行高 8.010 目标 8.010(5 行全等) 表 1 宽 165.358 目标 165.540 差 −0.182 左 22.320 目标 22.270 列 14.894 / 19.971 / 33.076 / 14.965 / 49.975 / 32.477 目标 14.922 / 20.002 / 33.108 / 14.993 / 50.006 / 32.508 (逐列误差均 < 0.032mm) R0 16.334 目标 16.170 R14 32.385 目标 32.190 R15 56.339 atLeast 下限 18.930,被 12 段内容撑高(Word 里同样如此) 各页最低点 286.53 / 263.23 / 240.09 / 284.82 / 125.19 mm 均 ≤ 292.06(版心下沿),无越界 字号 正文 12pt、表 0 12pt、表 1 9pt、表头 11pt、R15 10.5pt 全部一致 ``` ## 真实数据零残留(逐词扫描) ``` 数字逻辑 0 080502101231 0 杨永全 0 25252029 0 王玉龙 0 玛考威茨 0 Marcovitz 0 华为 0 抗美援朝 0 秦依康 0 逻辑代数 0 卡诺图 0 触发器 0 译码器 0 2025 0 ``` 虚构课程对标:信号与系统基础 / 081203304517 / 99663311 / ××× / 电子信息工程。 思政案例全部换掉(改北斗导航、高速模数转换芯片、反馈放大器自激振荡)。 ## 过程中踩到的六个坑(已全部写进 README) 1. **表宽 > 版心时不能按比例缩列宽**。我先按 159.55/165.54 = 0.9638 缩了,结果表宽虽对了,但长文字提前折行、行高全变、页数从 5 掉到 4。正解是列宽照抄 `gridCol`,用 `\leftskip` 把整块左移 5.29mm。 2. **`\hspace*` 对 `longtblr` 的 `\halign` 盒子无效**,会被吞掉,横向位移一点没生效。 3. **`wd=` 是内容宽,不含竖线自身 0.5pt**。表 1 是 6 列 7 线,每列要承担 7/6 条;漏算会让总宽多出 1mm。同理 `ht=` 含横线预算,要 8.01mm 得给 `ht=7.834mm`。 4. **`presep/headsep` 是 outer 键**,误写进 inner spec 不报错,但会把 `0pt` 当表内容印在表头 —— 第一版渲染出来表头有一串 `0pt0pt0pt0pt` 垃圾字。表级默认字号也一样:必须写 `cells={font=...}`,单独写 `font=` 被静默忽略,表内退回 12pt。 5. **`longtblr` 跨页提示要清两组模板**。只清 `contHead/contFoot` 实例不够(第 5 页仍出现「表0:」和「(Continued)」);而 `conthead-text` 又**不能**设成 `empty`,会报 `LaTeX3 Error: Erroneous variable \l__tblr_template_conthead_text_tl`。要用 `\DefTblrTemplate{...}{normal}{}` 重定义为空。 6. **`\linespread` 乘的是外层基准字号**,不是当前字号。在 `\ccszix`(9pt) 上下文里写 `\linespread{1.2}` 得到的是 10.8pt 而非 12.6pt,空行高度直接失控(5 个空行占 39.85mm)。要钉死得用 `\fontsize{10.5}{12.6}`。 ## 两个已知偏差(可接受) | 项目 | docx | 本模板 | 原因 | |---|---|---|---| | 纸张 | 210.08 × 297.04 | 210 × 297 | 标准 A4,差 0.07/0.04mm,肉眼不可辨 | | 字体 | 方正小标宋简体 / 方正仿宋_GB2312 | 宋体加粗 / 仿宋 | 商业字体本机未安装,`README` 写明装了之后改哪 4 行 | ## 校验方法 不靠肉眼。用 `pymupdf` 读 PDF 的 `get_drawings()` 拿线段坐标、`get_text('dict')` 拿 span bbox,全部换算成 mm(原点左上、与 docx 同向)后逐项比对。 一个容易踩的脚本坑:**同一条竖线会被重复计入多次**(每个单元格一段),做列宽计算前必须 `sorted(set(round(x,2) ...))` 去重,否则 `xs[1]-xs[0]` 算出来恒为 0 —— 我第一版校验脚本就栽在这里,误报了 6 项 FAIL。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/ouc_latex_template#2