diff --git a/README.md b/README.md
index 5a96914..e400792 100644
--- a/README.md
+++ b/README.md
@@ -1,64 +1,167 @@
-# ouc_latex_template
+# 中国海洋大学 LaTeX 模板库
-中国海洋大学各类文件 LaTeX 模板。**本仓库是本项目唯一的模板维护库**,各模板按文档类别分目录存放,互不依赖、可单独编译。
+16 个文档模板 + 一份公共字体。换机器、换系统、换 Overleaf,编译结果一致。
-## 目录
+## 目录结构
-| 目录 | 内容 | 编译入口 |
+```
+ouc_latex_template/
+├── fonts.tex ← 公共字体入口,所有模板都引用它
+├── fonts/ ← 字体文件(唯一的字体来源)
+├── build.sh ← 编译脚本
+├── verify_all.sh ← 全库编译检查
+│
+├── 会议预算表/ ┐
+├── 劳务发放说明表/ │
+├── 年度考核登记表/ │
+├── 特殊事项说明表/ │
+├── 成绩构成说明/ │
+├── 试卷/ │
+├── 试卷归档封面/ │ 16 个模板
+├── 试卷归档目录/ │ 每个目录自成一体
+├── 课程大纲/ │ 各自带 README
+├── 课程执行大纲/ │
+├── 课程教学日历/ │
+├── 教材/ │
+├── 科技报告/ │
+├── 幻灯片/ │
+└── 简历/ ┘
+```
+
+## 模板清单
+
+| 模板 | 用途 | 主文件 |
|---|---|---|
-| [`试卷/`](试卷/) | 期末考试**试卷**、**参考答案及评分标准**两套模板 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` |
-| [`试卷归档封面/`](试卷归档封面/) | 信息科学与工程学部**试卷归档封面**(理论课) | `试卷归档封面.tex` |
-| [`试卷归档目录/`](试卷归档目录/) | 信息科学与工程学部**试卷归档目录**(理论课,12 项核对清单) | `试卷归档目录.tex` |
-| [`年度考核登记表/`](年度考核登记表/) | 教职工**年度考核登记表** | `年度考核登记表.tex` |
-| [`劳务发放说明表/`](劳务发放说明表/) | **劳务发放说明表** | `劳务发放说明表.tex` |
-| [`特殊事项说明表/`](特殊事项说明表/) | 报销用**特殊事项说明表**(事项描述 + 三级签字审批) | `特殊事项说明表.tex` |
-| [`课程执行大纲/`](课程执行大纲/) | 本科**课程教学执行大纲** | `课程执行大纲.tex` |
-| [`课程教学日历/`](课程教学日历/) | 学校通用版**课程教学日历(理论课程)**(附件3,16 周日历表) | `课程教学日历.tex` |
-| [`成绩构成说明/`](成绩构成说明/) | **成绩构成说明**(理论课/实验课比例分解表 + 教师签字栏) | `成绩构成说明.tex` |
-| [`幻灯片/`](幻灯片/) | 演示文稿(**beamer** 主题,海大配色) | `slides.tex` |
-| [`科技报告/`](科技报告/) | **科技报告**、实验讲义、说明文档 | `report.tex` |
-| [`简历/`](简历/) | **个人简历**(中文,A4 两栏式,含圆形头像与分区条目) | `简历.tex` |
+| `会议预算表/` | 会议经费预算表 | `会议预算表.tex` |
+| `劳务发放说明表/` | 劳务费发放说明 | `劳务发放说明表.tex` |
+| `年度考核登记表/` | 教职工年度考核登记表 | `年度考核登记表.tex` |
+| `特殊事项说明表/` | 报销用特殊事项说明表 | `特殊事项说明表.tex` |
+| `成绩构成说明/` | 课程成绩构成说明 | `成绩构成说明.tex` |
+| `试卷/` | 试卷 + 参考答案与评分标准 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` |
+| `试卷归档封面/` | 试卷袋归档封面 | `试卷归档封面.tex` |
+| `试卷归档目录/` | 试卷袋归档目录 | `试卷归档目录.tex` |
+| `课程大纲/` | 本科生课程大纲 | `课程大纲.tex` |
+| `课程执行大纲/` | 课程执行大纲 | `课程执行大纲.tex` |
+| `课程教学日历/` | 课程教学日历 | `课程教学日历.tex` |
+| `教材/` | 教材、专著(成书排版) | `教材.tex` |
+| `科技报告/` | 科技报告、实验讲义 | `report.tex` |
+| `幻灯片/` | Beamer 演示文稿(16:9) | `slides.tex` |
+| `简历/` | 个人简历 | `简历.tex` |
## 编译
-全部模板都**必须用 XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过:
+在**模板目录内**编译,不要在仓库根目录编译。
```bash
-cd 幻灯片
-xelatex slides.tex
-xelatex slides.tex # 跑两遍,第二遍才能取到正确的目录、交叉引用与总页数
+cd 课程大纲
+xelatex 课程大纲.tex
```
-目录名含中文不影响编译(已实测 12 个模板目录在中文目录下零报错编译通过)。
+或用编译脚本(在仓库根目录执行):
-## 说明
+```bash
+bash build.sh 课程大纲 # 编单个模板
+bash build.sh all # 编全部,输出汇总
+bash verify_all.sh # 检查全部:错误数 / Overfull / 页数
+```
-- **字体单一来源**:全库字体集中在根目录 [`fonts/`](fonts/),由 [`fonts.tex`](fonts.tex) 统一加载。十二个模板通过 `\input{../fonts.tex}` 取字体,**不自带字体、不依赖系统字体**——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。
-- **全部开源可商用**:无方正、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、无微软雅黑。用的是思源宋体/黑体、霞鹜文楷、朱雀仿宋、TeX Gyre Termes、Cochineal、鸿蒙 HarmonyOS Sans(各字体授权见 [`fonts/LICENSE`](fonts/LICENSE),来源与字符集见 [`fonts/README.md`](fonts/README.md))。
-- **每个子目录自包含**:样式文件(`.sty` / `.cls`)、图片都在各目录内,编译时不需要额外的宏包搜索路径;只有字体是共享的上层目录。
-- **各目录的 `README.md`** 写明该模板的用法、可改参数、版式数据来源与书写注意事项,改之前先看。
-- **示例内容全部虚构**:为了让人一眼看出排版效果,模板里填的是**一整套连贯的假想数据**(虚构教师「张远航」、虚构课程《数字逻辑》2025 秋、虚构的论文 / 专利 / 项目 / 获奖),不是满篇 `×`。这些内容**不含任何真人信息、不含真题**,纯粹是为了让版式跑起来有真实感,使用时整体替换成自己的内容即可。
- - 跨模板虚构设定是统一的:教学日历、成绩构成说明、试卷归档封面、试卷都对应《数字逻辑》2025 秋学期;简历里的论文 / 专利 / 项目 / 获奖属于同一位虚构人物。
- - 一眼可辨的假数据特征:DOI 统一 `10.9999/…`、专利号统一 `ZL209999…`、软著登记号 `2024SR99999…`、手机号 `138 0000 0000`、邮箱用 `example.net`。
- - 少数**必须留空让人手填**的位置(签字、日期、评语栏)仍然是空白或 `×`,这类不能编——编了就分不清哪儿该改了。
+脚本会自动判断该跑几遍,不用手记。
+
+### 各模板编译遍数
+
+| 模板 | 遍数 | 原因 |
+|---|---|---|
+| 表格类(会议预算表、劳务发放说明表、年度考核登记表、特殊事项说明表、成绩构成说明、试卷归档封面、试卷归档目录) | 1 | 无目录、无交叉引用 |
+| `课程大纲`、`课程执行大纲`、`课程教学日历` | 2 | 有目录与交叉引用 |
+| `试卷` | 2 | 有题号交叉引用 |
+| `幻灯片` | 2 | Beamer 需要 |
+| `教材`、`科技报告` | 4 | 有参考文献:`xelatex → bibtex → xelatex → xelatex` |
## 字体
-| 目录 | 字体 | 上游 | 授权 |
-|---|---|---|---|
-| `fonts/ouc-serif/` | OUC Serif(宋体) | 思源宋体 SC 的 GB2312 子集 | SIL OFL 1.1 |
-| `fonts/ouc-sans/` | OUC Sans(黑体) | 思源黑体 SC 的 GB2312 子集 | SIL OFL 1.1 |
-| `fonts/ouc-kai/` | OUC Kai(楷体) | 霞鹜文楷的 GB2312 子集 | SIL OFL 1.1 |
-| `fonts/zhuque-fangsong/` | 朱雀仿宋(仿宋) | 朱雀仿宋 | SIL OFL 1.1 |
-| `fonts/tex-gyre-termes/` | TeX Gyre Termes(西文,全库默认) | Times New Roman 度量兼容替代 | GUST Font License |
-| `fonts/cochineal/` | Cochineal(西文,仅 `简历/` 用) | Minion 风格,Michael Sharpe | SIL OFL 1.1 |
-| `fonts/harmonyos-sans/` | HarmonyOS Sans(幻灯片/科技报告) | 华为 | 华为官方允许免费商用 |
+所有模板的字体都来自 `fonts/`,**不依赖操作系统装了什么字体**。
-合计约 50 MB(改造前 141 MB,见 [`fonts/README.md`](fonts/README.md) 第五节)。
+### 字体目录
-> 子集字体已按 OFL §3 改名(`Source` / `LXGW` 是上游的 Reserved Font Name,裁剪即构成修改版),并保留了 OFL 声明。
-> 用本模板编译出的文档**不受**这些字体授权约束,版权归作者本人。
+```
+fonts/
+├── ouc-serif/ OUC Serif 中文宋体(正文)
+├── ouc-sans/ OUC Sans 中文黑体(标题)
+├── ouc-kai/ OUC Kai 中文楷体(代斜体)
+├── zhuque-fangsong/ Zhuque Fangsong 中文仿宋
+├── tex-gyre-termes/ TeX Gyre Termes 西文衬线(Times 等价)
+├── cochineal/ Cochineal 西文衬线(Minion 风格)
+├── harmonyos-sans/ HarmonyOS Sans 幻灯片、科技报告用
+└── fontawesome/ Font Awesome 简历的图标符号
+```
-## 历史沿革
+### 怎么引用字体
-`幻灯片/` 与 `科技报告/` 此前分别维护在两个独立仓库(`ouc-slide-latex-template`、`ouc-report-latex-template`),2026-10 起**并入本仓库统一维护**,两个旧仓库不再更新。迁入时保留了原有目录结构、字体与图片资源,旧仓库的提交历史留在原仓库中。
\ No newline at end of file
+两行固定写法,放在 `\documentclass` 之后、`\begin{document}` 之前:
+
+```latex
+\documentclass[UTF8,fontset=none]{ctexart}
+\input{../fonts.tex}
+\begin{document}
+```
+
+- `fontset=none` 必须写。不写的话 ctex 会先按系统字体配一套。
+- `../fonts.tex` 是**相对模板目录**的路径,所以在模板目录内编译。
+- 不要在仓库根直接 `xelatex 课程大纲/课程大纲.tex`,`../` 会指错。
+
+`fonts.tex` 可以重复引用,多个 sty 各自引用不会冲突。
+
+### 可用的字体命令
+
+`\input{../fonts.tex}` 之后可以用这些命令随时切换字族:
+
+| 命令 | 效果 | 实际字体 |
+|---|---|---|
+| `\songti` | 中文宋体 | OUC Serif |
+| `\heiti` | 中文黑体 | OUC Sans |
+| `\kaiti` | 中文楷体 | OUC Kai |
+| `\fangsong` | 中文仿宋 | Zhuque Fangsong |
+| `\tnr` | 西文衬线 | TeX Gyre Termes |
+| `\tnrb` | 西文衬线粗体 | TeX Gyre Termes Bold |
+| `\hm` | 鸿蒙黑体(中文) | HarmonyOS Sans SC |
+| `\hmlatin` | 鸿蒙黑体(西文) | HarmonyOS Sans |
+| `\oucUseCochineal` | 正文西文换成 Cochineal | Cochineal |
+
+默认正文:中文 OUC Serif + 西文 TeX Gyre Termes。
+
+用法示例:
+
+```latex
+{\heiti 这段用黑体}
+{\kaiti 这段用楷体}
+```
+
+### 换正文西文字体
+
+```latex
+\input{../fonts.tex}
+\oucUseCochineal % 正文西文改为 Cochineal
+```
+
+只有 `简历/` 用这个,其余模板保持 Termes。
+
+## 环境要求
+
+- TeX Live 2022 或更新
+- 编译引擎固定 **XeLaTeX**,不能用 pdfLaTeX 或 LuaLaTeX
+- 不需要装 CTeX 套装,不需要系统装中文字体
+
+## 新增模板
+
+1. 建目录,放 `.tex` 主文件 + `.sty` 版式包
+2. 导言区写 `\documentclass[UTF8,fontset=none]{ctexart}` + `\input{../fonts.tex}`
+3. 编译确认 `bash build.sh 你的模板名`
+4. 把模板加进 `verify_all.sh` 的 `TARGETS` 列表
+5. 写 `README.md`,格式参考现有模板
+
+## 约定
+
+- 页面 A4,唯 `幻灯片/` 为 16:9
+- 表格类模板正文 12pt,`教材/` 为 10pt
+- 中文正文用宋体,标题用黑体
+- 示例内容全部是虚构数据(虚构教师、虚构课程、统一用 `example.net` 邮箱与 `138 0000 0000` 手机号),替换成自己的内容即可
\ No newline at end of file
diff --git a/fonts/README.md b/fonts/README.md
index ab786e5..45ee805 100644
--- a/fonts/README.md
+++ b/fonts/README.md
@@ -1,327 +1,110 @@
-# fonts/ —— 模板库公共字体目录
+# fonts/ — 公共字体目录
-本目录是**中国海洋大学 LaTeX 模板库唯一的一份字体来源**。仓库里十一个模板全部通过
-根目录的 [`../fonts.tex`](../fonts.tex) 取字体,不再有任何模板自带字体、也不依赖
-操作系统里装了什么字体。换一台机器、换一个操作系统(Windows / macOS / Linux /
-Overleaf),编译出来的样子都一样。
+全库共用的字体目录。16 个模板都通过根目录的 [`../fonts.tex`](../fonts.tex) 取字体,
+不依赖操作系统装了什么字体。
+
+## 目录内容
```
fonts/
-├── ouc-serif/ OUC Serif 宋体(衬线正文) 2 个,9.7 MB
-├── ouc-sans/ OUC Sans 黑体(无衬线标题) 2 个,7.0 MB
-├── ouc-kai/ OUC Kai 楷体 2 个,7.0 MB
-├── zhuque-fangsong/ Zhuque Fangsong 仿宋 1 个,8.4 MB
-├── tex-gyre-termes/ TeX Gyre Termes 西文 Times 等价 4 个,550 KB
-├── cochineal/ Cochineal 西文 Minion 风格 4 个,920 KB
-├── harmonyos-sans/ HarmonyOS Sans 鸿蒙(中英各一档) 6 个,16 MB
-└── fontawesome/ FontAwesome 简历模板的图标符号 1 个,130 KB
+├── ouc-serif/ OUC Serif 中文宋体(衬线正文) 2 个
+├── ouc-sans/ OUC Sans 中文黑体(无衬线标题) 2 个
+├── ouc-kai/ OUC Kai 中文楷体(代斜体) 2 个
+├── zhuque-fangsong/ Zhuque Fangsong 中文仿宋 1 个
+├── tex-gyre-termes/ TeX Gyre Termes 西文衬线(Times 等价) 4 个
+├── cochineal/ Cochineal 西文衬线(Minion 风格) 4 个
+├── harmonyos-sans/ HarmonyOS Sans 幻灯片、科技报告用 6 个
+├── fontawesome/ Font Awesome 简历的图标符号 1 个
+└── LICENSE 授权说明
```
-合计约 **50 MB**(改造前是 141 MB:幻灯片 49 MB + 科技报告 92 MB 各自带一份,
-外加两套重复的字体。现在全库只有这一份,省掉 65%)。
+## 各字体用途
----
+| 字体 | 用途 | 字重 | 字符集 |
+|---|---|---|---|
+| OUC Serif | 中文正文(宋体) | 常规 + 粗体 | GB2312,7555 字 |
+| OUC Sans | 中文标题(黑体)、西文无衬线 | 常规 + 粗体 | GB2312,7555 字 |
+| OUC Kai | 中文楷体,代斜体 | 常规 + 粗体 | GB2312,7557 字 |
+| Zhuque Fangsong | 中文仿宋 | 仅常规 | 12882 字,GB2312 全覆盖 |
+| TeX Gyre Termes | 西文正文(Times 等价) | 常规 / 粗 / 斜 / 粗斜 | 完整拉丁 |
+| Cochineal | 西文正文(Minion 风格) | 常规 / 粗 / 斜 / 粗斜 | 完整拉丁 |
+| HarmonyOS Sans | 幻灯片、科技报告 | 中英各三档 | 完整 |
+| Font Awesome | 简历图标符号 | — | 图标集 |
-## 一、为什么要把字体打进仓库
+## 怎么引用
-原先七个模板是两种做法:
-
-| 做法 | 模板 | 问题 |
-|---|---|---|
-| 各自带一份字体 | `幻灯片/`(鸿蒙 18 个文件 49 MB)、`科技报告/`(鸿蒙 + 方正 5 款 92 MB) | 两份重复;字体版本一旦不同步,两个模板的样子就会不一致 |
-| 直接用系统字体 | 其余五个(SimSun / SimHei / FangSong / KaiTi / Times New Roman) | 换台机器(Linux、macOS、精简版 Windows、Overleaf)直接编不出来;而且这些字体**不允许随仓库分发** |
-
-统一成一份公共字体后:
-
-- **编译结果可复现** —— 与操作系统、与是否装过某款字体无关。
-- **授权干净** —— 全库不含任何商业字体,见第四节。
-- **体积可控** —— 只保留实际用到的字重与字符集。
-
----
-
-## 二、各字体的来源与授权
-
-全部为**开源或官方允许免费商用**的字体。逐项如下。
-
-### 1. OUC Serif / OUC Sans / OUC Kai —— 思源系列与霞鹜文楷的子集
-
-| | 上游字体 | 上游作者 | 上游授权 | 字符集 |
-|---|---|---|---|---|
-| OUC Serif | 思源宋体 SC(Source Han Serif SC) | Adobe | SIL OFL 1.1 | GB2312,7555 字 |
-| OUC Sans | 思源黑体 SC(Source Han Sans SC) | Adobe | SIL OFL 1.1 | GB2312,7555 字 |
-| OUC Kai | 霞鹜文楷(LXGW WenKai) | LXGW | SIL OFL 1.1 | GB2312,7557 字 |
-
-> **为什么改名叫 OUC Serif / OUC Sans / OUC Kai?**
-> SIL OFL 1.1 第 3 条规定:修改版不得使用上游的 Reserved Font Name。
-> 思源系列的 RFN 是 `Source`,霞鹜的 RFN 含 `LXGW`。裁剪字符集属于
-> "修改版",因此必须改名,且不得暗示原作者为本仓库背书。
-> 改名同时改了 **CFF 层**的 `fontNames` / `FamilyName` / `FullName`
-> —— 只改 name 表是不够的,PDF 里内嵌的字体名取的是 CFF 层。
-> 字体 name 表的 13/14 号记录保留了完整 OFL 声明与"本字体为子集、
-> 与上游作者无关"的免责说明。
-
-**裁剪范围**:保留 GB2312 全集(6763 汉字)+ 常用标点 + 拉丁字母 + 希腊字母
-+ 数学符号,约 7555 个字符。**不保留** GBK 扩展区与生僻字。
-
-> ⚠️ 如果将来正文要用 GB2312 之外的生僻字(例如某些人名、地名用字),
-> 会显示成空白或方框。此时需要重新生成子集,把该字加进去。
-> 生成脚本见第七节。
-
-### 2. Zhuque Fangsong —— 朱雀仿宋
-
-| | |
-|---|---|
-| 上游 | 朱雀仿宋(TrionesType / Zhuque Fangsong) |
-| 授权 | SIL OFL 1.1 |
-| 字符集 | 12882 字符,**GB2312 全集覆盖** |
-| 版本 | 0.212(technical preview) |
-
-未做裁剪(原文件 8.4 MB 已经够小,且保留全集更安全)。
-**只有常规一档,没有粗体** —— 需要粗体的地方请改用黑体或宋体。
-
-### 3. TeX Gyre Termes —— 西文 Times 等价字体
-
-| | |
-|---|---|
-| 上游 | TeX Gyre Termes(GUST 字体项目) |
-| 授权 | GUST Font License(GPL + 字体嵌入例外) |
-| 特性 | 与 Times New Roman **逐字度量兼容** |
-
-用它是为了保证中文模板里原有的西文断行、表格列宽、行内公式对齐不漂移。
-实测同一段英文,Termes 与 Times New Roman 的逐词宽度差在 0.03pt 量级。
-
-**全库默认西文字体就是 Termes**(`fonts.tex` 的 `\setmainfont`)。除简历外的
-10 个模板都用它。
-
-### 3b. Cochineal —— 西文 Minion 风格(简历专用)
-
-| | |
-|---|---|
-| 上游 | Cochineal(Michael Sharpe,据 Minion 设计) |
-| 授权 | SIL OFL 1.1,可随仓库分发(`cochineal/OFL.txt`) |
-| 特性 | 笔画比 Times 饱满,与思源宋体灰度更接近 |
-
-**为什么加这一款**:中文用思源宋体(中等粗细),Termes 是 Times 的度量兼容替代,
-笔画偏细偏紧,中英混排时西文那一段视觉上会「陷进去」。Cochineal 笔画更饱满。
-
-**为什么只有简历用**:它的宽度与 Termes 只差 **1.9%**(225.42 vs 229.68pt @10pt),
-断行位置基本不动,所以换过去风险最小。其余候选宽 2.2%~10.8%,会把全库的表格列宽
-和断行推着变(数据见 `字体` 一节末尾的对照表)。
-
-⚠️ **不是全局生效**。`fonts.tex` 里只做了声明:
+在模板的导言区写两行:
```latex
-\oucUseCochineal % 调它才切;不调就还是 Termes
+\documentclass[UTF8,fontset=none]{ctexart}
+\input{../fonts.tex}
```
-目前只有 `简历/awesome-source-cv.cls` 在 `\AtBeginDocument` 里调用。
+- `fontset=none` 必须写。不写的话 ctex 会先按系统字体配一套。
+- `../fonts.tex` 是**相对模板目录**的路径。所以要在模板目录内编译。
+- 本文件可以重复 `\input`,多个 sty 各自引用不会冲突。
-**度量对照**(10pt 下同一句英文的排印宽度,供将来换字体时参考):
+## 可用的字体命令
-| 字体 | 样句宽 | 相对 Termes | x 高 | cap 高 |
-|---|---|---|---|---|
-| Termes | 229.68pt | 100.0% | 0.450 | 0.662 |
-| **Cochineal** | **225.42pt** | **98.1%** | 0.433 | 0.649 |
-| Libertinus Serif | 234.62pt | 102.2% | 0.433 | 0.649 |
-| XCharter | 246.69pt | 107.4% | 0.481 | 0.671 |
-| TeX Gyre Pagella | 254.40pt | 110.8% | 0.472 | 0.695 |
+`\input{../fonts.tex}` 之后可用:
-### 4. HarmonyOS Sans —— 鸿蒙字体
+| 命令 | 效果 | 实际字体 |
+|---|---|---|
+| `\songti` | 中文宋体 | OUC Serif |
+| `\heiti` | 中文黑体 | OUC Sans |
+| `\kaiti` | 中文楷体 | OUC Kai |
+| `\fangsong` | 中文仿宋 | Zhuque Fangsong |
+| `\tnr` | 西文衬线 | TeX Gyre Termes |
+| `\tnrb` | 西文衬线粗体 | TeX Gyre Termes Bold |
+| `\hm` | 鸿蒙黑体(中文) | HarmonyOS Sans SC |
+| `\hmlatin` | 鸿蒙黑体(西文) | HarmonyOS Sans |
+| `\oucUseCochineal` | 正文西文换成 Cochineal | Cochineal |
-| | |
+默认正文:中文 OUC Serif + 西文 TeX Gyre Termes。
+
+另有两个独立字族,用于直接指定:
+
+| 命令 | 实际字体 |
|---|---|
-| 上游 | HarmonyOS Sans(华为) |
-| 授权 | 华为官方声明允许**免费商用**(随 HarmonyOS 开发者文档发布) |
-| 保留原因 | `幻灯片/` 与 `科技报告/` 原有观感就是鸿蒙,换成思源会明显改变这两个模板的视觉 |
+| `\OUCLatinCochineal` | Cochineal 常规 |
+| `\OUCLatinCochinealBold` | Cochineal 粗体 |
-只保留实际用到的 6 个文件:`HarmonyOS_Sans_{Regular,Bold}`(西文)、
-`HarmonyOS_Sans_{Regular,Bold}_Italic`、`HarmonyOS_Sans_SC_{Regular,Bold}`(中文)。
-原目录里的 Black / Light / Medium / Thin 等 12 个字重全库无人引用,已删除。
+## 改默认字体
-> ⚠️ 鸿蒙字体的文件名用**下划线**分隔(`HarmonyOS_Sans_SC_Regular.ttf`),
-> 不是 `族名-字重` 格式。所以在 fontspec 里不能写 `*-Regular` 通配,
-> 必须显式给完整文件名。
+改 `../fonts.tex` 里的 `\setCJKmainfont`(中文)和 `\setmainfont`(西文)。
-### 5. FontAwesome —— 简历模板的图标符号
+字体文件按 `Path = ../fonts/<目录>/` 定位,所以新增字体要放进对应的子目录。
-| | |
+## 授权
+
+全部允许免费商用和再分发:
+
+| 字体 | 授权 |
|---|---|
-| 上游 | Font Awesome 4.x(原项目 Fonticons, Inc.) |
-| 授权 | SIL OFL 1.1(字体本身)/ CC BY 4.0(图标设计) |
-| 保留原因 | `简历/` 模板的联系方式行用 `\smartphone` / `\email` / `\address` 等命令,每个前缀都要印一个图标 |
-| 版本 | 与 TeX Live 2022 内置的那份逐字节相同(md5 `9f6ff7d7cfd6f76d7a9c242bdd48c144`) |
+| OUC Serif / OUC Sans | SIL OFL 1.1 |
+| OUC Kai | SIL OFL 1.1 |
+| Zhuque Fangsong | SIL OFL 1.1 |
+| TeX Gyre Termes | GUST Font License |
+| Cochineal | SIL OFL 1.1 |
+| HarmonyOS Sans | 华为,官方允许免费商用 |
+| Font Awesome | SIL OFL 1.1 |
-只有 `FontAwesome.otf` 一个文件(130 KB)。TeX Live 里本来就带这份字体,之所以
-还是拷进仓库,是为了守住「字体单一来源」这个约定 —— 否则 `简历/` 就成了唯一一个
-字体来自 TeX Live 安装的模板,换一台没装 fontawesome 宏包用字体的机器就编不出来。
+不含商业字体,无方正、无 SimSun/SimHei/KaiTi/FangSong、无 Times New Roman。
-> ⚠️ 引用它的不是 `fonts.tex`,而是 `简历/fontawesome.sty` 里的
-> `\newfontfamily{\FA}[Path=../fonts/fontawesome/,Extension=.otf]{FontAwesome}`。
-> 原因:`\FA` 是在 `\RequirePackage{fontawesome}` 时就被定义好的(早于 `.cls`
-> 后面所有语句),`awesome-source-cv.cls` 里再声明一次会报 `Font \FA already
-> defined`;所以只能改 `fontawesome.sty` 本体。
+用本模板编译出的文档不受字体授权约束,版权归作者本人。
----
+## 字符集限制
-## 三、字体是怎么被调用的
+OUC Serif / Sans / Kai 只含 **GB2312** 字符(6763 汉字 + 常用标点 + 拉丁 + 希腊 + 数学符号)。
-所有模板都只做一件事:在导言区 `\input{../fonts.tex}`(幻灯片与科技报告因为
-目录层级不同,路径略作调整)。`fonts.tex` 负责:
+超出 GB2312 的生僻字(部分人名、地名用字)会显示成空白或方框。
+遇到这种情况,用 Zhuque Fangsong(12882 字,覆盖更广)或换用其他字体。
-1. 加载 fontspec / xeCJK;
-2. 注册默认族与 `\songti` / `\heiti` / `\kaiti` / `\fangsong` / `\kaishu` /
- `\tnr` / `\tnrb` / `\hm` / `\hmlatin`;
-3. 把 `×` `—` `□` `○` `√` 等「长得像西文、其实该走中文」的符号
- 归入 CJK 字符类(详见该文件的注释);
-4. 提供 `\ouclinespread` 行距工具。
+## 新增字体
-各模板自己**不再写任何** `\setCJKmainfont` / `\setmainfont`。
+1. 把字体文件放进 `fonts/新字体/`
+2. 在 `../fonts.tex` 里加 `\newfontfamily` 或 `\setCJKfamilyfont`
+3. 用 `Path = ../fonts/新字体/` 定位
-### ⚠️ 三个容易踩的坑(都写在 fonts.tex 的注释里了)
-
-1. **必须保留 `fontset=none`。**
- `\documentclass[UTF8,fontset=none]{ctexart}`。不写的话 ctex 会先按系统字体
- 配一套(Microsoft YaHei / SimSun / FangSong),再被覆盖,既浪费又有平台
- 依赖。`试卷/ouckey.sty` 因为继承 ctexart 默认 fontset,所以 fonts.tex 里
- 用 `\setCJKfamilyfont` + `\def` 而不是 `\newCJKfontfamily`——
- 后者是 LaTeX3 的 `\NewDocumentCommand`,命令已存在时会报
- `! LaTeX3 Error: Control sequence \songti already defined.` 并中断编译。
-
-2. **`Path=` 是相对编译时的工作目录,不是相对 .sty 文件。**
- 模板目录下 `xelatex xxx.tex`,所以写 `../fonts/...`。
- 幻灯片与科技报告的主题文件虽然在子目录里,路径仍按工作目录写 `../fonts/`。
-
-3. **`Path=` 不能写宏。** 它是 fontspec 的参数,必须给字面字符串。
-
----
-
-## 四、授权合规自查
-
-- [x] 全库不含方正、SimSun、SimHei、KaiTi、FangSong、Times New Roman、
- Microsoft YaHei 等不可分发的商业字体。
-- [x] 思源系列与霞鹜文楷的**子集**已改名,符合 OFL 1.1 §3(Reserved Font Name)。
-- [x] 子集保留了 OFL 全文(name 表 13/14 号记录),符合 OFL 1.1 §1(随附授权)。
-- [x] 改名后的 name 表写明"本字体为子集,与上游作者无关",未暗示背书。
-- [x] TeX Gyre Termes 为 GUST Font License,允许随文档分发。
-- [x] HarmonyOS Sans 为华为官方允许免费商用。
-- [x] 本目录的 [LICENSE](LICENSE) 汇总了各字体的授权原文出处。
-
-> **注意**:OFL 要求"以 OFL 字体排版产生的文档"不受 OFL 约束
-> (§5 文档本身不因此被感染)。所以用本模板编译出来的论文、报告、
-> 试卷,版权完全属于作者,不受这些字体授权的影响。
-
----
-
-## 五、体积
-
-```
-改造前(字体分散在各模板目录)
- 幻灯片/fonts/ 49 MB
- 科技报告/font/ 92 MB
- 合计 141 MB
-
-改造后(统一到 fonts/)
- ouc-serif 9.7 MB
- ouc-sans 7.0 MB
- ouc-kai 7.0 MB
- zhuque-fangsong 8.4 MB
- tex-gyre-termes 0.55 MB
- cochineal 0.92 MB
- harmonyos-sans 16.4 MB
- 合计 50 MB (省 65%)
-```
-
----
-
-## 六、当前各模板的字体对应关系
-
-| 模板 | 中文正文 | 中文标题/强调 | 西文 |
-|---|---|---|---|
-| `试卷归档封面/` | OUC Serif | OUC Sans | TeX Gyre Termes |
-| `年度考核登记表/` | OUC Serif | OUC Sans | TeX Gyre Termes |
-| `劳务发放说明表/` | OUC Serif | OUC Sans | TeX Gyre Termes |
-| `课程执行大纲/` | OUC Serif | OUC Sans | TeX Gyre Termes |
-| `试卷/` | OUC Serif / OUC Kai | OUC Sans | TeX Gyre Termes |
-| `简历/` | OUC Serif / OUC Kai | OUC Serif Bold | **Cochineal** |
-| `幻灯片/` | HarmonyOS Sans SC | HarmonyOS Sans SC Bold | HarmonyOS Sans |
-| `科技报告/` | OUC Serif | OUC Serif Bold / OUC Kai | HarmonyOS Sans |
-
-「改造前」用的是:SimSun / SimHei / KaiTi / FangSong / Times New Roman(前五个模板),
-鸿蒙 + 方正书宋/小标宋/楷体/仿宋/中等线(科技报告)。
-
----
-
-## 七、如何重新生成子集
-
-如果需要把 GB2312 之外的字加进来,或上游字体发了新版:
-
-```bash
-# 依赖:pip install fonttools
-python -c "import fontTools; print(fontTools.version)"
-
-# 1) 裁剪(name_IDs 必须给 '*',否则会丢掉 OFL 声明的 13/14 号记录)
-python - <<'PY'
-from fontTools import subset
-opts = subset.Options()
-opts.name_IDs = ['*'] # 关键:默认只取 0..6,会丢授权声明
-opts.name_languages = ['*']
-opts.notdef_outline = True
-opts.recalc_bounds = True
-opts.layout_features = ['*']
-font = subset.load_font('上游字体.otf', opts)
-subsetter = subset.Subsetter(options=opts)
-subsetter.populate(text=open('keep_gb2312.txt', encoding='utf-8').read())
-subsetter.subset(font)
-subset.save_font(font, '裁剪后.otf', opts)
-PY
-
-# 2) 改 CFF 层名字(只改 name 表不够!PDF 内嵌名取的是 CFF 层)
-python - <<'PY'
-from fontTools.ttLib import TTFont
-f = TTFont('裁剪后.otf')
-cff = f['CFF '].cff
-cff.fontNames[0] = 'OUCSerif-Regular'
-td = cff.topDictIndex[0]
-td.FamilyName = 'OUC Serif'
-td.FullName = 'OUC Serif Regular'
-# name 表同步改,并补 13/14 号授权记录与免责声明
-f.save('OUCSerif-Regular.otf')
-PY
-```
-
-改完务必验证 PDF 里内嵌的确实是新名字:
-
-```python
-import pymupdf
-d = pymupdf.open('输出.pdf')
-print({f[3] for p in d for f in p.get_fonts()})
-# 期望看到 OUCSerif-Regular / OUCSans-Regular,而不是 SourceHanSerifSC
-```
-
----
-
-## 八、字体清单速查
-
-| 文件 | 内部族名 | 字符数 | 大小 |
-|---|---|---|---|
-| `ouc-serif/OUCSerif-Regular.otf` | OUC Serif | 7555 | 4.6 MB |
-| `ouc-serif/OUCSerif-Bold.otf` | OUC Serif | 7555 | 4.8 MB |
-| `ouc-sans/OUCSans-Regular.otf` | OUC Sans | 7555 | 3.4 MB |
-| `ouc-sans/OUCSans-Bold.otf` | OUC Sans | 7555 | 3.4 MB |
-| `ouc-kai/OUCKai-Regular.ttf` | OUC Kai | 7557 | 3.4 MB |
-| `ouc-kai/OUCKai-Bold.ttf` | OUC Kai | 7557 | 3.4 MB |
-| `zhuque-fangsong/ZhuqueFangsong-Regular.ttf` | Zhuque Fangsong | 12882 | 8.4 MB |
-| `tex-gyre-termes/texgyretermes-regular.otf` | TeX Gyre Termes | 1053 | 141 KB |
-| `tex-gyre-termes/texgyretermes-bold.otf` | TeX Gyre Termes | 1053 | 139 KB |
-| `tex-gyre-termes/texgyretermes-italic.otf` | TeX Gyre Termes | 1053 | 141 KB |
-| `tex-gyre-termes/texgyretermes-bolditalic.otf` | TeX Gyre Termes | 1053 | 144 KB |
-| `cochineal/Cochineal-Roman.otf` | Cochineal | 1237 | 227 KB |
-| `cochineal/Cochineal-Bold.otf` | Cochineal | 1255 | 228 KB |
-| `cochineal/Cochineal-Italic.otf` | Cochineal | 1186 | 228 KB |
-| `cochineal/Cochineal-BoldItalic.otf` | Cochineal | 1198 | 219 KB |
-| `harmonyos-sans/HarmonyOS_Sans_Regular.ttf` | HarmonyOS Sans | 874 | 147 KB |
-| `harmonyos-sans/HarmonyOS_Sans_Bold.ttf` | HarmonyOS Sans | 874 | 146 KB |
-| `harmonyos-sans/HarmonyOS_Sans_Regular_Italic.ttf` | HarmonyOS Sans | 807 | 141 KB |
-| `harmonyos-sans/HarmonyOS_Sans_Bold_Italic.ttf` | HarmonyOS Sans | 807 | 141 KB |
-| `harmonyos-sans/HarmonyOS_Sans_SC_Regular.ttf` | HarmonyOS Sans SC | 29063 | 8.3 MB |
-| `harmonyos-sans/HarmonyOS_Sans_SC_Bold.ttf` | HarmonyOS Sans SC | 29063 | 8.2 MB |
\ No newline at end of file
+多个档位(常规/粗体/斜体)在不同目录时,每个档位要单独写 `Path`
+和 `Extension`,不能只靠主选项继承。
\ No newline at end of file
diff --git a/会议预算表/README.md b/会议预算表/README.md
index c6c07b3..7931654 100644
--- a/会议预算表/README.md
+++ b/会议预算表/README.md
@@ -1,198 +1,91 @@
# 会议预算表
-中国海洋大学会议预算表 LaTeX 模板(空表,可印刷手填)。
-
-## 来源
-
-用户从微信收到的 `会议预算表.doc`(51712 字节,**OLE2 老式 .doc**,
-`D0CF11E0` 签名,不是伪装成 .doc 的 docx)。
-
-python-docx 读不了老格式,处理链路是:
-
-```
-.doc --(LibreOffice headless)--> .docx --(python-docx)--> 结构
-```
-
-```bash
-soffice --headless --convert-to docx --outdir . 会议预算表.doc
-```
+中国海洋大学会议经费预算表,A4 单页,空表可直接印刷手填。
## 编译
```bash
cd 会议预算表
-xelatex 会议预算表.tex # 单次即可,无交叉引用
+xelatex 会议预算表.tex
```
或仓库根:`bash build.sh 会议预算表`
## 文件
-| 文件 | 作用 |
+| 文件 | 说明 |
|---|---|
-| `oucmeeting.sty` | 版式包(页面、字体、表格环境 + 全部合并规则) |
-| `会议预算表.tex` | 空表正文(只有内容,无任何 `\SetCell`) |
-| `README.md` | 本文件 |
-
-## 版式参数(实测)
-
-```
-页面 A4 210 × 297 mm
-边距 top 38.01 / bottom 35.01 / left 28.01 / right 26.00 mm
-版心 155.99 × 223.98 mm
-字号 标题 22pt,表格与说明 9pt
-表格 28 行 × 7 列,边框 0.5pt,行高 5.6mm
-```
-
-四个边距都不常见,是原表为把 28 行塞进一页压出来的。照抄,不"优化"。
+| `会议预算表.tex` | 主文件,填内容改这里 |
+| `oucmeeting.sty` | 版式包,一般不改 |
## 表格结构
-7 列基准网格,原 docx 的 `tblGrid` 是
-`[424, 2054, 790, 1262, 2056, 209, 2793]` twips = 169.12mm,
-比分宽出版心 13.12mm(原文件靠 fixed 布局硬撑、压进页边距)。
+28 行 × 7 列,分四段:
-→ 本模板等比缩到版心内,列宽
-`[7.48, 36.23, 13.93, 22.26, 36.27, 3.69, 49.27] × 0.9224`。
-
-28 行合并结构:
-
-| 行 | 内容 | 跨度 |
+| 区段 | 行 | 内容 |
|---|---|---|
-| 1 | 会议名称 | 2+5 |
-| 2 | 会议时间 / 会议地点 | 2+2+2+1 |
-| 3 | 会议类型(三选一) | 2+5 |
-| 4 | 参会人数 | 2+5 |
-| 5 | 会议支出项目卡号 | 2+5 |
-| 6 | 会议内容 | 2+5 |
-| 7 | **会议收入预算**(分节) | 跨 7 |
-| 8 | 收入项目 / 经费卡号 / 金额 / 备注 | 2+2+2+1 |
-| 9~13 | 会务费收入 / 科研经费 / 财政拨款专项 / 学校预算 / 其他 | 2+2+2+1 |
-| 14 | 合计 | 2+2+2+1 |
-| 15 | **会议支出预算**(分节) | 跨 7 |
-| 16 | 支出项目 / 预算金额 / 实际支出 | 3+2+2 |
-| 17~20 | 专家咨询费 / 城市间交通费 / 住宿费 / 伙食费 | 3+2+2 |
-| 21~25 | **其他费用**(竖排)+ 交通费 / 印刷费 / 会议室 / 补助 / 其他 | 1+2+2+2 |
-| 26 | 合计 | 3+2+2 |
-| 27 | 意见栏(**独立签字表**,不在主表内) | 3+4 |
-| 28 | 签字栏(同上) | 3+4 |
+| 基本信息 | 1–6 | 会议名称、时间、地点、类型、参会人数、支出项目卡号、会议内容 |
+| 收入预算 | 7–14 | 会务费收入、科研经费、财政拨款专项、学校预算经费、其他、合计 |
+| 支出预算 | 15–26 | 专家咨询费、交通费、住宿费、伙食费、其他费用(交通费/印刷费/会议室/补助/其他)、合计 |
+| 意见签字 | 27–28 | 经费负责人意见、所在单位负责人意见、签字盖章 |
-### ⚠️ 签字栏为什么是独立的表
+## 填写方式
-R27/R28(意见 + 签字)放在主表里**无论怎么写都会出问题**,四种组合全实测过:
+这是**空表模板**,金额、卡号、日期、人名一律留空,打印后手填。
-| 内容段数 | cell 声明 | 结果 |
-|---|---|---|
-| 8 段 | `cell{27}{4}={c=4}` | 右侧多一列(9 条竖线)❌ |
-| 7 段 | `cell{27}{4}={c=4}` | 右侧多一列(9 条竖线)❌ |
-| 2 段 | `cell{27}{4}={c=4}` | 列数对,但第 2 段被合并盖住,内容消失 ❌ |
-| 2 段 | `cell{27}{2}={c=6}` | 网格散架(3 页、横线全无)❌ |
-
-根因是 tabularray 2022A 对「跨整行大合并」处理不稳定,要求
-「内容段数 / cell 起始列 / 跨度」三者严格自洽,在固定列宽 + colsep
-的组合下很难同时满足。
-
-⇒ 改成**物理隔离**:主表只到 R26「合计」(26 行),签字栏用独立的
-`oucmeetsign` 环境紧贴下方。视觉上是同一张表(边框对接、列宽按主表
-3:4 分界配平),排版上互不干扰。
-
-签字表列宽算法(必须按主表实际竖线位置反推,不能自己估):
-```
-主表竖线 79.65 ~ 514.31 = 153.34mm,3:4 分界在 231.89 -> 距左 53.71mm
-签字表 2 列:wd = 53.71-2 = 51.71mm / 153.34-53.71-2 = 97.63mm
-```
-
-## ⚠️ 三个必须知道的坑
-
-### 1. 合并单元格必须用矩阵式语法,不能用 `\SetCell`
-
-在本表的 7 列 `Q[c,m,wd=…]` + `colsep=1.0mm` 配置下,
-一旦在单元格内容里写 `\SetCell[c=n]`,编译立刻报:
-
-```
-! Missing number, treated as zero.
-! Illegal unit of measure (pt inserted.)
-\__dim_eval_end:
-```
-
-**所有错误都定位到 `\end{tblr}`**,完全看不出是哪个格。最小复现:
+要电子填写,在 `.tex` 正文里往对应位置补内容即可。比如会议名称:
```latex
-\begin{tblr}{colspec={Q[c,m,wd=21mm] ...共7列..., colsep=0.8mm}}
- \SetCell[c=2]{c} A & \SetCell[c=5]{l} B \\
-\end{tblr} % 必崩
+会议名称 & 软件需求工程教学研讨会 & & & & & \\
```
-✅ 正确写法 —— 在 tblr 选项里用 `cell{行}{列}={c=n}{对齐}`:
+### 页首信息
```latex
-\begin{tblr}{
- colspec={...},
- cell{1}{1}={c=2}{c},
- cell{1}{3}={c=5}{l},
-}
- A & & B & & & & \\ % 被合并掉的格留空
-\end{tblr}
+\oucmeetattach{附件 1} % 左上角附件编号,不要则写 \oucmeetattach{}
+\oucmeettitle{中国海洋大学会议预算表} % 标题
+\oucmeetdateline{填表日期:... 金额单位:...} % 标题下方一行
```
-被合并掉的格**留空**(写 `& &`),不要写 `{}`。
+### 表尾说明
-好处:合并关系与内容彻底分离,改内容不会破坏结构。
-
-### 2. `\SetCell[r=n]` 与 `\SetCell[c=m]` 不能在同一行
-
-纵向合并和横向合并同时出现,报同样那串错。
-本表因此全部改用 `cell{}` 矩阵语法(含纵向合并 `cell{21}{1}={r=5}{c}`)。
-
-「其他费用」用 `\shortstack{其\\[4bp]他\\[4bp]费\\[4bp]用}` 逐字竖排,
-**不是** `\rotatebox{90}` 旋转——旋转只是把横排整句转个角度,
-不是"上下排列"。
-
-#### 字距必须卡准,否则字会贴格线
-
-合并格高 81.9bp,四字的文字块高度随字距变化(实测数据):
-
-| 字距 | 文字块高 | 上下留白 | 观感 |
-|---|---|---|---|
-| `\\[17bp]` | 94bp | 2.5bp | ❌ 比格还高,字和表格线连成一片 |
-| `\\[8bp]` | 67bp | 7.4bp | ⚠️ 偏挤 |
-| **`\\[4bp]`** | **56bp** | **13.4bp** | ✅ 采用 |
-| 不加参数 | 43bp | 19bp | ⚠️ 字挤成一小团,看不出竖排 |
-
-⚠️ 拉字距不能用局部 `\baselineskip`——`\shortstack` 内部会重置它,
-实测设 19bp 完全无效(字距仍是 11.6bp)。必须在 `\\` 上给可选参数。
-⚠️ 也不能用 `\parbox{}{其\\他\\费\\用}`——那会变成 4 个独立行盒子,
-tabularray 排版错乱,四个字跑到不同段落。
-
-### 3. colspec / hline / vline / ht 的参数不能用宏
-
-tabularray 用自带的展开器解析这些选项,遇到用户宏直接报
-`! Undefined control sequence.`。全部写字面值。
-
-## 页高预算(重要)
-
-28 行 × 行高 + 标题区 + 说明,必须 ≤ 223.98mm:
-
-```
-28 × 5.6mm = 156.8mm
-标题区(附件1 + 22pt 标题 + 日期行)≈ 30mm
-说明 3 条(其中第 2 条两行)≈ 35mm
-合计 ≈ 222mm ✅ 刚好放进一页
+```latex
+\begin{oucmeetnotes}
+ \oucmeetnote{1、}{说明内容}
+ \oucmeetnote{2、}{说明内容}
+\end{oucmeetnotes}
```
-⚠️ 行高 5.6mm 是**下限附近**。若把行高改回 6.0mm,28 行多出 11.2mm,
-第 3 条说明就会被挤到第 2 页。改行高前先算这笔账。
+条目数可增减,「1、」「2、」写在第一个参数里。
-## 验证
+## 表格内改内容
-```
-1 页 error 0 Overfull 0 Underfull 0
-表格 155.52mm,版心 155.99mm → 在界内
-内容 50 项逐项核对,全部存在
-双端一致:WSL TeX Live 2025 / Windows TeX Live 2022
+正文里每行对应表格一行,用 `&` 分列。**每行必须写满 7 段(6 个 `&`)**,
+被合并掉的格子留空:
+
+```latex
+会议时间 & & & & 会议地点 & & \\
```
-## 说明
+合并关系在 `oucmeeting.sty` 的 `cell{行}{列}={c=跨度}{对齐}` 里声明。
+改列宽或改结构时看那里。
-这是**空表**。金额、卡号、日期、人名一律留空,供下载后手填或转 Word 填写。
-不含任何真实数据。
\ No newline at end of file
+### 「其他费用」竖排
+
+四个字竖排、跨 5 行。字距在正文里控制:
+
+```latex
+\shortstack{其\\[4bp]他\\[4bp]费\\[4bp]用}
+```
+
+数值调大则字距拉开、字块变高。格高约 82bp,`4bp` 时上下各留 13bp。
+
+## 版式
+
+```
+A4,边距 上 38.01 / 下 35.01 / 左 28.01 / 右 26.00 mm
+正文 9pt,标题 22pt
+表格 28 行 × 7 列,边框 0.5pt,行高 5.6mm
+```
+
+行高会影响总高度。5.6mm 时刚好一页;改到 6.0mm 会把表尾说明挤到第二页。
\ No newline at end of file
diff --git a/劳务发放说明表/README.md b/劳务发放说明表/README.md
index 142ed4b..b7b453a 100644
--- a/劳务发放说明表/README.md
+++ b/劳务发放说明表/README.md
@@ -1,183 +1,96 @@
-# 劳务发放说明表 — 中国海洋大学 劳务发放说明表(LaTeX 版)
+# 劳务发放说明表
-把实验室用的《劳务发放说明表》Word 版复刻为 LaTeX 模板。版式与原 `.docx`
-逐项对齐,**不含任何真人信息**:姓名、人数、项目名称、单位名称全部是编的。
-
-## 文件
-
-| 文件 | 说明 |
-| :-- | :-- |
-| `劳务发放说明表.tex` | 主文件。填表只改第 1 节(4 个变量) |
-| `ouclw.sty` | 版式包。页面/字体/列宽/行高/全部尺寸写在这里,附换算注释 |
+中国海洋大学劳务费发放说明表,A4 单页。
## 编译
```bash
+cd 劳务发放说明表
xelatex 劳务发放说明表.tex
```
-单页,跑一遍即可(无交叉引用)。
+或仓库根:`bash build.sh 劳务发放说明表`
-需要 **XeLaTeX**,并安装 `ctex`、`geometry`、`fontspec`、`xeCJK`、`tabularray`。
-实测环境:TeX Live 2022 + `tabularray 2022A`。
+## 文件
-## 改内容
+| 文件 | 说明 |
+|---|---|
+| `劳务发放说明表.tex` | 主文件,填内容改这里 |
+| `ouclw.sty` | 版式包,一般不改 |
+
+## 填写参数
+
+全部在 `\begin{document}` 之前定义:
```latex
-\newcommand{\lwunit}{{\songti 信息科学与工程学部}} % 用工单位(学部 / 学院)
-\newcommand{\lwreason}{{\songti 科研项目数据整理}} % 用工事由
-\newcommand{\lwnote}{} % 备注(可留空)
-\newcommand{\lwwork}{%
- 聘请{\songti 李承宇}等{\songti 2}位研究生参与《{\songti 近岸海域生态健康
- 多源数据融合与智能评估技术}》项目的研究工作。}
+\newcommand{\lwunit} {{\songti 信息科学与工程学部}} % 用工单位
+\newcommand{\lwreason}{{\songti 科研项目数据整理}} % 用工事由
+\newcommand{\lwnote} {} % 备注,可留空
+\newcommand{\lwwork}{% % 用工说明正文
+ 聘请{\songti 李承宇}等{\songti 2}位研究生参与……}
```
-上列值是**样张实际用的虚构内容**(人名校验过:`李承宇` 不对应任何真实人员)。
+| 参数 | 说明 |
+|---|---|
+| `\lwunit` | 用工单位(学部/学院) |
+| `\lwreason` | 用工事由 |
+| `\lwnote` | 备注,可留空 |
+| `\lwwork` | 用工说明正文,即表格中「工作内容」一栏 |
-### 关于 `\lwwork` 的句式
+参数值里用 `{\songti ...}` 包裹是为了指定字体,可去掉。
-原文是一句「聘请某研究生等 N 位参与某项目研究工作」的表述 ——
-真人姓名、人数、真实项目名均未保留,**句式一字未动**。
-填表时把这三处换成实际内容即可:
+## 表格结构
-| 样张值 | 含义 | 换成 |
-| :-- | :-- | :-- |
-| `李承宇` | 第一位研究生的姓名 | 真实姓名("等"字后面若只有一人,可删"等 N 位") |
-| `2`(位) | 研究生人数 | 实际人数 |
-| 《`近岸海域…技术`》 | 项目全称 | 真实项目名 |
+| 行 | 内容 |
+|---|---|
+| R0 | 用工单位(盖章) + 单位名称 |
+| R1–R3 | 用工事由 + 工作内容 + 备注 |
+| R4 | 三处签字:批准单位负责人 / 用工单位负责人 / 经办人 |
-> 不是满篇 `×` 的原因:这张表**正文只有一句话**,全打叉的话整页看着像没填完,
-> 也判断不出这句话在该行里排几行。填一句完整的话才知道行高要不要调。
+## 改表格内文字
-## 版式数据来源
+正文在 `\begin{lwtable}` 与 `\end{lwtable}` 之间。每行写满 4 个格子(3 个 `&`)
+加结尾 `\\`。跨度已固定在 `ouclw.sty` 里,不用管。
-全部尺寸从原 `.docx` 的 OOXML 里量出来,换算关系:
-
-- 长度:`mm = twips ÷ 1440 × 25.4`,`pt = twips ÷ 20`
-- 字号:`w:sz` 是半磅值,`sz=28` ⇒ 14 pt
-- 行距:`docGrid linePitch=312` twips ⇒ 15.6 pt
-
-| 项目 | docx 原值 | 换算 |
-| :-- | :-- | :-- |
-| 纸张 | `pgSz 11906×16838` | A4 210×297 mm |
-| 页边距(上下) | `pgMar top/bottom 1361` | 24.01 mm |
-| 页边距(左右) | `pgMar left/right 1797` | 31.70 mm |
-| 表宽 | `tblW 8522` | 150.32 mm |
-| 列宽 c1..c4 | `1384, 1418, 2883, 2837` | 24.41 / 25.01 / 50.85 / 50.04 mm |
-| 单元格内边距(左右) | `tblCellMar 108` | 1.905 mm |
-| 边框 | `tblBorders sz=4` | 0.5 pt |
-| 字号 | `w:sz 28` | 14 pt,宋体 |
-| 行距 | `linePitch 312` | 15.6 pt |
-
-各行行高由**段落数**决定(原表没有 `trHeight`),每段一个行距 15.6 pt:
-
-| 行 | 段数 | 高度 |
-| :-- | :-- | :-- |
-| R0 用工单位 | 2(`用工单位` / `(公章)`) | 31.2 pt = 11.01 mm |
-| R1 用工事由 | 1 | 15.6 pt = 5.50 mm |
-| R2 具体工作 | 9(长句 + 8 空段) | 140.4 pt = 49.53 mm |
-| R3 三方签字 | 4(标签 + 2 空段 + 日期) | 62.4 pt = 22.01 mm |
-| R4 备注 | 2 | 31.2 pt = 11.01 mm |
-| 合计 | | 280.8 pt = 99.06 mm |
-
-### 为什么左右页边距不对称
-
-原表宽 150.32 mm,比 docx 版心(146.68 mm)宽 3.71 mm,而 `tblPr` 里**没有
-`jc`、`tblInd` 又是 0** —— Word 按左对齐处理:表从左边距 31.70 mm 起排,
-右端溢进右侧页边距 3.71 mm。
-
-所以本模板照实复现这个不对称:`left = 31.70mm`、`totalwidth = 150.32mm`,
-右边界自然落到 `210 − 31.70 − 150.32 = 27.98 mm`。**不要**改成左右等边距
-(那样表会整体左移 1.86 mm,与 Word 里看到的位置不符)。
-
-## 四个必须知道的坑
-
-### 1. ctex 的 `\linespread ≈ 1.3` 会吃掉你设的行距
+合并格里的文字**必须用 `\lwfit` 或 `\lwcell` 等定宽盒子包起来**:
```latex
-\fontsize{14}{15.6}\selectfont % \baselineskip = 20.28pt ✗
-\linespread{1}\relax\fontsize{14}{15.6}\selectfont % = 15.60pt ✓
+& \lwcellv{\lwunit\lwblank{1}}
+& \lwcellv{\lwreason}
+& \lwwork\lwblank{8}
```
-`\fontsize` 第二个参数本该直接设定 `\baselineskip`,但 `\selectfont` 时会
-**再乘一次 `\linespread`**。ctex 默认 `\linespread ≈ 1.3`,于是 15.6 pt 被放大
-成 20.28 pt,五行表从 99 mm 涨到 129 mm,`ht=` 也压不住(内容本身就那么高,
-tabularray 只能被动撑开)。
+不包的话,文字比跨列合计更宽时不会折行,会把整表撑出版心。
-本包的对策是 `\lwbodyfont`:
+### 常用盒子命令
+
+| 命令 | 用途 |
+|---|---|
+| `\lwcell{文字}` | 定宽盒子,自动折行 |
+| `\lwcellv{文字}` | 同上,垂直居中 |
+| `\lwfit{跨度}{文字}` | 按指定跨度定宽 |
+| `\lwblank{n}` | 插入 n 个空行位(撑高度) |
+| `\lwstack{...}` | 多行堆叠 |
+| `\lwsign{跨度}{标签}` | 签字栏 |
+| `\lwspanA`…`\lwspanD` | 各格的跨度宽度常量 |
+
+### 签字栏
```latex
-\newcommand{\lwbodyfont}{\linespread{1}\relax\fontsize{14}{15.6}\selectfont}
-\AtBeginDocument{\lwbodyfont}
+\lwsign{\lwspanA}{批准单位负责人签字}
+ & & \lwsign{\lwwc}{用工单位负责人签字}
+ & \lwsign{\lwwd}{经办人签字} \\
```
-`\AtBeginDocument` 那一次不能省——ctex 在 begin document 时会重设 `\linespread`。
+跨度常量 `\lwwa`–`\lwwd` 与 `\lwspanA`–`\lwspanD` 对应各列。
-### 2. 合并格 `{c}` 是不折行的 LR 模式
-
-`cell{r}{c}={c=n}{c}` 的 `{c}` 是 **LR 模式**,不是段落模式:
-
-- 格内文字比所跨各列合计更宽时,它**不折行**,而是把列撑宽、整表超出版心;
-- 合并格里的 `\hsize` **没有**被重设成该跨度宽度,仍是外层版心宽,
- 长文本会按版心折行、冲出格子。
-
-⇒ 合并格里的文字一律包定宽 `\parbox`,本表提供 `\lwcell` / `\lwcellv` /
-`\lwstack` / `\lwsign` 四个入口,`.tex` 里只要有内容就用它们,别裸写。
-
-### 3. 合并格的“内容可用宽”要补回 `2·colsep·(n−1)`
-
-单列的内容宽 = `wd`(左右两半 `colsep` 已被 colspec 扣掉);
-但跨 n 列合并后,**n 列之间的 (n−1) 组内边距会被回收进内容宽**:
+## 版式
```
-内容可用宽 = Σ 所跨各列 wd + 2 · colsep · (n − 1)
+A4,单页
+正文宋体,表格内文字用 \songti 显式指定
```
-漏算的后果很隐蔽:`\parbox` 比真实格宽窄,短文本看不出问题,长文本会
-**提前折行**。本表「批准单位负责人签字」共 9 字 × 14 pt = 44.45 mm,
-而 c1+c2 只有 41.37 mm,就曾被折成「批准单位负责人签」+「字」两行,
-docx 里明明是一行。正确值是 `41.3653 + 2×1.905 = 45.1753mm`。
+## 注意
-### 4. `\parbox[t]` 会让行高超目标
-
-tabularray 给每个单元格垫了 strut,`[t]` 生成的盒子顶部与 strut 顶部相加,
-实测每行白白多出 **3.6 pt**(R0 从 31.67 → 35.26)。
-
-原表 R0C1 / R2C1 之所以“贴顶”,不是靠 `vAlign=top`(它们其实没写 `vAlign`),
-而是靠**段落数把行高填满**(2 段 = 31.2 pt、9 段 = 140.4 pt,正好等于行高)。
-内容高度已等于行高时,`[c]` 居中的结果就等同于贴顶。
-
-⇒ `.tex` 里用 `\lwcellv{内容\lwblank{n}}` 补足段落数,`\parbox` 保持 `[c]`。
-
-## 与 docx 的已知差异
-
-| 项 | docx | 本模板 | 说明 |
-| :-- | :-- | :-- | :-- |
-| 表宽 | 150.319 mm | 150.137 mm | 差 0.18 mm。tabularray 计宽按 n−1 根竖线、画宽按 n 根,系统性差 0.5 pt,为消除 Overfull 微调了列宽 |
-| 行高 | 11.01 / 5.50 / 49.53 / 22.01 / 11.01 mm | 每行 +0.15 mm | 同上,竖线计入行高 |
-| 字体 | 宋体 | OUC Serif(思源宋体子集) | 原用系统 SimSun。现改为仓库公共字体包 `../fonts/`,换机器/换系统都能编,且允许分发 |
-| 标题 | 宋体 14 pt **加粗** | 同 | 字号与正文相同,只靠加粗区分 |
-
-## 校验方法
-
-不用肉眼看 PDF,直接量矢量:
-
-```bash
-pdftocairo -svg 劳务发放说明表.pdf out.svg # 取线条精确坐标
-pdftotext -bbox 劳务发放说明表.pdf out.xml # 取每个字块的坐标
-```
-
-SVG 里解析 ``,按
-「`|Δy|<0.9` 且 `|Δx|>10` = 横线」「`|Δx|<0.9` 且 `|Δy|>2` = 竖线」分类去重,
-即可得到每条线的精确端点。本模板的实测结果:
-
-```
-表宽 150.137 mm (目标 150.319,差 −0.18)
-表左 31.662 mm (目标 31.700,差 −0.04)
-表右 181.799 mm (目标 182.019,差 −0.22)
-R0 11.172 / R1 5.668 / R2 49.646 / R3 22.159 / R4 11.172 mm 全部达标
-```
-
-三个签字格的标签基线完全重合(`rel-top 1.06 pt`),日期行也完全重合
-(`rel-top 47.69 pt`)——这一条是特意做的:合并格与普通列的垂直居中算法
-不同,若不统一包 `\parbox`,第一格会比另两格低 1.55 pt。
\ No newline at end of file
+示例内容为虚构数据,使用时整段替换。
\ No newline at end of file
diff --git a/年度考核登记表/README.md b/年度考核登记表/README.md
index ea74ebf..e130c3a 100644
--- a/年度考核登记表/README.md
+++ b/年度考核登记表/README.md
@@ -1,189 +1,118 @@
-# 年度考核登记表 — 中国海洋大学 教职工年度考核登记表(LaTeX 版)
+# 年度考核登记表
-把学校下发的 Word 版《中国海洋大学教职工年度考核登记表》复刻为 LaTeX 模板,
-版式与原 `.docx` 逐项对齐,**表格里不含任何真人信息**(姓名/职工号/出生年月/
-单位/岗位全部是编的)。
-
-> 样张填的是一份**完整的虚构考核表**:张远航(1985.03,信息科学与工程学部
-> 计算机科学与技术学院,教授三级,中共党员),2025 年度,年度总结写了
-> 思政 / 教学(176 学时)/ 科研(到账 320 万元)/ 人才培养四段。
-> 之所以不写成满篇 `×`,是因为这张表**表格密、字数多**,光看叉号判断不出
-> 行高会不会被内容撑开。虚构内容能直接看出「写这么多字正好排满 2 页」。
-
-## 文件
-
-| 文件 | 说明 |
-| :-- | :-- |
-| `年度考核登记表.tex` | 主文件。填表只改第 1 节(基本信息)与 `\khsummary`(年度总结) |
-| `ouckhtb.sty` | 版式包。页面/字体/列宽/行高/全部尺寸都写在这里,附换算注释 |
+中国海洋大学教职工年度考核登记表,A4 单页。
## 编译
```bash
+cd 年度考核登记表
xelatex 年度考核登记表.tex
-xelatex 年度考核登记表.tex # 跑两遍,第二遍取到正确页码
```
-需要 **XeLaTeX**(用 fontspec + xeCJK),并安装:
-`ctex`、`geometry`、`fontspec`、`xeCJK`、`tabularray`。
+或仓库根:`bash build.sh 年度考核登记表`
-字体不需要安装 —— 全部来自仓库公共字体包 `../fonts/`(由 `../fonts.tex` 加载),
-详见 [`../fonts/README.md`](../fonts/README.md)。**不再依赖系统里的宋体/黑体/仿宋**。
+## 文件
-实测环境:TeX Live 2022 + `tabularray 2022A`。用 LuaLaTeX 理论上也行,但未验证。
+| 文件 | 说明 |
+|---|---|
+| `年度考核登记表.tex` | 主文件,填内容改这里 |
+| `ouckhtb.sty` | 版式包,一般不改 |
-产出 2 页、A4、正反面打印正好。
+## 填写参数
-## 改内容
-
-### 基本信息
+全部在 `\begin{document}` 之前定义:
```latex
-\khtbyear{2025} % 表头“2025 年度”那一行
+\khtbyear{2025} % 考核年度,显示为表外标题的一部分
-\newcommand{\khnum}{0000000} % 职工号
-\newcommand{\khname}{{\fangsong 张远航}} % 姓名
-\newcommand{\khsex}{{\fangsong 男}} % 性别
-\newcommand{\khbirth}{{\fangsong 1985.03}} % 出生年月
-\newcommand{\khdept}{{\fangsong 信息科学与工程学部}} % 单位(学部 / 学院)
-\newcommand{\khsubdept}{{\fangsong 计算机科学与技术学院}} % 系(研究所、实验室、科室)
-\newcommand{\khparty}{{\fangsong 中共党员}} % 政治面貌
-\newcommand{\khtitle}{{\fangsong 教授}} % 现专业技术职务
-\newcommand{\khpost}{{\fangsong 教授三级}} % 所聘岗位
+\newcommand{\khnum} {0000000} % 职工号
+\newcommand{\khname} {{\fangsong 张远航}} % 姓名
+\newcommand{\khsex} {{\fangsong 男}} % 性别
+\newcommand{\khbirth} {{\fangsong 1985.03}} % 出生年月
+\newcommand{\khdept} {{\fangsong 信息科学与工程学部}} % 单位
+\newcommand{\khsubdept} {{\fangsong 计算机科学与技术学院}} % 系/研究所/科室
+\newcommand{\khparty} {{\fangsong 中共党员}} % 政治面貌
+\newcommand{\khtitle} {{\fangsong 教授}} % 现专业技术职务
+\newcommand{\khpost} {{\fangsong 教授三级}} % 所聘岗位
```
-> 上列值是**样张实际用的虚构内容**。职工号 `0000000` 故意留着没编 ——
-> 职工号位数各校各单位不等,编一个反而会误导「照这个位数填」。
->
-> ⚠️ 「出生年月」的**标签**不是写在 `\khbirth` 里,而是单独的
-> `\khbirthlabel`(默认 `出生\par 年月`,折两行)。原因见下文第 0 条:
-> 那一格只有 15.31mm,放不下 4 个 14pt 的字(要 19.68mm)。
-> 想让标签恢复成一行「出生年月」,值就会重新被挤掉。
+| 参数 | 说明 |
+|---|---|
+| `\khtbyear{年}` | 考核年度 |
+| `\khnum` | 职工号 |
+| `\khname` | 姓名 |
+| `\khsex` | 性别 |
+| `\khbirth` | 出生年月 |
+| `\khdept` | 单位(学部/学院) |
+| `\khsubdept` | 系、研究所、实验室、科室 |
+| `\khparty` | 政治面貌 |
+| `\khtitle` | 现专业技术职务 |
+| `\khpost` | 所聘岗位 |
-> **`{\fangsong ...}` 不能去掉。** 占位符 `×` 是 U+00D7,xeCJK 默认按 Unicode
-> 区段把它判成**西文**,交给 fontspec 的西文字体(Termes/Times),而那儿的
-> `×` 宽度与汉字不一致,几个就能撑破整列。
->
-> **更好的做法**:`../fonts.tex` 里已经全局加了
-> `\xeCJKDeclareCharClass{CJK}{"00D7}`,把 `×` 归入 CJK 字符类 ——
-> 于是它自动按汉字全角宽度排,**不必再包 `\fangsong` 也不会撑破**。
-> 这是本次字体改造顺带修掉的老 bug(原注释的修法从未真正生效过)。
+参数值里的 `{\fangsong ...}` 是指定字体,可去掉换成其他字族。
-### 年度总结
+## 年度总结正文
```latex
\newcommand{\khsummary}{%
- 第一段……\par
- 第二段……\par
- 第三段……}
+ 第一段内容。\par
+ 第二段内容。\par
+ 第三段内容。}
```
-段间用 `\par`(不要用空行 —— 空行在 `\newcommand` 参数里会被当成分段但不易数)。
-首行自动缩进 2 字,末行自动带「本人签名 / 年 月 日」,都写在 `ouckhtb.sty` 里。
+多段之间用 `\par` 分隔,不要留空行。
-## 版式数据来源
+## 表格结构
-所有尺寸都从 `.docx` 内部的 OOXML 数值换算,不使用目测:
+| 区段 | 内容 |
+|---|---|
+| 表头 | 职工号、姓名、性别、出生年月 |
+| 基本信息 | 单位、系、政治面貌、职务、岗位 |
+| 年度总结 | `\khsummary` 的长文本格,竖排标题 |
+| 考核结果 | 三级选择与签字 |
+| 签名栏 | 本人签字、单位意见、学校意见 |
-```
-twips → mm : mm = twips / 1440 × 25.4
-twips → pt : pt = twips / 20 (1 pt = 1/72 in)
-w:sz : 半磅值,÷ 2 即 pt
+## 改表格内文字
+
+正文在表格环境内,每行用 `&` 分列。合并格里的文字**必须用 `\khtbfit`
+包起来**,指定跨度宽度:
+
+```latex
+\SetCell[c=2]{c} \khtbfit{\khtbspanA}{单\hspace{1em}位} & &
+\SetCell[c=3]{c} \khtbfit{\khtbspanB}{\khdept} & & &
```
-| 项 | docx 值 | LaTeX 值 |
-| :-- | :-- | :-- |
-| 纸张 | 11907 × 16840 twips | A4(210 × 297 mm) |
-| 表宽 `tblW` | 8976 twips | 158.33 mm(11 列 + 边框) |
-| 11 个 `gridCol` | 1087 283 1221 1047 284 1105 952 600 870 80 1447 | 见 `ouckhtb.sty` 第 3.1 节 |
-| 正文字号 | `w:sz=28` | 仿宋 14 pt / 行距 15.6 pt |
-| 大标题 | `w:sz=44`,`w:spacing=-14` | 黑体 22 pt / 字距 −0.7 pt |
-| 行高 `trHeight` | 412 460 939 1261 1252 1009 556 1258 1258 | 7.27 / 8.11 / 16.56 / 22.24 / 22.08 / 17.80 / 9.81 / 22.19 / 22.19 mm |
+不包的话文字不会折行,会把表格撑出版心。
-### 页边距为什么不照抄 docx
+### 跨度常量
-docx 是左右各 30 mm 版心(150 mm),但表宽 158.33 mm 比它还宽 8.33 mm,
-Word 是靠 `tblPr/jc=center` 把这张表“压”进页边距里的。
+| 常量 | 对应列 |
+|---|---|
+| `\khtbspanA` … `\khtbspanH` | 各格的跨度宽度 |
+| `\khtbwa` … `\khtbwk` | 各列宽度 |
-本模板把页边距改成 `(210 − 158.33)/2 = 25.835 mm`,使 `\textwidth` 恰好等于表宽:
+### 其他常用命令
-- 表格天然居中,不需要 `\leftskip` / `\centerline` 之类的偏移;
-- **表格在纸面上的绝对位置与 Word 完全一致**(左右各 25.835 mm);
-- 编译时不会刷 `Overfull \hbox`。
+| 命令 | 用途 |
+|---|---|
+| `\khtbtitle` | 印表外标题(含年度) |
+| `\khtbcell{文字}` | 定宽盒子 |
+| `\khtbvert{标题}` | 竖排格标题(用于年度总结格) |
+| `\khtbunderline{n}` | 下划线空行 |
+| `\khtbchoices` | 考核结果的三级选项 |
+| `\khtbseal` | 盖章位 |
+| `\khtbsign` | 签字位 |
+| `\khtbsummarysign` | 年度总结格下方的签字 |
+| `\khtbstack{...}` | 多行堆叠 |
+| `\khtbxi` | 系/研究所一栏的值 |
-表外文字(标题、脚注)仍是水平居中,视觉上与 30 mm 版心没有差别。
+## 版式
-## 排版时的坑(sty 里都有详细注释)
-
-0. 🔴 **表头 `cell{r}{c}={c=n}` 会静默丢内容 —— 已全部改成行内 `\SetCell`。**
- 这是本模板最难查的一个 bug:某个格子的值**整格不显示**,日志零 error 零
- warning,光看日志和 PDF 页码完全发现不了。
-
- - 现象:「出生年月」的值一直是空白。用 `××××.××` 占位时也是空白,
- 所以原版一直没人发现;换成真实内容才暴露。
- - 根因:`cell{r}{c}` 里那个 `c` 是**数据行的单元序号**,不是视觉列号。
- 表头那三处 `c=2` 加起来要求该行吃掉 15 个视觉列,而表只有 11 列,
- 超出部分被静默丢弃 —— 丢的正好是最后一个值。
- - 迷惑点:同一行写 12 格 → 丢值;写 10 格 / 9 格 → **反而显示**
- (空缺给了它余量)。所以「格子数对不对」在这里完全不能当判断依据。
- - 正解:表头不写 `cell{}`,合并直接标在被合并的那格上:
- `\SetCell[c=2]{c} 职工号 & & 0000000 & ...`,每行照常写满 11 格。
- - 附带修的:这个表 R0 行本来就装不下 —— 前六个字段已占 115.76mm,
- 剩 42.20mm 要装「出生年月」标签(19.68mm)+ 值(17.22mm),
- 但列宽被 `c9=15.31 / c10=1.38 / c11=25.51` 切死,标签占不住 c9
- 只能整体右移,值就被挤出去。处理是把标签折成两行「出生 / 年月」
- (每行 9.84mm 放得下),值回到 c10-c11。**列宽一个都没改。**
-
-1. **合并单元格不折行。** 合并格的单元类型 `{c}` 是 LR 模式,
- 格子里的文字比所跨各列合计更宽时,它**不折行,而是把列撑宽、整表超出版心**。
- 实测「系(研究所、实验室、科室)」把表从 448 pt 撑到 559 pt。
- → 所以合并格里的文字一律包 `\khtbfit{跨度宽宏}{文字}`。
- 单列的 `Q[c,m,wd=…]` 没有这个问题(超了只是溢出,列宽不变)。
-
-2. **合并格里的 `\hsize` 没被重设。** span=10 的格子里 `\hsize` 仍是整页版心宽,
- 长文本会按 450 pt 折行、冲出格子。→ 长内容必须用定宽 `\parbox`(`\khtbcell`)。
-
-3. **跨度声明写法:`cell{r}{c}={c=n}{c}` 与行内 `\SetCell[c=n]{c}` 都要用
- `{c=n}{c}` 这一种。** `={c=n}`、`={n}{c}`、`={span=n}{c}` 都不认,最后那个
- 会报 `The key 'tblr-cell-span/span' is unknown`。
- ⚠️ 但如第 0 条所述,**跨列请优先用行内 `\SetCell`**,表头 `cell{}` 有丢内容的风险。
-
-4. **`colspec` / `row{}` 里不能放宏。** tabularray 在宏展开之外解析列类型,
- 会报 `Unexpandable command … inside column type`。所以列宽只能字面写死。
-
-另外两个容易忘的:
-
-- `longtblr` 默认会把各列按 `\textwidth` 等比拉伸(`tblr` 不会),必须写 `stretch=0`;
-- `longtblr` 会在续页处印「表 0: (Continued)」,必须用 `\DefTblrTemplate` 把
- `caption` / `capcont` / `conthead-text` / `contfoot-text` **四个模板全清**。
-
-## 与原 docx 的已知差异
-
-| 位置 | docx | 本模板 | 说明 |
-| :-- | :-- | :-- | :-- |
-| 表头「×××× 年度」 | `firstLine` 缩进 2 字、未设居中 | 居中 | 更像原排版疏漏,按意图改居中。想还原就把 `\khtbtitle` 里的 `\centering` 换成 `\hspace*{2\ccwd}` |
-| 「师德考核结果」首列 | `师师德考核结果` | `师德考核结果` | docx 原文首字重复(WPS 竖排遗留),已按正常写法更正 |
-| 「单位年度考核建议档次」首列 | `单单位年度考核建议档次` | `单位年度考核建议档次` | 同上 |
-| 单元格内边距 | 左右各 108 twips(1.905 mm) | 0 | c10 只有 1.41 mm,比两倍内边距还窄,统一内边距会算出负宽。代价是文字可贴竖线,但全部单元格本就水平居中,观感一致 |
-| 未勾选框 | Wingdings `¨`(char 0x00A8) | U+25A1 `□` | Wingdings 在 Linux/macOS 上不可靠。仓库里的仿宋、黑体、宋体都含 `□`;且 `../fonts.tex` 已把 U+25A1 归入 CJK 类,不会再落到不含该字的西文字体上 |
-| 电子签名图片 | 内嵌两张手写签名 JPEG | 无 | 模板不含真人信息 |
-
-## 校验方法(想改版式时照这个验)
-
-不要靠肉眼看 PDF。用矢量坐标对:
-
-```bash
-xelatex 年度考核登记表.tex
-pdftocairo -svg 年度考核登记表.pdf pg.svg # 转成 SVG 取精确线条坐标
-pdftotext -bbox 年度考核登记表.pdf - # 取每个字的 xMin/yMin/xMax/yMax
+```
+A4,单页
+表格行高按原表设定,年度总结格为高行
```
-正确结果应当满足:
+## 注意
-- 表格左边界 73.14 pt、右边界 520.91 pt(宽度 447.8 pt ≈ 157.96 mm);
-- 表格所有横线都是 **10 段**(8 个网格列位置被合并掉,只剩 10 段可见);
-- 页数为 2;
-- `grep "Overfull\|too small" 年度考核登记表.log` 无输出。
-
-当前状态:**零 Overfull、零 Underfull、2 页、表宽 157.96 mm**(目标 158.33 mm,
-差 0.23%,为消除 0.45 pt 的 `Overfull` 累积误差而取整所致,肉眼不可辨)。
\ No newline at end of file
+示例内容为虚构数据,使用时全部替换。签字、日期栏留空手填。
\ No newline at end of file
diff --git a/幻灯片/README.md b/幻灯片/README.md
index 33636dc..5e4e473 100644
--- a/幻灯片/README.md
+++ b/幻灯片/README.md
@@ -1,363 +1,167 @@
-# 中国海洋大学幻灯片LaTex模板
+# 幻灯片
-中国海洋大学幻灯片LaTex非官方模板。
+Beamer 演示文稿,16:9,中国海洋大学配色主题。
-本模板修改自HelmholtzAI模板。在原有模板基础上进行了大量修改。
+## 编译
-模板主要使用海大公布的标准色,包括海大蓝、海大天蓝、海大红、樱缤粉、文脉棕、专金、专银,以及后加的苍松绿、暮山紫、琥珀橙。
+```bash
+cd 幻灯片
+xelatex slides.tex
+xelatex slides.tex % 跑两遍,目录与总页数才正确
+```
-此外,使用了大量的信息框来增加模板的活力。
+或仓库根:`bash build.sh 幻灯片`(自动跑两遍)
-> 本目录原为独立仓库 `ouc-slide-latex-template`,2026-10 起并入 `ouc_latex_template` 统一维护,旧仓库不再更新。
+## 文件
-# 文件结构
+```
+幻灯片/
+├── slides.tex 主文件
+├── oucslide.sty 版式包
+├── theme/ 主题的五个组成部分
+│ ├── beamerthemeOUCSlide.sty
+│ ├── beamercolorthemeOUCSlide.sty
+│ ├── beamerfontthemeOUCSlide.sty
+│ ├── beamerinnerusthemeOUCSlide.sty
+│ └── beamerouterthemeOUCSlide.sty
+├── figs/ 插图
+└── logos/ 校徽等标识
+```
-模板中的文件主要包括:
-
-1. slides.tex:主文件,编写的演示文稿内容主要存放在该文件当中。
-2. oucslide.sty:模板的样式文件。
-3. (字体不在本目录) 全部字体已统一到仓库根 `../fonts/`,由 `../fonts.tex` 统一加载。默认字体仍是华为鸿蒙字体。
-4. theme:主题文件夹。
- 1. beamercolorthemeOUCSlide.sty:颜色定义文件。
- 2. beamerfontthemeOUCSlide.sty:字体定义文件。
- 3. beamerinnerthemeOUCSlide.sty:内部元素定义文件。
- 4. beamerouterthemeOUCSlide.sty:整体布局定义文件。
- 5. beamerthemeOUCSlide.sty:主题定义文件。
-5. logos:模板中使用的Logo存放文件夹。
-6. figs:插入的图片文件夹。
-7. fontawesome.pdf:图标使用说明文件。
-
-# 使用方法
-1. 本模板现为 `ouc_latex_template` 仓库的 `幻灯片/` 子目录,克隆主仓库即可:
- ```bash
- git clone https://code.yangyq.net/laoyang/ouc_latex_template.git
- cd ouc_latex_template/幻灯片
- ```
- 子目录内自包含(`theme/`、`logos/`、`figs/` 都在本目录),只有字体是共享的上层目录 `../fonts/`,不需要额外的宏包搜索路径。
-2. 安装Tex编译器,推荐使用TexLive,安装成功后,可以使用自带的TeXworks打开目录下的tex文件进行编译。
-3. 可以安装其他的IDE工具进行Tex文件的编写和修改,推荐使用Visual Studio Code。
-4. 编译时,请选择XeLaTex,有时候,可能需要连续编译两次,以得到正确的页码和图表编号。
-
-# 编译器版本兼容性
-
-模板已内置**版本自动判别**,同一份源码在 TeX Live 2022 及以后各年份均可直接编译,**不需要改代码、也不需要切分支**。
-
-| TeX Live | beamer 版本 | 状态 |
-|------|-------------|------|
-| 2022 | 3.66 | 已验证通过(本机实测,30 页) |
-| 2023 | 3.69 | 已验证通过 |
-| 2024 | 3.71 | 已验证通过 |
-| 2025 | 3.72 | 已验证通过 |
-| 2026 | 3.77 | 已验证通过 |
-
-> 低于 TeX Live 2022 的版本未做验证,不保证可用。
-
-## 为什么需要版本判别
-
-beamer 的内部实现会随 TeX Live 版本变化,而模板中对内部宏的补丁(`\patchcmd`)会因此失效。最典型的一次是:
-
-- **beamer 3.69(TeX Live 2023)** 起,`\beamer@@frametitle` 改用 `\beamer@insertframetitlecontinuation`,使得面向旧版写法的补丁匹配失败,报 `Patching original frame title failed`。
-- 模板现已加入**版本自动判别**(依据 `\beamer@insertframetitlecontinuation` 是否存在,判断逻辑写在文件顶层 `theme/beamerfontthemeOUCSlide.sty`),因此各年份**不需要再改动源码**。
-- 若将来 beamer 再次改动内部实现,按同样思路在该文件顶层加判别分支即可。
-
-## 关于 `slides.pdf`
-
-仓库内的 `slides.pdf` 是成品样张,用于预览效果。它由**较新版本**的 TeX Live 编译;用本机较旧版本重新编译时,个别页面的装饰层定位可能有细微差别(例如结尾页右下角的网址位置),**正文内容与版式一致性不受影响**。
-
-## 维护约定
-
-每当有新的 TeX Live 年份发布时:
-
-1. 在新版本的 TeX Live 下,用 **XeLaTeX 编译本目录的 `slides.tex`**;
-2. 如果编译不通过,修改 `theme/beamerfontthemeOUCSlide.sty` 顶层的版本判别分支,注意保持向后兼容(不要让新年份的改动破坏旧年份);
-3. 在兼容性表格里补一行,注明已验证通过的版本。
-
-# 元素介绍
## 基本信息
-Tex文件的开头,是基本信息部分,可以根据需要添加`\title`{标题}、`\subtitle`{子标题}、`\author`{作者}、`\date`{\today}、`\institute`{所属机构}。
-`\newcommand{\last}{敬请批评指正!}` 的作用是为了制作最后一页致谢页面而单独设置的,可以修改为任何致谢语句。
-
-## 特殊页面
-
-模板中有三个特殊的页面,分别是:标题页(首页)、目录页和结尾页。这三个页面由于其特殊性,不能使用frame的常规模板,因此,为它们创建了三个命令进行生成:
+```latex
+\documentclass[aspectratio=169,UTF8,t]{beamer}
+\title{中国海洋大学幻灯片LaTex模板}
+\subtitle{助力你的科研梦想}
+\author{张远航}
+\date{\today}
+\institute{计算机科学与技术学院}
+\newcommand{\last}{敬请批评指正!} % 结束语
```
-\maketitle
-\makeoutline
-\makelast
-```
-使用者三个命令后,将会自动创建首页、目录页和结尾页。
-
-首页和结尾页,使用的是基本信息中的数据,而目录页的内容,将根据`\section`进行填充。
-
-## 目录页样式(自适应方框)
-
-目录页默认使用**自适应方框**样式:每一个一级标题(`\section`)被放进一个独立的方框里,**方框的高度、以及方框内文字的字号,都会根据一级标题的数目自动计算**,并且方框会自动均分、铺满整个目录页。章节少时方框又高又大、字号醒目;章节多时方框自动变矮、字号自动缩小,不需要手工调任何一个数字。
-
-方框内的文字**左对齐**,左侧只留一点点缩进,读起来更像一份正常的目录。
-
-
-
-### 配色:默认海大红,蓝色可选
-
-目录页默认使用**海大红**(`oucred`)——和各章节标题页的颜色保持一致。
-
-这是因为目录页上「目录」二字本身是**海大蓝**的,如果目录项再用蓝色,整页就分不出层次。用海大红正好和章节标题页呼应。
-
-如果就喜欢蓝色,改一行即可切回海大蓝:
-
-```
-\toctheme{red} % 默认:海大红,与各章节标题页同色
-\toctheme{blue} % 海大蓝,与目录页标题「目录」同色
-```
-
-
-
-### 三种方框样式
-
-在导言区用一行命令即可切换,样式与配色可以自由组合:
-
-```
-\settocstyle{box} % 默认:浅色底 + 圆角框 + 圆形序号
-\settocstyle{solid} % 实心色底 + 白色文字
-\settocstyle{bar} % 白底 + 左侧粗色条
-```
-
-
-
-
-章节较多时(下面这张是 9 个一级标题),方框和字号会自动压缩:
-
-
-
-### 可调参数
-
-所有参数都可以在导言区用 `\setlength` 覆盖,一般**不需要改**:
-
-| 参数 | 默认值 | 含义 |
-|------|--------|------|
-| `\tocareamargin` | `52pt` | 目录区上下预留的高度(自动模式下从 `\textheight` 中扣除) |
-| `\tocareaheight` | `0pt` | 直接指定目录区高度;`0pt` 表示自动 |
-| `\tocboxgap` | `10pt` | 方框之间的理想间距(空间紧张时会自动压缩) |
-| `\tocboxgapmin` | `2pt` | 方框之间允许的最小间距 |
-| `\tocboxmaxheight` | `110pt` | 单个方框的最大高度 |
-| `\tocboxleftpad` | `2.5pt` | 方框内文字距左边框的距离(只留一点点) |
-| `\tocfontmax` | `26pt` | 方框内文字的最大字号 |
-| `\tocfontwarn` | `8pt` | 字号低于该值时会给出警告 |
-
-例如,希望方框之间更紧凑一些:
-
-```
-\setlength{\tocboxgap}{6pt}
-```
-
-### 几点说明
-
-1. **目录页需要连续编译两次**:章节数目是从上一次编译生成的 `.toc` 文件里读出来的。第一次编译时 `.toc` 还是空的,目录页会是空白,再编译一次即可正常。
-2. 方框的序号和标题是**超链接**,在 PDF 里点击会直接跳到对应章节。
-3. 一级标题**太多时(大约 9 个以上)**,方框和字号会变得偏小,编译日志里会有 `oucslide Warning` 提示。这种情况下建议合并章节,或者把目录页改回普通的列表样式。
-4. 如果确实想换回旧版那种简洁的列表目录,把 `\makeoutline` 里的 `\ouc@toc@body` 换回 `\tableofcontents[hideallsubsections]` 即可(旧的模板定义仍保留在 `beamerouterthemeOUCSlide.sty` 中)。
-
-## 使用分节
-
-本模板使用分节进行整体规划,章节共三级,对应的关键字分别是:
-```
-\section
-\subsection
-\subsubsection
-```
-其中,`\section` 会有单独的页面进行显示。如下图所示。而且,section还将会出现在目录页面中。
-
-`\subsection` 和 `\subsubsection`都没有单独的页面相对应,他们会出现在对应章节的frame中,作为标题进行呈现,并且加入了自动编号的效果。需要说明的是,`\subsection`是必须的,而 `\subsubsection` 却可有可无。他们呈现出的最终的效果,如下图所示。
-
-**需要注意的是,虽然frame的标题,是由subsection和subsubsection自动生成的,但是frame中的frametitle仍然是必须的,否则没有frametitle这个元素,标题无法自动填充。**
-
-## 使用Frame
-章节确定好后,就可以增加Frame来编写幻灯片。使用代码:
-```
-\begin{frame}
- \frametitle{测试}
-\end{frame}
-```
-就可以插入一张幻灯片。
-
-需要注意的是:如果幻灯片中使用了代码块,则需要加入关键字`fragile`。这样,引入的代码才能保持它们原有的样子,如下所示:
-```
-\begin{frame}[fragile]
- \frametitle{测试}
-\end{frame}
-```
-当然,也可以使用定义的特殊的frame模板来达到这种效果。
-```
-\begin{fragileframe}
- \frametitle{测试}
-\end{fragileframe}
-```
-他们的效果是一样的。
-
-## 字体
-模板使用的默认字体是华为鸿蒙字体 (HarmonyOS Sans)。该字体可以免费商用。
-
-如果对字体不满意,可把字体放进仓库根的 `fonts/` 目录,并在 `theme/beamerfontthemeOUCSlide.sty` 中修改。**注意**:`Path=` 是相对编译时工作目录(= `幻灯片/`)的,所以写 `../fonts/xxx/`,不是 `fonts/`。
-
-只保留实际用到的 6 个鸿蒙文件(Regular/Bold 及其 Italic,加 SC Regular/Bold)——原先 `幻灯片/fonts/` 里的 Black / Light / Medium / Thin 等 12 个字重全库无人引用,已随目录一并删除,省下 49 MB。
-
-推荐的字体包括:思源黑体、阿里普惠字体、OPPO字体、小米字体。这些字体基本上都可以免费商用,并且效果都很不错。关于他们是否能够继续免费商用的政策,请查阅其官方网站以得到最准确的信息。
-
-## 颜色
-根据海大公布的标准颜色,定义了相关颜色。其中文名称和代码如下表所示。
-
-当然,也可以使用LaTex自带的颜色,例如white、black等。
-
-| 名称 | 中文名 | 说明 |
-|--------------|--------------|------|
-| oucblue | 海大蓝 | 海大标准色 |
-| ouclightblue | 海大天蓝 | 海大标准色 |
-| oucred | 海大红 | 海大标准色 |
-| ouccherry | 樱缤粉 | 海大标准色 |
-| oucbrown | 文脉棕 | 海大标准色 |
-| oucgolden | 专金 | 海大标准色 |
-| oucsilver | 专银 | 海大标准色 |
-| oucpine | 苍松绿 | 新增,深绿 |
-| oucdusk | 暮山紫 | 新增,深紫 |
-| oucamber | 琥珀橙 | 新增,深橘 |
-
-### 新增的三个颜色
-
-已有的浅色(樱缤粉、专金、专银)在内容多的时候不太够用,因此补充了三个**较深的颜色**——
-深色的好处是**和白色文字有足够的对比度**,可以直接当作色块底色(`pointbox`、`titlebox`、
-`block` 等)使用,不必再担心白字看不清。
-
-| 名称 | 色值 | 白字对比度 | 命名与定位 |
-|------|------|-----------|-----------|
-| `oucpine` | RGB 30, 86, 64 | 8.54 | **苍松绿**——取自传统色「苍松」,色相偏青的深绿,沉静稳重 |
-| `oucdusk` | RGB 92, 58, 118 | 9.04 | **暮山紫**——取自传统色「暮山紫」(暮色中的远山),深紫而不艳 |
-| `oucamber` | RGB 196, 82, 16 | 4.60 | **琥珀橙**——取自传统色「琥珀」,高饱和的深橘 |
-
-三点说明:
-
-1. **琥珀橙和文脉棕不会混淆**:文脉棕是「低饱和的暗褐」,琥珀橙是「高饱和的深橘」,
- 两者在饱和度上拉开了明显差距(色相接近,但饱和度 0.61 vs 0.98)。
-2. 三个新颜色**同样带十个色阶**(`oucpine10` ~ `oucpine90` 等),浅色等级可以当背景底。
-3. 对比度按 WCAG 计算,**≥ 4.5 即白字清晰可读**。三个新颜色都在 4.5 以上
- (对比度越高,白字越清晰)。
-
-
-
-## 颜色等级
-为了显示更丰富的色彩,定义的海大标准色,每一种颜色,都有十个等级,等级越低,颜色越浅。例如:对于海大蓝,其等级颜色从oucblue90-oucblue10不等,分成10个等级。
-
-## 信息框
-信息框使用边框的形式,提升幻灯片的表现力。
-
-主要的信息框包括:列表框(`vcolorbox`)、提示框(`notebox`、`importantbox`)、信息框(`titlebox`)、要点框(`pointbox`)、块(`block`、`exampleblock`、`alertblock`)、标题框(`headbox`)和文本框(`textbox`)。它们的效果,如下图所示。
-
-
-
-
-
-
-
-
-### 要点框自动排布(pointboxgrid)
-
-要点框数量多的时候,不需要自己摆 `columns`——用 `pointboxgrid` 环境会自动排成网格:
-
-```
-\begin{pointboxgrid}{高度}
- \pointitem{标题}{颜色}{内容}
- \pointitem{标题}{颜色}{内容}
- ...
-\end{pointboxgrid}
-```
-
-**排布规则:每行最多 4 个;超过 4 个自动分成多行,并尽量均匀(上行不少于下行)。**
-
-| 个数 | 排布 | 个数 | 排布 |
-|------|------|------|------|
-| 1~4 | 一行 | 9 | 3 + 3 + 3 |
-| 5 | 3 + 2 | 10 | 4 + 3 + 3 |
-| 6 | 3 + 3 | 11 | 4 + 4 + 3 |
-| 7 | 4 + 3 | 12 | 4 + 4 + 4 |
-| 8 | 4 + 4 | N | 行数 = ⌈N/4⌉,前 N mod 行数 行每行多放一个 |
-
-
-
-几点说明:
-
-1. **高度参数的含义和 `pointbox` 的 `height` 一样**,是固定高度——内容别写超,超了会画到框外(见下)。数量多时记得**把高度调小**。
-2. **行数多了会超出页面底部**。经验值:正文区高约 243pt,总高 ≈ `69 + 行数×高度 + (行数−1)×25`(pt)。
- 所以 **4 行时高度不要超过 24pt**。超过时编译日志里会有 `oucslide Warning` 提醒。
-3. 想让每行放更多/更少,可改 `\l_ouc_pbg_max`(默认 4);间距可改 `\l_ouc_pbg_gap`(横向,默认 8pt)与
- `\l_ouc_pbg_vgap`(纵向,默认 6pt)。
-4. 单个要点框仍然可以像以前那样手写 `columns` + `pointbox`,两种用法并存。
-
-## 图示组件(扁平风格)
-
-模板自带 9 个**扁平简约**图示组件:圆角色块 + 实心纯色 + 白字 + 细箭头,
-**无渐变、无阴影、无立体**。全部用纯 TikZ 绘制,不依赖任何外部绘图宏包。
-
-
-
-### 颜色:一个或多个都可以
-
-所有组件的**颜色列表写在方括号里**(可选参数)。写一个就是全部同色,
-写多个就**按顺序取色、不够时自动循环**:
-
-```
-\flatflow[oucblue]{数据采集, 数据清洗, 模型训练, 结果评估} % 全部海大蓝
-\flatflow[oucblue,oucred,oucpine,oucamber]{数据采集, 数据清洗, 模型训练, 结果评估}
- % ← 4 个块 4 种颜色
-\flatflow[oucred,oucblue]{块一, 块二, 块三, 块四, 块五, 块六}
- % ← 2 色循环:红蓝红蓝红蓝
-```
-
-> ⚠️ 颜色**必须写成方括号 `[ ]`**。若误写成花括号 `{ }`,颜色会被当成第一个条目,
-> 编译时会报 `图示组件的颜色要写在方括号里` 的明确错误(不会静默出错)。
-
-### 九个组件速查
| 命令 | 说明 |
-|------|------|
-| `\flatflow[颜色]{条目1, 条目2, ...}` | **横向箭头流程**,自动等分满宽 |
-| `\flatstack[颜色]{条目1, 条目2, ...}` | 纵向流程 |
-| `\flatcycle[颜色]{条目1, ...}` | 循环图(弧线箭头首尾相接) |
-| `\flathub[颜色]{中心文字}{环绕1, 环绕2, ...}` | **中心辐射**(中心圆 + 环绕卡片) |
-| `\flatsteps[颜色]{条目1, ...}` | 阶梯递进 |
-| `\flattime[颜色]{年份列表}{事件列表}` | 时间轴(节点上下交替) |
-| `\flatquad[颜色]{左上}{右上}{左下}{右下}` | 四象限 |
-| `\flatpyramid[颜色]{顶层, ..., 底层}` | 金字塔(上窄下宽) |
-| `\flatcompare[左色][右色]{左标题}{左内容}{右标题}{右内容}` | 左右对比 |
+|---|---|
+| `\title{}` | 主标题 |
+| `\subtitle{}` | 副标题 |
+| `\author{}` | 作者 |
+| `\date{}` | 日期 |
+| `\institute{}` | 单位 |
+| `\last` | 结束页文字 |
-示例(`slides.tex` 里有完整的 5 页演示):
+`aspectratio=169` 是 16:9。要 4:3 改成 `aspectratio=43`。
-```
-\flatflow[oucblue,oucred,oucpine,oucamber]{数据采集, 数据清洗, 模型训练, 结果评估}
+## 文档骨架
-\flathub[oucblue,oucred,oucpine,oucamber,oucdusk]{核心}{可行性, 必要性, 创新性, 实用性}
+```latex
+\begin{document}
-\flattime[oucblue,oucred,oucpine,oucdusk]{2020, 2021, 2023, 2025}{立项, 方案设计, 中期检查, 结题验收}
+\maketitle % 标题页
+\makeoutline % 目录页
-\flatcompare[oucpine][oucred]{优势}{响应快、成本低、易于维护}{不足}{精度受限、依赖数据质量}
+\section{简介}
+\subsection{模板简介}
+\begin{frame}
+ \frametitle{简介}
+ 正文内容。
+\end{frame}
+
+\makeoutline % 每节前重复目录(可选)
+
+\section{下一节}
+\begin{frame}
+ \frametitle{页面标题}
+ ...
+\end{frame}
+
+\makelast % 结束页
+\end{document}
```
-`\flatquad` 与 `\flatcompare` 的颜色是独立的固定参数(分别 1 个和 2 个),
-不参与循环取色。
+| 命令 | 说明 |
+|---|---|
+| `\maketitle` | 标题页 |
+| `\makeoutline` | 目录页,可在每节前反复调用 |
+| `\makelast` | 结束页,显示 `\last` 的内容 |
-### 几点说明
+## 单页写法
-1. 颜色可以直接用模板的 10 个颜色(`oucblue`、`oucred`、`oucpine`、`oucdusk`、`oucamber` 等)。
-2. 横向流程会自动把 N 个块加间隙**摊满整行**,不需要手算宽度。
-3. 纵向对比、四象限这类元素较宽,建议用 `\begin{center}...\end{center}` 居中。
-4. 这套组件已用 TeX Live 2022~2026 逐一编译验证:0 错误、0 溢出,且跨版本渲染逐像素一致。
+```latex
+\begin{frame}
+ \frametitle{页面标题}
+ \begin{itemize}
+ \item 第一点
+ \item 第二点
+ \end{itemize}
+\end{frame}
+```
-## 代码
+分栏:
-模板可以插入代码块,使用`lstlisting`即可。
+```latex
+\begin{frame}
+ \frametitle{两栏}
+ \begin{columns}
+ \begin{column}{0.48\textwidth}
+ 左栏内容
+ \end{column}
+ \begin{column}{0.48\textwidth}
+ 右栏内容
+ \end{column}
+ \end{columns}
+\end{frame}
+```
-## 公式
-模板中可以直接插入公式,和LaTex中没有什么区别。
+## 主题与配色
-## 脚注
-可以在任何地方使用脚注。即便是在各种信息框中也可以。
\ No newline at end of file
+主题在 `theme/` 下,分五块:整体、配色、字体、内部元素、外部元素。
+改配色看 `beamercolorthemeOUCSlide.sty`,改字体看
+`beamerfontthemeOUCSlide.sty`。
+
+已加载的宏包:
+
+| 宏包 | 用途 |
+|---|---|
+| `tcolorbox` | 彩色盒子 |
+| `fontawesome` | 图标 |
+| `caption` / `subcaption` | 图注 |
+| `verbatim` | 代码原样输出 |
+
+## 插图
+
+图片放 `figs/`:
+
+```latex
+\begin{figure}
+ \centering
+ \includegraphics[width=0.6\textwidth]{figs/fig01.png}
+ \caption{图标题}
+\end{figure}
+```
+
+## 版式
+
+```
+16:9(aspectratio=169)
+顶部对齐(t 选项)
+海大蓝配色
+标题页 + 目录页 + 内容页 + 结束页
+页脚含校徽、页码、作者
+```
+
+## 自定义命令
+
+| 命令 | 用途 |
+|---|---|
+| `\maketitle` | 标题页 |
+| `\makeoutline` | 目录页 |
+| `\makelast` | 结束页 |
+| `\banner{}` | 横幅标题 |
+| `\oucurl{url}` | 排网址链接 |
+| `\bottomslider` / `\topslider` | 底部/顶部进度条 |
+| `\footerlogo` | 页脚校徽 |
+
+## 注意
+
+示例内容为虚构数据,使用时全部替换。
\ No newline at end of file
diff --git a/成绩构成说明/README.md b/成绩构成说明/README.md
index 5a830a2..428861a 100644
--- a/成绩构成说明/README.md
+++ b/成绩构成说明/README.md
@@ -1,368 +1,115 @@
-# 成绩构成说明 — 中国海洋大学《成绩构成说明》(LaTeX 版)
+# 成绩构成说明
-把任课教师手写的「成绩构成说明」做成 LaTeX 模板。原件是一份填过的
-`.doc` 实例(两段话 + 标题,无表格、无签字栏),本模板在**保留其信息
-内容**的前提下重新组织,并补齐归档必需项。
-
-> **本模板不含原件任何真实数据。** 课程名、学年、学期、教师姓名、
-> 所有比例、日期均已替换,已 grep 验证零命中。
->
-> 样张填的是一份**完整的虚构课程**:《数字逻辑》2025 秋学期、任课教师「张远航」、
-> 理论课 80% + 实验课 20%、平时 30%(作业 20% + 点名 10%)+ 期末 70%。
-> 这套比例是**自洽的**(20+10=30、30+70=100、80+20=100),正好能演示
-> 模板的比例校验功能;与 [`课程教学日历/`](../课程教学日历/)、
-> [`试卷归档封面/`](../试卷归档封面/)、[`试卷/`](../试卷/) 为同一门课。
-
-## 目录
-
-- [文件](#文件)
-- [编译](#编译)
-- [改内容](#改内容)
-- [相对于原件的改动](#相对于原件的改动)
-- [比例自洽校验](#比例自洽校验)
-- [版式参数](#版式参数)
-- [五个坑](#五个坑)
-- [真实数据零泄漏](#真实数据零泄漏)
-- [字体](#字体)
-
-## 文件
-
-| 文件 | 说明 |
-| :-- | :-- |
-| `成绩构成说明.tex` | 主文件。填表只改第 1 节(10 个宏) |
-| `oucgrade.sty` | 版式包。页面/字体/表格/签字栏,附换算注释 |
-| `成绩构成说明.pdf` | 成品样张(1 页) |
+中国海洋大学课程成绩构成说明表,A4 单页,正文小四(12pt)。
## 编译
```bash
+cd 成绩构成说明
xelatex 成绩构成说明.tex
```
-**单页,跑一遍即可**(无交叉引用,不需要 bibtex)。
+或仓库根:`bash build.sh 成绩构成说明`
-⚠️ 必须在**本目录**下编译,不要从仓库根调用 —— `fonts.tex` 用的是
-相对路径 `../fonts/`。
+## 文件
-需要 XeLaTeX,并安装 `ctex`、`geometry`、`fontspec`、`xeCJK`、
-`tabularray`、`enumitem`、`graphicx`。实测环境:TeX Live 2022。
+| 文件 | 说明 |
+|---|---|
+| `成绩构成说明.tex` | 主文件,填内容改这里 |
+| `oucgrade.sty` | 版式包,一般不改 |
-## 改内容
+## 填写参数
-### 课程信息(10 个宏)
+改 `\begin{document}` 之后的第 1 节,共 10 个宏,正文不用动:
```latex
\newcommand{\grdcourse}{数字逻辑} % 课程名称
-\newcommand{\grdyear}{2025} % 学年
-\newcommand{\grdseason}{秋} % 季学期(春 / 秋)
-\newcommand{\grdteacher}{张远航} % 任课教师
+\newcommand{\grdyear}{2025} % 学年
+\newcommand{\grdseason}{秋} % 季学期(春 / 秋)
+\newcommand{\grdteacher}{张远航} % 任课教师
-\newcommand{\grdtheory}{80} % 理论课占总成绩 %
-\newcommand{\grdlab}{20} % 实验课占总成绩 %
+\newcommand{\grdtheory}{80} % 理论课占总成绩
+\newcommand{\grdlab}{20} % 实验课占总成绩
-\newcommand{\grddaily}{30} % 平时成绩占理论课 %
-\newcommand{\grdfinal}{70} % 期末考试成绩占理论课 %
+\newcommand{\grddaily}{30} % 平时成绩占理论课
+\newcommand{\grdfinal}{70} % 期末考试成绩占理论课
-\newcommand{\grdhw}{20} % 作业占理论课 %
-\newcommand{\grdattend}{10} % 点名占理论课 %
+\newcommand{\grdhw}{20} % 作业占理论课
+\newcommand{\grdattend}{10} % 点名占理论课
\newcommand{\grdlabnote}{由实验课教师根据实验报告与实验操作评定。}
```
-上列前四项是**样张实际用的虚构值**。**数字只填数字,不要带 `%` 号**,百分号由模板加。
+| 参数 | 说明 |
+|---|---|
+| `\grdcourse` | 课程名称 |
+| `\grdyear` | 学年 |
+| `\grdseason` | 季学期,春 / 秋 |
+| `\grdteacher` | 任课教师 |
+| `\grdtheory` | 理论课占总成绩百分比 |
+| `\grdlab` | 实验课占总成绩百分比 |
+| `\grddaily` | 平时成绩占理论课百分比 |
+| `\grdfinal` | 期末考试占理论课百分比 |
+| `\grdhw` | 作业占理论课百分比 |
+| `\grdattend` | 点名占理论课百分比 |
+| `\grdlabnote` | 实验课评定方式,一句话说明 |
-### 「占本类」与「占总成绩」是两回事
+百分数只填数字,不要带 `%`。
-这是本模板最要紧的一个设计,见下节。
+## 比例必须自洽
-### 改写正文
-
-- 总述:`\grdpara{...}`
-- 分节:`\grdsec{一、成绩构成}`
-- 列表:`\begin{grdlist} \grditem{项}{:说明} \end{grdlist}`
-- 表格单元格:`\grdth{}`(表头)/ `\grdtd{}`(表身)
-
-## 相对于原件的改动
-
-原件全文只有这些内容(**下面是脱敏摘录**,原件里的真实课程名 / 学年 / 教师名
-用 `××××` 盖掉了;样张 PDF 里排的是虚构的《数字逻辑》2025 秋):
+模板会自动检查三组加法:
```
-成绩构成说明
- ×××× 20××学年 ×季学期 期末考试
- 理论课成绩占总成绩的80%。理论课成绩包括平时成绩、期末考试成绩。
- 平时成绩占30%(作业占20%,点名占10%),期末考试成绩占70%。
- 实验成绩占总成绩的20%。由实验课老师提供。
-```
-
-它的问题有四个,逐个解决:
-
-### 1. 三层百分数混用不同基准,读者要心算三轮
-
-| 句子 | 百分数 | **基准实际是** | 折总成绩 |
-| :-- | --: | :-- | --: |
-| 理论课占总成绩的 80% | 80% | 总成绩 | 80% |
-| 平时成绩占 30% | 30% | **理论课** | 24% |
-| 作业占 20% | 20% | **理论课** | 16% |
-| 期末考试成绩占 70% | 70% | **理论课** | 56% |
-
-「平时占 30%」看着像占总成绩三成,实际上只占 **24%**。教务抽查时
-这里最常被挑错,学生也容易误读。
-
-**改法**:表格左右并置「占本类」与「占总成绩」两列,后者由
-`\grdcalc{理论课\%}{分项\%}` 自动算出,不给心算留余地。
-
-### 2. 层级关系埋在句子里
-
-「平时成绩占30%(作业占20%,点名占10%)」—— 括号里的两个数加起来
-才是括号外的数,这种嵌套在一个句子里读起来要来回扫。
-
-**改法**:改成 6 列表格,一级项目跨行合并,层级一眼可见。
-
-### 3. 没有说明「怎么算」
-
-原件说了比例,没说作业怎么平均、缺交怎么扣、点名缺几次记零。
-这些是学生真正会问的,也是申诉时的依据。
-
-**改法**:新增「二、分项说明」一节,用列表逐项写清(文字留占位,
-任课教师按自己课程的规则填)。
-
-### 4. 没有签字栏
-
-**这是用户明确要求补的。** 没有任课教师签字的成绩构成说明,在教务
-归档时不被认作有效文件。
-
-**改法**:右下角落款,含签字线与「年 月 日」三个手写填空位。
-
-⚠️ **「年 月 日」不印年份**。成绩构成说明是学期末签署的文件,年份
-由签字人当场手写;模板里预留 `20××` 反而会占掉手写空间、并诱导
-使用者去改占位符。所以这一行只有三个字 + 两处 `\hspace` 间距。
-
-### 另外新增(可关闭)
-
-「三、成绩评定与异议」一节 —— 说明总成绩如何取整、异议如何在几个
-工作日内提出。原件没有,但归档材料有这一节更完整。
-
-不要的话把 `.tex` 里这个开关改成 0:
-
-```latex
-\def\grdwithini{0} % 1=印这一节,0=不印
-```
-
-⚠️ 关掉后正文变短,签字栏会往上移。若想让它仍贴底部,把 `oucgrade.sty`
-里签字块前的 `\par\vspace{3mm}` 调大即可(见[坑 3](#坑-3签字栏被挤到第-2-页))。
-
-## 比例自洽校验
-
-模板会检查三组加法:
-
-```
-平时 + 期末 = 100 (构成全部理论课)
-作业 + 点名 = 平时 (构成全部平时成绩)
-理论课 + 实验课 = 100 (构成全部总成绩)
+理论课 + 实验课 = 100
+平时成绩 + 期末考试 = 理论课
+作业 + 点名 = 平时成绩
```
不通过时:
+- 编译 log 里打 `*** oucgrade: 比例不自洽 ***`
+- PDF 上印一个醒目的提示
-1. `.log` 里打出
- `*** oucgrade: 比例不自洽 --- 作业+点名 应构成全部平时成绩: 实际 25+10, 应为 30 ***`
-2. PDF **标题正下方**印一行红字警告
+## 表格结构
-**为什么值得做**:成绩构成说明是要归档、要被抽查的文件,比例加不起来
-是最常见也最难被自己发现的错误 —— 原件那句「平时 30%(作业 20%,
-点名 10%)」正是靠心算才看得出 20+10=30。
+| 区段 | 内容 |
+|---|---|
+| 表头 | 课程名称、学年学期、任课教师 |
+| 总成绩构成 | 理论课 / 实验课两行,各占百分比 |
+| 理论课内部 | 平时成绩 / 期末考试 |
+| 平时成绩内部 | 作业 / 点名 |
+| 实验课说明 | 一行文字 |
+| 签字栏 | 任课教师、教研室主任、教学院长 |
-**已做负面测试**:把 `\grdhw` 从 20 改成 25 重编,log 报
-`实际 25+10, 应为 30`,PDF 第 1 页顶部出现警告;改回 20 后警告消失。
+## 改表格内文字
-⚠️ 警告印在**开头**不是文末。文末的提示会被签字栏挤到第 2 页,
-而第 2 页通常没人翻 —— 等于没提示。
+正文里表格用标准 `tabular`,各格改写直接改文字。
-## 版式参数
+### 常用命令
-### 页面
+| 命令 | 用途 |
+|---|---|
+| `\grdmaintitle` | 主标题 |
+| `\grdsubtitle` | 副标题 |
+| `\grdsubtitleline` | 副标题下横线 |
+| `\grdsec{标题}` | 分区标题 |
+| `\grditem{文字}` | 条目 |
+| `\grdpara{文字}` | 段落 |
+| `\grdth{内容}` | 表头格 |
+| `\grdtd{内容}` | 表体格 |
+| `\grdcalc{算式}` | 算式格(自动排版) |
+| `\grdsignblock` | 签字栏整块 |
+| `\grdsmall{文字}` | 小字 |
+| `\grdcheck` | 运行比例校验 |
+| `\grdwarnifbad` | 不自洽时印警告 |
-| 项 | 值 | 来源 |
-| :-- | --: | :-- |
-| 纸张 | A4 210×297mm | `pgSz 11906×16838` twips |
-| 上下边距 | 25.40mm | `pgMar top/bottom 1440` |
-| 左右边距 | 31.75mm | `pgMar left/right 1800` |
-| 版心 | 146.50 × 246.20mm | 210−2×31.75 / 297−2×25.40 |
-| 页脚距 | 17.51mm | `pgMar footer 992` |
+## 版式
-换算:`mm = twips / 1440 × 25.4`,`pt = twips / 20`。
-
-### 字号
-
-| 用途 | 原件 (w:sz) | 本模板 | 实测输出 |
-| :-- | --: | --: | --: |
-| 大标题 | 36 半磅 = 18pt | `18bp` | 18.00 |
-| 副标题 | 24 = 12pt | `12bp` | 12.00 |
-| 正文 | 28 = 14pt | `14bp` | 14.00 |
-| 表格/签字 | — | `12bp` | 12.00 |
-
-⚠️ **必须写 `bp` 不能写 `pt`**。Word 的 pt 是 PostScript pt(1/72 in),
-TeX 默认 pt 是 1/72.27 in,差 0.36%。写 `14pt` 实测输出 14.05。
-
-### 行距
-
-| 用途 | 值 | 说明 |
-| :-- | --: | :-- |
-| 正文 | 21.5bp | 14pt 的 1.54 倍 |
-| 表格/签字 | 17bp | 12pt 的 1.42 倍 |
-
-原件 `docGrid linePitch=312` = 15.6pt,对 14pt 字只有 1.11 倍,太挤。
-本模板用 21.5bp(1.54 倍)—— 这是**有意的改善**,不是复刻。
-21.5 是为压到一页反复试出来的值,可读下限约 1.4 倍,还有余量。
-
-### 表格列宽
-
-6 列,Σ wd = 123.64mm:
-
-| 列 | 宽 | 内容 |
-| :-- | --: | :-- |
-| 项目 | 22.00mm | 理论课 / 实验课 |
-| 占本类 | 14.00mm | 80% |
-| 细分项目 | 26.00mm | 平时成绩 / 期末 |
-| 占本类 | 14.00mm | 30% |
-| 占总成绩 | 17.00mm | 24% |
-| 评定依据 | 29.40mm | 作业 + 出勤 |
-
-**Σwd 为什么是 123.64 而不是 146.50**:`Q[wd=...]` 是内容区宽度,
-不含 `colsep`。每列实际占位 = `wd + 2×colsep`,6 列共多占
-`6×2×1.905 = 22.86mm`。所以
-`Σwd = 146.50 − 22.86 = 123.64mm`。
-
-⚠️ **画满全格线之后每列还要再扣 0.5pt**。只画外框时表宽里不含内部
-竖线;一旦 `vline{1-Z}` 把 5 条内部竖线都画上,表宽就多出
-`5×0.5 = 2.5pt`,编译报 `Overfull \hbox (2.47554pt too wide)`。
-所以最后一列从 30.28mm 收到 29.40mm(−2.5pt)补回来。
-
-### 行高:`ht` 是最小值,且跨行格不会自己长高
-
-这两点一起踩过,都表现为"字贴着格线":
-
-| `ht` 是否小于内容高 | 结果 |
-| :-- | :-- |
-| 是(如 `ht=7.5mm` < 54.73pt) | 行被内容撑到 54.73pt,**上下零留白**,末行墨迹底离行线只剩 0.90pt(0.32mm),其他行是 4.97pt(1.75mm)—— 一眼看出挤 |
-| 否(`ht=22mm` = 62.4pt) | 行高 62.86pt,上下各留约 3.8pt,末行墨迹底离行线 4.08pt(1.44mm),与其他行同量级 |
-
-所以 **`ht` 给了不等于生效,必须大于内容自然高度**。本例「平时成绩
-(作业 20%、点名 10%)」在 26mm 列里折 3 行,自然高 54.73pt
-(= 2×17bp + 盒高),要撑开就得给到 22mm。
-
-`ht` 按**表格行号**给,不是按逻辑块:`row{1}` 是表头、`row{2}` 是
-「理论课/平时成绩」那一行。抬高 `row{3}`(「期末」行)只会移动中间
-那条线,对跨行块的高度没有影响。
-
-## 五个坑
-
-### 坑 1:`.tex` 里写带 `@` 的宏名
-
-`.tex` 文档中 `@` 的 catcode 是 12(其他),不是 11(字母)。写
-`\grd@chk` 会被解析成 `\grd` + `@chk`,报
-`! LaTeX Error: Missing \begin{document}`,并且**连累后面所有内容**
-(报一串 Undefined control sequence)。
-
-**规矩**:带 `@` 的内部宏一律定义在 `.sty` 里,`.tex` 只调用不带 `@`
-的公开接口(如 `\grdcheck`)。
-
-### 坑 2:tabularray 的 `hline{}` 里不能用带 `@` 的宏
-
-```latex
-hline{1,Z}={\grd@rulev} % ✗ 报 \l__tblr_v_tl ->\grd @rulev
-hline{1,Z}={0.5pt} % ✓ 写字面值
+```
+A4,正文小四(12pt),边距标准
+表格带框线
```
-tabularray 把 `hline` 的参数当**字符串重新 tokenize**,那一刻 `@` 的
-catcode 已经退化,宏名在 `@` 处断开。
+## 注意
-**规矩**:`hline` / `vline` 的线宽写字面值,别用宏包一层。
-
-⚠️ 关于 `1-Z` 与 `1,Z`:
-
-| 写法 | 含义 | 效果 |
-| :-- | :-- | :-- |
-| `hline{1,Z}` | 第 1 条 + 最后 1 条 | 只有顶框和底框 |
-| `hline{1-Z}` | 第 1 条到末条(全部) | 每条行线都画 |
-
-本模板用 `1-Z`:**所有格线都画满**。只画外框时,跨行格(理论课)
-与单行格的分界、以及数据行之间全是空白,非常容易看错行。这是
-用户明确要求改掉的点。
-
-代价是每列要再扣 0.5pt 表宽(见上文「画满全格线之后每列还要再扣」
-一节),并且暴露出一个原本被掩盖的缺陷:跨行格里的第 3 行字一直
-是贴着格线的(详见上文「行高」一节)。**画满格线会让所有"零留白"
-的排版问题显形** —— 这是好事,但要预留调 `ht` 的时间。
-
-### 坑 3:签字栏被挤到第 2 页
-
-试过四种写法,只有最后一种同时满足「一页」+「不出界」:
-
-| 写法 | 结果 |
-| :-- | :-- |
-| `\par\vspace{4mm}` + minipage | ✗ 翻页(minipage 紧跟 `\par` 是合法断页点) |
-| `\vfill` 顶到底部 | ✗ 不翻页但**出界**:年月日 y=774.9,版心底只有 771.6 |
-| `\vfill` + 块内 `\vspace*{5mm}` | ✗ 又翻页(`\vfill` 与块高之和超出剩余空间时,TeX 不接受压缩 `\vfill`,只能整块搬迁) |
-| `\par\vspace{3mm}` + minipage | ✓ 一页,内容底 769.8,余 1.8pt |
-
-**结论**:不要指望竖直胶帮你「自动贴底」。单页文档里最稳的是
-**固定间距 + 实测校准** —— 改正文后重编一次,看内容底距 771.6 还有多少。
-
-### 坑 4:minipage 内部用 `\hfill` 做右对齐
-
-```latex
-\begin{minipage}{76mm}
- 任课教师(签字):\rule{40mm}{0.4pt}\par % 行尾没有 \parfillskip 弹性
-\end{minipage}
-```
-
-minipage 里的行末会被拉伸到满宽,12pt 的字出现夸张字距 ——
-实测「任」「课」「教」「师」被拉到 **34.8pt 一字**。
-
-**正解**:minipage 内 `\raggedright`,`\hfill` 只放在外面:
-
-```latex
-\noindent\makebox[\textwidth][r]{\begin{minipage}{76mm}\raggedright ...\end{minipage}}
-```
-
-### 坑 5:列表引导符「·」缺字
-
-本库 OUC Serif 子集里**没有** `·`(U+00B7) 和 `•`(U+2022),
-用它们会报 `Missing character: There is no · (U+00B7)`,印出来是空白。
-
-实测该字体有 `●`(U+25CF) 与 `○`(U+25CB),且 `fonts.tex` 已把这两个
-码位归入 CJK 字符类,可直接用。本模板用缩小 0.6 倍的 `●` 作引导符。
-
-## 真实数据零泄漏
-
-原件是**填过的实例**(真实课程名、学年、教师姓名、全部比例)。
-本模板把这些逐项换掉:课程名 / 学年 / 教师名换成虚构的《数字逻辑》2025 秋
-「张远航」,原件的比例也未保留。
-
-已 grep 确认以下关键词在 `oucgrade.sty`、`成绩构成说明.tex` 与 `README.md`
-中**零命中**(含注释):原件实例的课程名、学生人数、开课号、教师姓名、
-单位名称,以及原件出现过的具体年份。本 README 不列出这些原文,
-避免「为了证明零泄漏而把真实信息写进来」。
-
-> 关于 `80`/`20`/`30`:样张里这几个数**不是从原件抄的**,是按「理论 80 +
-> 实验 20、平时 30(作业 20 + 点名 10)+ 期末 70」重新配的一组自洽比例,
-> 目的是让模板的比例校验(见前文「比例自洽校验」)能演示出「三项都成立」
-> 的状态。原件那组比例本身有对不上的地方,不适合当范例。
-
-## 字体
-
-全部来自仓库公共字体包 `../fonts.tex`(唯一允许声明字体的地方):
-
-| 用途 | 字体 | 授权 |
-| :-- | :-- | :-- |
-| 正文宋体 | OUC Serif(思源宋体 GB2312 子集) | SIL OFL 1.1 |
-| 标题楷体 | OUC Kai(霞鹜文楷子集) | SIL OFL 1.1 |
-| 分节黑体 | OUC Sans(思源黑体子集) | SIL OFL 1.1 |
-| 西文 | TeX Gyre Termes | GUST Font License |
-
-⚠️ 原件标题用的是**方正楷体_GB2312**,那是商业字体,本库不含也不能分发。
-改用霞鹜文楷(同属楷书形态,开源可商用)。这是**有意的替换**,不是遗漏。
-
-⚠️ 不要用 `\setCJKmainfont` 直接指定系统字体(SimSun / SimHei 等)——
-换到 Linux / macOS 就编不出来。全部走 `../fonts.tex`。
\ No newline at end of file
+示例内容为虚构数据,使用时全部替换。签字栏留空手填。
\ No newline at end of file
diff --git a/教材/README.md b/教材/README.md
index 0cd9056..509c030 100644
--- a/教材/README.md
+++ b/教材/README.md
@@ -1,210 +1,194 @@
# 教材
-中国海洋大学 教材 LaTeX 模板。
-
-版式从《软件需求工程导论》(sre 仓库)的成品书抽取而来,
-保留其全部排版特性,正文内容为占位示例。
+教材、专著的成书排版,A4 多页,含封面、目录、章节、附录、参考文献。
## 编译
```bash
cd 教材
-xelatex 教材.tex # 无参考文献时,单次即可
-```
-
-有参考文献时(本模板默认就有)走完整流程:
-
-```bash
xelatex 教材.tex
bibtex 教材
xelatex 教材.tex
xelatex 教材.tex
```
-或仓库根:`bash build.sh 教材`(已自动处理 bibtex)
+或仓库根:`bash build.sh 教材`(自动依次跑完,含 bibtex)
## 文件
-| 文件 | 作用 |
+| 文件 | 说明 |
|---|---|
-| `ouctextbook.sty` | 版式配置(编号层级、封面色、宏包、断行) |
-| `elegantbook.cls` | **本地化过的**文档类(改过字体,见下) |
-| `教材.tex` | 示例正文 |
-| `reference.bib` | 参考文献库(内容是虚构条目) |
-| `README.md` | 本文件 |
+| `教材.tex` | 主文件,书名与正文改这里 |
+| `ouctextbook.sty` | 版式配置 |
+| `elegantbook.cls` | 文档类 |
+| `reference.bib` | 参考文献库,换成自己的 |
-## ⚠️ 唯一的结构性差异:本模板带一份 cls
-
-仓库其他模板只需 `\input{../fonts.tex}`。本模板还需要一份
-**改过字体的 `elegantbook.cls`**,原因如下。
-
-### elegantbook 的三档中文字体,全都不通用
-
-| 选项 | 实际字体 | 问题 |
-|---|---|---|
-| `founder`(默认) | FZShuSong-Z01 / FZHei-B01 / FZKai-Z03 / FZFangSong-Z02 | **方正商业字体,不能分发** |
-| `ctexfont` | 系统字体(Windows=SimSun/SimHei,macOS=PingFang) | 同一份源码三个平台三种样子 |
-| `nofont` | 不设,交给用户 | 不配置就直接报错 |
-
-### 但只写 nofont 还不够
-
-`elegantbook.cls` 自身还硬编码了两处西文字体:
+## ⚠️ 前两行不能动
```latex
-\setmainfont{TeXGyreTermesX}[...] % 西文衬线
-\setsansfont{texgyreheros}[...] % 西文无衬线
+\documentclass[lang=cn,newtx,10pt,black,chinesefont=nofont]{elegantbook}
+\input{../fonts.tex}
```
-这两款在精简版 TeX Live 和很多机器上都没有,会直接报
+- `chinesefont=nofont` 必须写,否则会去加载系统字体或商业字体,跨平台不一致
+- `\input{../fonts.tex}` 必须在 `\documentclass` 之后、`\begin{document}` 之前
-```
-! Package fontspec Error: The font "texgyreheros-regular" cannot be found
-```
-
-而且是 9 个错误连发(类的每个字体档位都失败一次)。
-
-**实测:在 `\documentclass` 之后用 `\setsansfont` 覆盖无效** ——
-类加载时字体族已经注册失败,后面的重新指定救不回来。
-
-### 所以 cls 必须本地化
-
-模板目录里的 `elegantbook.cls` 相对上游改了三处,都带
-「本地化」注释,便于将来对比上游版本:
-
-| 位置 | 改动 | 原因 |
-|---|---|---|
-| 第 176 行附近 | `TeXGyreTermesX` → `texgyretermes`,加 `Path=../fonts/tex-gyre-termes/` | 用仓库自带字体 |
-| 第 184 行附近 | `texgyreheros` → `OUCSans`,加 `Path=../fonts/ouc-sans/` | 仓库没有 Hero |
-| `\maketitle` 内 | `example-image` → `\ouc@coverblank` | 无封面图时不插占位图 |
-
-### 中文依赖链
-
-`nofont` 模式下 elegantbook **不定义** `\songti` / `\heiti` / `\kaishu` /
-`\fangsong`,但它的 `\cbfseries`、章节标题都依赖 `\heiti`。
-
-这层依赖由 `../fonts.tex` 补上——那里已用 `\def` 定义这四个命令。
-**若哪天 fonts.tex 改了这几个命令的名字,本模板的章节标题会立刻失去中文字体。**
-
-## ⚠️ 封面:三个坑
-
-### 1. 不写 `\cover{}` 会插一张 "Image" 占位图
-
-elegantbook 在 `\maketitle` 里:
+## 书名信息
```latex
-\ifcsname @cover\endcsname
- \includegraphics[width=\linewidth]{\@cover}
-\else
- \includegraphics[width=\linewidth]{example-image} ← mwe 宏包的灰底占位图
-\fi
+\title{教材模板示例}
+\subtitle{副标题写在这里}
+\author{作者甲 \quad 作者乙 \quad 作者丙}
+\institute{中国海洋大学}
+\date{2026/11/1}
+\version{第一版}
+\extrainfo{出版社}
```
-首页顶着 "Image" 两个大字。本地化版本已把 `else` 分支换成空盒子。
+| 命令 | 说明 |
+|---|---|
+| `\title{}` | 书名 |
+| `\subtitle{}` | 副标题 |
+| `\author{}` | 作者,多人用 `\quad` 隔开 |
+| `\institute{}` | 单位 |
+| `\date{}` | 日期 |
+| `\version{}` | 版本 |
+| `\extrainfo{}` | 出版社 |
-### 2. 空盒子的宽度不能是 0
+### 封面图
-第一版把占位改成 `\rule{0pt}{0pt}`(0 宽),结果**冒出 5pt Overfull**,
-且只出现在 `\maketitle` 那一行,怎么调 `\hspace`、`minipage` 宽度都去不掉。
-
-根因:0 宽空盒让 `\linewidth` 在 titlepage 里的计算与 `\textwidth` 差了 5pt,
-后续并排的 `\parbox` + 两个 `minipage` 就超了。
-
-✅ 正解给占位盒一个满宽:
+不放图就只要纯色带封面。要放图:
```latex
-\newcommand{\ouc@coverblank}{\rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
+\cover{cover.jpg}
```
-实测 0 Overfull。
+图片放进本目录。
-### 3. 要真封面就写 `\cover{文件}`
+### 封面色
-把图片放进本目录,导言区加 `\cover{cover.jpg}` 即可,走插图分支。
-
-## 版式参数
-
-```
-页面 A4 210 × 297 mm
-边距 上下 25.4mm,左右 20mm
-headheight 2.17cm,headsep 4mm,footskip 12mm
-字号 10pt(比仓库其他模板的 12pt 小,原教材如此)
-行距 1.2 倍(elegantbook 默认)
-封面色 RGB(32, 178, 170) 青绿
-```
-
-## 标题编号
-
-```
-章 1
-节 1.1
-小节 1.1.1
-小小节 1.1.1.1 ← secnumdepth=3,编号最多到这里
-第 5 级 (1)(2)(3) ← 不进编号体系,随小节重置
-```
-
-第 5 级为什么要单独处理:`secnumdepth=4` 会排出 `3.1.1.1.1` 这种过长编号,
-教材里很难看。改用带括号的序号,与正文行文习惯一致。
-
-## 章的标准结构
-
-原教材 13 章全部遵循,做模板时保留:
+默认青绿 RGB(32,178,170)。要换颜色,正文里调:
```latex
-\chapter{标题}
-导语(3~5 段,概述本章问题、结构、与相邻章的关系)
-\section{...}
-\section{本章小结} % 用 \oucsummary
-\section{习题} % 用 \oucexercises
+\oucSetCoverColor{blue}
```
-两个小节做成了命令,避免各章写法不一致。
+## 文档结构
-## 字体(全部来自仓库,无商业字体)
-
-| 用途 | 字体 | 来源目录 |
-|---|---|---|
-| 中文正文 | OUC Serif | `../fonts/ouc-serif/` |
-| 中文黑体 | OUC Sans | `../fonts/ouc-sans/` |
-| 中文楷体(代斜体) | OUC Kai | `../fonts/ouc-kai/` |
-| 中文仿宋 | Zhuque Fangsong | `../fonts/zhuque-fangsong/` |
-| 西文正文 | TeX Gyre Termes | `../fonts/tex-gyre-termes/` |
-| 西文无衬线 | OUC Sans | `../fonts/ouc-sans/` |
-
-PDF 内嵌字体实测:
-```
-OUCSerif-Regular / OUCSerif-Bold / OUCKai-Regular
-TeXGyreTermes-Regular / -Bold / -Italic
-LMMono10-Regular ← \texttt 用的等宽,TeX Live 自带
+```latex
+\begin{document}
+\maketitle % 标题页
+\frontmatter % 前置部分,页码用罗马数字
+\tableofcontents % 目录
+\chapter*{前言} % 前言(不进编号)
+\mainmatter % 正文,页码用阿拉伯数字
+\chapter{第一章}
+...
+\appendix % 附录,章号变 A、B、C
+\chapter{附录一}
+\nocite{*}
+\printbibliography[heading=bibintoc, title=\ebibname]
+\end{document}
```
-⚠️ `LMMono10` 是 Computer Modern 等宽字体,用于 `\texttt{}`(代码、DOI)。
-仓库 fonts.tex **没有配等宽字体**,elegantbook 也没有。它由 TeX Live
-自带,WSL 和 Windows 两端都有,所以跨平台一致,不算问题。
-要换成别的等宽字体,在导言区加 `\setmonofont{...}`。
+## 章的标准写法
-## 验证
+```latex
+\chapter{章节标题}
-```
-8 页 error 0 Overfull 0 Underfull 0
-字体全部来自 ../fonts/,无商业字体、无系统字体
-全库 16/16 通过
+本章导语,3~5 段,概述本章要解决的问题与结构。
+
+\section{节标题}
+正文段落。
+
+\subsection{小节标题}
+\subsubsection{小小节标题}
+
+\paragraph{第五级标题}
+这一级用「(1)(2)(3)」编号。
+
+\oucsummary
+本章小结正文。
+
+\oucexercises
+\begin{enumerate}
+ \item 习题一。
+\end{enumerate}
```
-⚠️ Windows 端本机未能编译(TeX Live 写字体缓存被安全策略拦截),
-但模板只依赖 TeX Live 标准宏包与发行版自带字体,不涉及平台特有资源。
-原教材本身就是在 Windows + TeX Live 2022 上编译的。
+| 命令 | 说明 |
+|---|---|
+| `\chapter{}` | 章(1, 2, 3) |
+| `\section{}` | 节(1.1) |
+| `\subsection{}` | 小节(1.1.1) |
+| `\subsubsection{}` | 小小节(1.1.1.1) |
+| `\paragraph{}` | 第五级,用(1)(2)(3)编号 |
+| `\oucsummary` | 印「本章小结」节标题 |
+| `\oucexercises` | 印「习题」节标题 |
-## 与原教材的差异
+编号最多到第 4 级(1.1.1.1),第 5 级不再用点分编号,避免出现
+「3.1.1.1.1」这种过长编号。`\paragraph` 的序号随 `\subsubsection` 重置。
-| 项 | 原教材 | 本模板 | 原因 |
-|---|---|---|---|
-| 封面图 | cover.jpg | 无(纯色带) | 模板不附图片 |
-| 字体 | 方正四大字体 | 仓库开源字体 | 商业字体不能分发(#17 的规矩) |
-| 西文无衬线 | texgyreheros | OUC Sans | 仓库没有 Hero |
-| 正文 | 13 章 265 页 | 1 章示例 | 只抽骨架 |
+## 参考文献
-## 已知问题
+```latex
+\addbibresource[location=local]{reference.bib} % 导言区
+\nocite{*} % 正文末尾,引用全部条目
+\printbibliography[heading=bibintoc, title=\ebibname]
+```
-`\texttt{}` 用的是 Computer Modern 等宽(LMMono10),与正文西文
-Termes 风格不搭。成因是仓库未统一配置等宽字体,见上文字体表。
-目前仅 2 处用到(示例里的 `booktabs` 和一条 DOI),不影响观感。
\ No newline at end of file
+`\nocite{*}` 表示列出文献库里全部条目。正式写作时删掉它,只列实际引用的。
+
+`reference.bib` 里的条目是虚构的,替换成自己的文献库。
+
+## 插图与表格
+
+```latex
+\begin{figure}[H]
+ \centering
+ \includegraphics[width=0.8\textwidth]{image/xxx.png}
+ \caption{图标题}
+ \label{fig:example}
+\end{figure}
+
+\begin{table}[htbp]
+ \centering
+ \caption{表标题}
+ \label{tab:example}
+ \begin{tabular}{|l|l|}
+ \hline
+ 列一 & 列二 \\ \hline
+ \end{tabular}
+\end{table}
+```
+
+图题在图下方,表题在表上方。`[H]` 强制图跟文字,教材排版常用。
+
+TikZ 可直接画关系图、流程图:
+
+```latex
+\begin{tikzpicture}[box/.style={draw, rounded corners, align=center,
+ fill=blue!6, minimum width=3.2cm}]
+ \node[box] (a) at (0,0) {甲方};
+ \node[box] (b) at (4,0) {乙方};
+ \draw[->, thick] (a) -- (b);
+\end{tikzpicture}
+```
+
+已加载的 TikZ 库:`shapes.geometric`、`shapes.misc`、`arrows.meta`、
+`arrows`、`decorations.pathreplacing`、`decorations.markings`、
+`positioning`、`calc`、`fit`、`backgrounds`。
+
+## 版式
+
+```
+A4,边距 上下 25.4mm,左右 20mm
+正文 10pt,行距 1.2 倍
+标题:章 22pt 黑体,节 14pt 黑体
+封面色带 RGB(32,178,170) 青绿
+页码:前置罗马数字,正文阿拉伯数字
+```
+
+## 注意
+
+示例内容为占位文字,使用时全部替换。
\ No newline at end of file
diff --git a/特殊事项说明表/README.md b/特殊事项说明表/README.md
index 5bac1f3..d8c7cde 100644
--- a/特殊事项说明表/README.md
+++ b/特殊事项说明表/README.md
@@ -1,247 +1,98 @@
-# 特殊事项说明表 — 中国海洋大学 特殊事项说明表(LaTeX 版)
+# 特殊事项说明表
-把报销用的《中国海洋大学特殊事项说明表》Word 版复刻为 LaTeX 模板。
-版式与原 `.docx` **逐点对齐**(见文末「实测偏差」),
-**不含任何真人信息**:事项描述是虚构的报销事由,三处日期留空待手写。
-
-## 文件
-
-| 文件 | 说明 |
-| :-- | :-- |
-| `特殊事项说明表.tex` | 主文件。填表只改第 1 节(4 个变量) |
-| `ouccsx.sty` | 版式包。页面/字体/行高/全部尺寸写在这里,附换算注释 |
+中国海洋大学报销用特殊事项说明表,A4 单页,含事项描述与三级签字审批。
## 编译
```bash
+cd 特殊事项说明表
xelatex 特殊事项说明表.tex
```
-单页,跑一遍即可(无交叉引用)。
+或仓库根:`bash build.sh 特殊事项说明表`
-需要 **XeLaTeX**,并安装 `ctex`、`geometry`、`fontspec`、`xeCJK`、`fancyhdr`。
-实测环境:TeX Live 2022。
+## 文件
-## 改内容
+| 文件 | 说明 |
+|---|---|
+| `特殊事项说明表.tex` | 主文件,填内容改这里 |
+| `ouccsx.sty` | 版式包,一般不改 |
+
+## 填写参数
+
+全部在 `\begin{document}` 之前定义:
```latex
-\newcommand{\sxdesc}{% % 事项描述(必填)
-因项目研讨需要,前往菏泽进行项目研讨与系统演示,因携带大件演示设备,
-公共交通多有不便,因此采用自驾方式前往。}
+\newcommand{\sxdesc}{%
+因渤海湾生态环境监测浮标需要例行维护,前往昌邑近岸观测站更换传感器……}
-\newcommand{\sxdateA}{} % 项目负责人签字处日期
-\newcommand{\sxdateB}{} % 单位负责人签字处日期
-\newcommand{\sxdateC}{} % 科技管理部门签字处日期
+\newcommand{\sxdateA}{} % 项目负责人签字处日期
+\newcommand{\sxdateB}{} % 单位负责人签字处日期
+\newcommand{\sxdateC}{} % 科技管理部门签字处日期
```
-就这四个。**表内其余文字全是学校规定原文,不要改** ——
-「兹证明该事项真实有效,本人愿意为此承担责任。」「学院对本单位科研
-经费使用承担监督和管理责任。」以及备注三条,都在 `ouccsx.sty` 里
-装配好了,改了就与原件不一致。
+| 参数 | 说明 |
+|---|---|
+| `\sxdesc` | 事项描述正文,可写多段(用 `\par` 分开) |
+| `\sxdateA` | 项目负责人签字处日期 |
+| `\sxdateB` | 单位负责人签字处日期 |
+| `\sxdateC` | 科技管理部门签字处日期 |
-### 关于 `\sxdesc`
+### 日期怎么写
-描述**可以写多段**,空行或 `\\` 分段都行,表格会自动让出空间:
+留空则印成「 年 月 日」供手写。要打印具体日期:
-- 写短 → 空白落在「描述区」与「签名区」之间,签名区位置不动
-- 写长 → 空白被吃掉,签名区仍然不动
-
-> 这是本模板比原 docx 更稳的地方。原件靠 R0 里的 **8 个空段** 给手写
-> 留白,描述一写长就把签名区顶到下一行(Word 里也一样)。本模板删掉
-> 那 8 个空段,改成「上下两半 + 中间 `\vfil`」,两头都不破版。
-
-⚠️ 描述特别长时签名区会挤出行外 —— 这是内容超量的正常表现(Word 里
-写太多同样会把格子撑高),把描述删短即可,不是 bug。
-
-### 关于三处日期
-
-留空则印成「 年 月 日」,签字时手写。
-想直接打印就填年份:`\newcommand{\sxdateA}{2026}` 会印在「年」前面。
-
-> 默认留空的理由同 `成绩构成说明`:印了年份就占掉手写空间,
-> 而且报销常常是事后补开,日期往往就是签字那天。
-
-## 版式数据来源
-
-全部尺寸从原 `.docx` 的 OOXML 里量出来,换算关系:
-
-- 长度:`mm = twips ÷ 1440 × 25.4`,`pt = twips ÷ 20`
-- 字号:`w:sz` 是半磅值,`sz=21` ⇒ 10.5 pt
-- 行距:`w:line` 是 1/20 pt,`lineRule="exact"` 时即精确值
-
-| 项目 | docx 原值 | 换算 |
-| :-- | :-- | :-- |
-| 纸张 | `pgSz 11906×16838` | A4 210×297 mm |
-| 页边距(上下) | `pgMar top/bottom 2155/1985` | 38.01 / 35.00 mm |
-| 页边距(左右) | `pgMar left/right 1588/1474` | 28.01 / 26.00 mm |
-| 表宽 | `tblW 9613` | 169.54 mm = 480.65 bp |
-| 表左缩进 | `tblInd −546` | −9.63 mm(把表顶出版心) |
-| 单元格内边距 | `tblCellMar 108` | 5.4 pt(左右),上下为 0 |
-| 边框 | `tblBorders sz=4` | 0.5 pt |
-| 字号 | 标题 `sz44`/正文 `sz21`/签字日期 `sz24`/页码 `sz28` | 22 / 10.5 / 12 / 14 pt |
-| 行距 | 标题 `line500`/备注 `line300`/表内未设 | 25 / 15 pt/Word 单倍(字号×1.3) |
-
-表格结构:**单列 3 行**(`tblGrid` 只有一个 `gridCol`,每行一个 `tc`),
-即三行整宽方框上下叠。没有合并单元格、没有多列,所以没用 `tabularray`
-—— 手工 `\vbox` 叠三块反而更可控(行高精确、内线不重复、内容可用 `\vfil` 撑)。
-
-### 行高为什么用实测值而不是 `trHeight`
-
-`trHeight` 是 5091 / 1140 / 634 twips,`hRule="atLeast"`。
-`atLeast` 是「最小」,实际高度由内容撑开:
-
-| 行 | `trHeight` | 实际被内容撑到 | 段落数 |
-| :-- | :-- | :-- | :-- |
-| R0 事项描述 | 254.55 pt | **284.00 bp** | 19 |
-| R1 单位负责人 | 57 pt | **58.35 bp** | 4 |
-| R2 科技管理 | 31.70 pt | **56.80 bp** | 4 |
-
-照 `trHeight` 会让整表矮 40 bp。故取实测撑开后的高度。
-
-## 六个必须知道的坑
-
-这一节的每一条都是实测踩出来的,改 `ouccsx.sty` 之前务必看完。
-
-### 1. 版心要取「表格宽度」,不是 docx 版心
-
-原表宽 169.54 mm,比 docx 版心(156 mm)宽 13.54 mm,
-靠 `tblInd = −546 twips` 向左顶出版心。
-
-若把 `geometry` 设成 docx 版心(`left = 28.01mm`),表格必然超出版心
-13.54 mm,报一条 `Overfull \hbox`,而且改内容时位置会漂。
-
-⇒ 本包把版心**直接设成表格宽度**:`left = 16.47mm`、`totalwidth = 169.54mm`。
-表格正好填满版心,零 Overfull,与原件逐点相同。
-
-代价:标题若用 `\centering` 会落在 287.03 bp,而原件在 300.41 bp(居中于
-docx 版心),偏左 13.4 bp。故标题另给 `\sxtitleindent` + `\sxtitlewidth`
-把中心校回去 —— **不要**把标题改成 `\centering`。
-
-### 2. `\baselineskip` 管不了本表的行距
-
-本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68 bp),
-因为 10.5 pt 与 12 pt 的字混排,Word 按「**下一行**字号 × 1.3」算。
-
-而 `\baselineskip` **只在同一段落内部**管行距。一旦每行 `\par` 自成一段,
-段与段之间是另一套规则:
-
-```
-段间基线距 = 上段末行深度 + \parskip + 本段首行字高
+```latex
+\newcommand{\sxdateA}{2026} % 只印年份
+\newcommand{\sxdateA}{2026}{10}{28} % 但这不是正确写法
```
-这里 `\parskip = 0`、首行字高由字体 ascent 定死,`\baselineskip` 根本没被读到。
-实测第一版所有行距被压成 13.51,12 pt 的签名行也没变高,整表矮 2.25 bp。
+正确写法是用完整版命令(三参数版本,写在同一行的花括号内):
-⇒ 正解:不依赖 `\baselineskip`,逐行显式插胶:
-
-```
-基线距 = 上盒深度 + \kern + 本盒高度
-⇒ \kern = 目标距 − 上盒深度 − 本盒高度
+```latex
+\newcommand{\sxdateA}{\sxdatefull{2026}{10}{28}}
```
-这就是 `\sx@bl` / `\sx@blp` 的全部内容。与字体度量彻底解耦:换字体、
-换字号、描述写长写短,行距一个 bp 都不变。
+要只印年份就用 `\newcommand{\sxdateA}{2026}`,其余留空手填。
-唯一的例外是「段内折行的长句」—— 那是一个段落里的多行,规则不同,
-`\baselineskip` 在此**有效**,故 `\sx@blp` 仍给它。
+## 生成的表格
-### 3. 块首行必须用 `\kern`,不能用 `\vskip`
+`\sxform` 一条命令印出整个表:
-TeX 会**丢弃 `\vbox` 开头的胶**。用 `\vskip` 给的顶距会静默消失
-(实测「事项描述:」给 10.53 只落到 5.38,等于只剩字高)。
-`\kern` 不受这条约束,且照样计入盒高。
-
-同理,块**末尾**不能用 `\vskip` 补空白(胶也被丢弃),
-要用 `\sx@bl` 的可选参数 `#1` 直接撑末盒的深度。
-
-### 4. 负的 `\kern` 不能被挡
-
-相邻两行的目标距可能小于「上盒深度 + 本盒高度」。例:年月日行是 12 pt 字,
-目标距 14.04,而 `2.99 + 12.06 = 15.05`,差值是 **−1.01**。
-
-最初加了 `\ifdim\sx@tmp>\z@` 守卫,负值被静默吞掉 → 该行退回自然距 15.05,
-整块错位 10 bp。负 `\kern` 在 TeX 里完全合法(盒间轻微重叠),不该挡。
-
-### 5. 多行段落:`\ht` 参照的是**末行**基线
-
-`\vbox` 的 `\ht = 首行高度 + (n−1)·行距`,它的参考点是**末行基线**。
-
-所以「上一行基线 → 本段首行基线」的距离不是 `pd + kern + ht`,
-而是 `pd + kern + ht − (n−1)·行距`。漏掉这一项,多行段自己被推下一整行,
-其后所有行跟着错(实测 0.48 而非 14.04)。
-
-⇒ 用 `\prevgraf` 取段内行数,把 `(n−1)·行距` 加回 `kern`。`\dp` 不用改 ——
-`\vbox` 的 `\dp` 就是末行的真实深度。
-
-⚠️⚠️ `\prevgraf` 有两道坎,两个都踩过:
-- 必须在 `\vbox` **内部**取 —— 盒一关闭就恢复成外层值(实测把 2 读成 0)
-- 必须在 `\par` **之后**取 —— 它是在段落断行那一步才被写入的(`\par` 前读到仍为 0)
-
-### 6. `\vbox to N` 设的是**高度**,深度另计
-
-若最后一项是带深度的 `\box`,`\vbox to N` 的 `\dp` 就是那个深度,
-**总高变成 `N + 深度`**。本表末行深 3.11,于是 R0 变成 287.11 而非 284.00,
-四条横线全部下移。
-
-⇒ 末尾补一条 `\vskip\z@`:让末项变成胶(胶无深度),`\dp` 归零,
-总高才正好等于 `N`。见 `\sx@cellvf`。
-
-## 与原件的有意差异
-
-| 项 | docx | 本模板 | 说明 |
-| :-- | :-- | :-- | :-- |
-| 字体 | 宋体 SimSun | OUC Serif(思源宋体子集) | 原用系统字体。改仓库公共字体包 `../fonts/`,换机器/换系统都能编,且允许分发 |
-| 标题字体 | 方正小标宋简体 | OUC Serif **真粗体** | 小标宋是商业字体,本库不分发。按 `课程执行大纲/` 的既定做法换真粗体:小标宋本就是宋体的标题变体,真粗体比伪粗更接近,笔画不糊 |
-| 第 3 条备注编号 | 手打的「 3. 」,无 `numPr` | 与前两条统一排齐 | 唯一的位置差异:原件该条比前两条偏 0.36 bp。原件是漏配自动编号后手打的,属笔误;本模板统一对齐 |
-| R0 描述区留白 | 8 个空段 | 上下两半 + 中间 `\vfil` | 见上文「关于 `\sxdesc`」。描述长短不再影响签名区位置 |
-
-除此之外**没有**任何版式差异。
-
-## 实测偏差
-
-不用肉眼看 PDF,直接用 `pymupdf` 取矢量坐标,与 Word 2007 导出的 PDF 逐项相减:
-
-```python
-span['origin'] # 真实基线坐标(bbox 顶端受字形上伸部影响,误差约 2 bp)
-page.get_drawings() # 每条线的精确端点
+```latex
+\begin{document}
+\sxform
+\end{document}
```
-结果(33 个文字元素 + 6 条线,`dY`/`dX` 为「本模板 − 原件」,单位 bp):
+表格内容:
-| 元素 | dY | dX |
-| :-- | :-- | :-- |
-| 标题 | 0.00 | −0.01 |
-| 四条表格横线 | 0.00 | — |
-| 事项描述 / 描述首行 / 次行 | 0.00 | +0.03 |
-| 兹证明 | 0.00 | +0.04 |
-| 项目负责人(签名) | 0.00 | +0.03 |
-| 年月日(三处,各 3 字) | 0.00 | +0.03 |
-| 项目负责人是 / 责任。/ 非科研经费 | 0.00 | +0.03 |
-| 本人证明 / 单位负责人 / 单位公章 | 0.00 | +0.03 |
-| 学院对本单位 | 0.00 | +0.03 |
-| 科技管理 / 负责人签字 / 单位公章 | 0.00 | +0.03 |
-| 备注四条 | −0.01 | −0.42 ~ −0.82 |
-| 页码 | 0.00 | 0.00 |
+| 区段 | 内容 |
+|---|---|
+| 标题 | 特殊事项说明表 |
+| 事项描述 | `\sxdesc` 的内容,占主表区 |
+| 签字栏 | 三处签字与日期 |
+| 表尾 | 说明条款 |
-**33 个文字元素的 dY 全部 0.00**(< 0.005 mm),dX ≤ 0.04 bp,
-唯备注区 dX 偏 0.42~0.82 bp(约 0.15~0.29 mm,肉眼不可辨)——
-那是 OUC Serif 与 SimSun 的字宽差累积,不是定位误差。
+## 常用命令
-像素级差分(150 dpi)总差异 3.03%,且每条差异带都精确落在有文字的行上,
-**没有整体错位的偏移带** —— 3% 全是字形轮廓不同造成的。
+| 命令 | 用途 |
+|---|---|
+| `\sxform` | 印出整张表 |
+| `\sxtitle{标题}` | 改主标题文字 |
+| `\sxtable` | 只印表格部分(不含标题) |
+| `\sxnotes` / `\sxnoteitem` | 表尾说明条目 |
+| `\sxfootcontent` | 表尾内容 |
+| `\sxfonttitle` / `\sxfontbody` / `\sxfontsign` / `\sxfontfoot` | 各区块字体设置 |
-## 校验方法
+## 版式
-量矢量而不是量像素:
-
-```bash
-pdftocairo -svg 特殊事项说明表.pdf out.svg # 线条精确坐标
-pdftotext -bbox 特殊事项说明表.pdf out.xml # 字块坐标
+```
+A4,单页
+标题黑体,正文宋体,签字栏楷体
+三处签字:项目负责人 / 单位负责人 / 科技管理部门
```
-或用 `pymupdf`(本模板就是这么核的):`page.get_drawings()` 取线,
-`get_text('rawdict')` 取 `span['origin']` 作基线。
+## 注意
-⚠️ 注意 `bp` 与 `pt` 的不同:PDF 用户单位是 **bp**(1/72 in),
-LaTeX 的 `pt` 是 1/72.27 in,差 0.375%。A4 上累积到 2 pt,
-超过一个字符宽。**本包凡与 PDF 对齐的几何量一律用 `bp`**。
\ No newline at end of file
+示例内容是虚构数据,使用时整段替换 `\sxdesc`。签字与日期栏留空手填。
\ No newline at end of file
diff --git a/科技报告/README.md b/科技报告/README.md
index 261d0d8..4ea5136 100644
--- a/科技报告/README.md
+++ b/科技报告/README.md
@@ -1,84 +1,130 @@
-# 中国海洋大学科技报告 LaTeX 模板
+# 科技报告
-一个基于 `ctexart` 的科技报告模板,可用于撰写科技报告、实验讲义、教程、说明文档等。
+科技报告、实验讲义、教程、说明文档,A4 多页,含封面、摘要、目录、正文。
-> 本目录原为独立仓库 `ouc-report-latex-template`,2026-10 起并入 `ouc_latex_template` 统一维护,旧仓库不再更新。
+## 编译
-## 特性
-
-- **中英文字体一体化**:英文默认使用鸿蒙字体(HarmonyOS Sans),中文使用仓库公共字体包(宋体 / 宋体粗 / 楷体 / 仿宋 / 黑体),字体文件在仓库根 `../fonts/` 目录,编译时自动调用,**无须安装任何字体**;
-- **模块化文档类**:`report.cls` 按功能拆分为 `cls/` 下的多个模块(全局设定、字体、页面布局、标题、页眉页脚、信息框、代码块等),便于按需修改;
-- **三种信息框**:`titledbox`(带标题)、`notebox`(提示)、`importantbox`(重要),基于 tcolorbox 实现;
-- **代码排版**:基于 listings 预设了多种样式,支持行内命令 `shellbox` / `invertedshellbox` 展示 shell 命令及输出;
-- **自动水印**:默认以「单位 + 部门」作为全页水印,可在 `input/setting.tex` 中调整文字、透明度与大小;
-- **图表与引用**:tabularx 表格、图片插入、自动编号与交叉引用、目录 / 图目录 / 表目录;
-- **图标支持**:通过 fontawesome 可直接使用 `\faHeart` 等图标命令(详见根目录 `fontawesome.pdf`)。
-
-## 环境要求
-
-- **TeX 发行版**:TeX Live 2022 及以上(必须使用 **XeLaTeX** 编译);
-- 无需额外安装字体或其他依赖,使用 `scheme-full` 或包含常用宏包的发行版即可。
-
-## 使用方法
-
-1. 本目录是 `ouc_latex_template` 仓库的 `科技报告/` 子目录,克隆主仓库即可:
- ```bash
- git clone https://code.yangyq.net/laoyang/ouc_latex_template.git
- cd ouc_latex_template/科技报告
- ```
-2. 在 `input/info.tex` 中填写标题、副标题、作者、单位、部门等信息;
-3. 在 `report.tex` 中撰写正文(或按 `\input` 方式组织章节文件);
-4. 使用 XeLaTeX 编译**两遍**(第一遍生成目录与交叉引用信息,第二遍写入正文):
-
- ```bash
- xelatex report.tex
- xelatex report.tex
- ```
-
-5. 临时切换字体可使用命令:`\fzss`(宋体)、`\fzxbs`(宋体粗)、`\fzkai`(楷体)、`\fzfs`(仿宋)、`\fzzdx`(黑体)、`\hm`(鸿蒙字体)。命令名沿用旧版(fz 取自原方正系列),实际用的是随仓库分发的开源字体,对应关系见 `cls/font.cls` 的注释。
-
-## 署名与联系方式(二次分发前请修改)
-
-模板里有两处「作者 / 联系方式」信息,**性质不同,别改错地方**:
-
-| 想改什么 | 改哪个文件的哪里 | 说明 |
-|---|---|---|
-| **模板维护者**的联系方式 | `report.cls` 顶部的 `Maintainer:` 一行 | 目前是占位符 `someone@example.com`。它只出现在注释里,**不参与排版**,改成什么都不会影响编译结果 —— 你要把这份模板再分发出去,就换成你自己的。 |
-| **报告本身**的作者 / 单位 / 部门 | `input/info.tex` 里的 `\theauthor`、`\theaffiliation`、`\thedept` | 会印在**封面**上;单位与部门还会成为全页**水印**(水印的文字、透明度、大小在 `input/setting.tex` 里调)。 |
-
-> 也就是说:`report.cls` 顶部那行与你的报告内容无关;报告里显示的作者信息一律在 `input/info.tex`。
-
-## TeX Live 版本兼容性
-
-同一份源码在下列 TeX Live 版本下均可直接编译(XeLaTeX),**不需要切分支、不需要改代码**:
-
-| TeX Live | 状态 |
-|------|------|
-| 2022 | 已验证通过(基线) |
-| 2023 | 已验证通过 |
-| 2024 | 已验证通过 |
-| 2025 | 已验证通过 |
-| 2026 | 已验证通过 |
-
-> 本目录原为独立仓库 `ouc-report-latex-template`,曾按 TeX Live 年份维护多套分支。
-> 2026-10 并入 `ouc_latex_template` 后**只保留 `main` 一份源码**(已实测各年份通用),
-> 旧仓库的分支不再更新。
-
-## 目录结构
-
-```
-.
-├── report.cls # 文档类(模块化加载 cls/ 下各子模块)
-├── cls/ # 功能模块:全局设定、字体、页面、标题、信息框、代码块等
-├── input/ # 文档内容:封面、目录、摘要、信息与整体设置
-├── figs/ # 图片资源
-├── (字体在仓库根 fonts/) # 不再自备字体,详见 ../fonts/README.md
-├── fontawesome.pdf # fontawesome 图标使用手册
-└── report.tex # 主文件(XeLaTeX 编译入口)
+```bash
+cd 科技报告
+xelatex report.tex
+xelatex report.tex % 跑两遍,目录与交叉引用才正确
```
-## 关于 `report.pdf`
+或仓库根:`bash build.sh 科技报告`(自动跑两遍)
-仓库内的 `report.pdf` 是成品样张,用于预览效果。封面的日期取自 `\today`,
-所以**每次编译都会变**;用不同年份的 TeX Live 编译,PDF 体积也可能略有差异,
-但**页面渲染内容一致**。以 `report.tex` 源码为准。
+## 文件
+
+```
+科技报告/
+├── report.tex 主文件(一般不改,只做 \input)
+├── input/ 内容与设置
+│ ├── info.tex ← 标题、作者等信息,改这里
+│ ├── setting.tex ← 页面、水印等设置
+│ ├── cover.tex 封面
+│ ├── toc.tex 目录
+│ ├── abstract.tex 摘要
+│ └── main/ 正文各章
+├── cls/ 版式模块(11 个)
+├── figs/ 插图
+└── logos/ 校徽等标识
+```
+
+## 改标题信息
+
+编辑 `input/info.tex`:
+
+```latex
+\newcommand{\themaintitle}{这是一个很好用的LaTex模板} % 标题
+\newcommand{\thesubtitle}{这里是副标题} % 副标题
+\newcommand{\theauthor}{作者名字} % 作者
+\newcommand{\thedate}{\today} % 时间
+\newcommand{\theaffiliation}{中国海洋大学} % 工作单位
+\newcommand{\thedept}{计算机科学与技术学院} % 部门
+```
+
+| 参数 | 说明 |
+|---|---|
+| `\themaintitle` | 标题 |
+| `\thesubtitle` | 副标题 |
+| `\theauthor` | 作者 |
+| `\thedate` | 日期,可写 `\today` 或具体日期 |
+| `\theaffiliation` | 工作单位 |
+| `\thedept` | 部门 |
+
+## 改正文
+
+`input/main/` 下按章分文件,`report.tex` 里按顺序 `\input`。
+
+```latex
+\chapter{第一章标题}
+正文内容。
+
+\section{节标题}
+\subsection{小节标题}
+```
+
+标准 LaTeX 章节命令。增删章节时改 `report.tex` 里的 `\input` 列表。
+
+## 改封面与摘要
+
+- `input/cover.tex` — 封面版式,一般不改
+- `input/abstract.tex` — 摘要内容,替换其中的文字
+
+## 页面设置
+
+`input/setting.tex` 里可调:
+
+```latex
+\SetWatermarkText{\theaffiliation\thedept} % 水印文字
+```
+
+水印颜色在同一文件里:
+
+```latex
+ouwblue!4!white % 想更淡改成 3,想明显改成 8
+```
+
+## 版式模块
+
+`cls/` 下 11 个模块各管一块,需要改版式时按名字找:
+
+| 模块 | 管什么 |
+|---|---|
+| `global.cls` | 全局设置 |
+| `geometry.cls` | 页面尺寸与边距 |
+| `font.cls` | 字体与字号 |
+| `color.cls` | 配色(海大蓝等) |
+| `title.cls` | 标题页 |
+| `headandfoot.cls` | 页眉页脚 |
+| `boxes.cls` | 盒子环境 |
+| `code.cls` | 代码块 |
+| `figs.cls` | 插图设置 |
+| `chinesename.cls` | 中文名称(图、表、参考文献等) |
+| `hyperref.cls` | 超链接设置 |
+
+## 插图
+
+图片放 `figs/`,正文里:
+
+```latex
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width=0.8\textwidth]{figs/xxx.png}
+ \caption{图标题}
+ \label{fig:xxx}
+\end{figure}
+```
+
+## 版式
+
+```
+A4,多页
+封面 + 摘要 + 目录 + 正文
+页眉页脚含章节名与页码
+整页带极浅水印(单位名称)
+正文宋体,标题黑体
+```
+
+## 注意
+
+示例内容为占位文字,使用时全部替换。
\ No newline at end of file
diff --git a/简历/README.md b/简历/README.md
index 94a89d1..d2ee3a0 100644
--- a/简历/README.md
+++ b/简历/README.md
@@ -1,374 +1,140 @@
-# 中国海洋大学个人简历 LaTeX 模板
+# 简历
-中文个人简历模板,A4 单页两栏式排版:左侧窄栏放时间与阶段,右侧宽栏放具体内容,抬头带圆形头像与联系方式图标行。
-
-> 本目录的版式来自一份在用的中文简历(`awesome-source-cv` 系的衍生版)。**字体、占位内容、头像三处都已重做**,详见下文「与上游的差别」。
-
-## 特性
-
-- **字体全部取自仓库公共字体包**:中文 OUC Serif(宋体)/ OUC Sans(黑体)/ OUC Kai(楷体)/ Zhuque Fangsong(仿宋),西文 Cochineal,图标 FontAwesome —— 没有任何一个字体来自系统或 TeX Live 安装,**换机器编译结果一致**;
-- **真粗体**:标题、姓名、区块头用的都是字体自带的粗体,不是算法描边;
-- **分区可拆**:`section_01` ~ `section_10` 各自一个文件,不想要哪块就把对应 `\input` 注释掉;
-- **圆形头像**:`\photo{2.5cm}{photo}` 自动裁成圆形,尺寸随参数走;
-- **条目化排版**:论文、专利、项目、获奖等用 `\emptySeparator` 分条,时间栏自动对齐。
-
-## 环境要求
-
-- TeX Live 2022 及以上,**必须 XeLaTeX** 编译;
-- 不需要安装任何字体,`fonts/` 里有全套。
+个人简历,A4,中文,两栏式,含圆形头像与分区条目。
## 编译
-在**本目录**下编译(不要在仓库根调用,`fonts.tex` 里的 `Path=../fonts/` 是相对当前工作目录的):
-
```bash
cd 简历
xelatex 简历.tex
-xelatex 简历.tex # 必须跑两遍,原因有二:
- # ① 页码与交叉引用
- # ② 概述的成果数字读自 简历.cvnum,第一遍是空的
+xelatex 简历.tex % 跑两遍,目录与页码才正确
```
-用 `latexmk -xelatex 简历.tex` 也行,它自己会跑够遍数。
+或仓库根:`bash build.sh 简历`(自动跑两遍)
-编译结果:3 页,日志零 error、零 Underfull、零 Overfull。嵌入字体只有 7 个,全部来自本仓库:
+## 文件
-| 字体 | 用途 |
+```
+简历/
+├── 简历.tex 主文件
+├── awesome-source-cv.cls 文档类
+├── section_XX_*.tex 各章节内容(14 个)
+├── photo.jpg 头像
+└── logos/ 单位标识
+```
+
+## 基本信息
+
+```latex
+\documentclass[localFont]{awesome-source-cv}
+\input{../fonts.tex}
+\usepackage{xeCJK}
+
+\name{}{张远航} % 姓名,第一参数是西文名,中文留空
+\photo{2.5cm}{photo} % 头像,photo.jpg
+
+\socialinfo{
+ \smartphone{(+86) 138 0000 0000}
+ \email{yhzhang@ouc.edu.cn}
+ \emailO{yhzhang@example.net}\\
+ \homepage{https://example.net}
+ \github{yourname}
+}
+```
+
+| 命令 | 说明 |
|---|---|
-| `OUCSerif-Regular` / `OUCSerif-Bold` | 中文正文与标题 |
-| `Cochineal-Roman` / `-Bold` / `-Italic` | 西文正文、标题与斜体 |
-| `OUCKai-Regular` | 中文斜体(楷体代斜体,中文惯例) |
-| `FontAwesome` | 联系方式行图标 |
+| `\name{西文名}{中文名}` | 姓名,中文简历第一参数留空 |
+| `\photo{宽度}{文件名}` | 头像,文件名不带扩展名 |
+| `\socialinfo{...}` | 联系方式块 |
+| `\smartphone{号码}` | 手机 |
+| `\email{地址}` | 邮箱 |
+| `\emailO{地址}` | 备用邮箱 |
+| `\homepage{网址}` | 个人主页 |
+| `\github{用户名}` | GitHub |
+| `\linkedin{用户名}` | LinkedIn |
-## 改什么、在哪儿改
+`\socialinfo` 内不要加结尾的 `\\`。不想要头像就删掉 `\photo` 整行。
-| 要改的内容 | 位置 |
+## 各章节
+
+正文按 `\input` 顺序组织,每章一个文件:
+
+```latex
+\begin{document}
+\maketitle
+
+\input{section_01_headline}
+\input{section_02_work_experience}
+\input{section_03_education}
+\input{section_04_publications}
+\input{section_05_patents}
+\input{section_06_software}
+\input{section_07_project}
+\input{section_08_zhuanhua}
+\input{section_09_jiaoyan}
+\input{section_10_awards}
+\input{section_interests}
+\input{section_languages}
+\input{section_skills}
+\input{section_references}
+\end{document}
+```
+
+| 文件 | 内容 |
|---|---|
-| 姓名、职称、联系方式 | `简历.tex` 的 `\name` / `\tagline` / `\socialinfo` |
-| 头像 | 替换 `photo.jpg`(正方形,400×400 以上,会自动裁圆) |
-| 各区块正文 | `section_01_headline.tex` ~ `section_10_awards.tex` |
-| 不想显示的区块 | 在 `简历.tex` 里把对应 `\input` 注释掉 |
-| 左侧时间栏宽度 | `awesome-source-cv.cls` 的 `\setlength{\leftcolumn}{2.5cm}`,右侧栏宽会自动跟着算 |
-| 主题色 | `awesome-source-cv.cls` 的 `accentcolor` |
+| `section_01_headline` | 个人概述 |
+| `section_02_work_experience` | 工作经历 |
+| `section_03_education` | 教育经历 |
+| `section_04_publications` | 学术论文 |
+| `section_05_patents` | 发明专利 |
+| `section_06_software` | 软件著作权 |
+| `section_07_project` | 科研项目 |
+| `section_08_zhuanhua` | 成果转化 |
+| `section_09_jiaoyan` | 教研工作 |
+| `section_10_awards` | 获奖 |
+| `section_interests` | 兴趣爱好 |
+| `section_languages` | 语言能力 |
+| `section_skills` | 专业技能 |
+| `section_references` | 推荐人 |
-## 与上游的差别(改动都在文件头注释里写明了原因)
+不需要的章节把 `\input` 那行注释掉即可。
-### 1. 字体:三层依赖全部拆掉
-
-上游那份简历的字体走三条路,每条都不能随仓库分发或不可复现:
-
-| 上游做法 | 问题 | 本模板的处理 |
-|---|---|---|
-| `zh_cn-adobefonts_external.sty` 设 Adobe 宋/黑/楷/仿 | 56 MB 商业字体,无授权不可分发 | **删掉这两个文件**,改由 `../fonts.tex` 提供中文字体 |
-| `awesome-source-cv.cls` 的 `localFont` 分支设 `SourceSansPro-*`(9 个 .otf) | 同上,且与仓库已有西文字体重复 | cls 里的 `\setmainfont` 整段删除,西文改走 `../fonts.tex` 提供的 Cochineal |
-| `fontawesome.sty` 用字体名找系统 FontAwesome | 机器上没装就编不过 | 改成显式 `Path=../fonts/fontawesome/`,字体文件已入仓库 |
-
-删掉的两个文件里还有个隐藏问题值得记一笔:原 `zh_cn-adobefonts_external.sty` 里
-`BoldFont` / `ItalicFont` / `SmallCapsFont` **全部指向 `Regular` 那一档** ——
-等于加粗不变、斜体不变,标题层次全靠字号撑。换成真粗体后版面明显立起来了。
-
-### 2. 内容:真人信息全部换成一套完整虚构示例
-
-模板必须能公开分发,所以原件里的真人姓名、手机、邮箱、住址、出生年月、论文题名与 DOI、
-专利号、软著登记号、获奖名称**一个都没保留**。
-
-替换方式**不是全打 `×××`**——满篇叉号的样张既看不出排版效果,也没法直接对着改,
-一页纸全是 ×,读的人都不知道哪行该填什么。所以填的是**一整套自洽的虚构人物**:
-
-| 项 | 虚构值 |
-|---|---|
-| 姓名 / 单位 | 张远航,中国海洋大学 信息科学与工程学部 计算机科学与技术学院 **教授、博导** |
-| 出生 / 籍贯 | 1985.03,山东青岛 |
-| 方向 | 海洋遥感信息处理、机器学习与海洋大数据 |
-| 手机 / 邮箱 | `(+86) 138 0000 0000` / `yhzhang@ouc.edu.cn` |
-| 学历 | 2002–2006 本科 → 2006–2009 硕士 → 2009–2013 博士(2011–2012 南安普顿大学联培) |
-| 工作 | 2013.07 博士后 → 2016.09 副教授 → 2021.12 教授 |
-
-正文十节(`section_01`~`section_10`)也一并填满:80 余字个人简介、3 段工作经历、
-4 段学历、9 篇论文、9 项专利、5 项软著、5 个项目、3 项成果转化、4 项教研项目、16 项获奖。
-
-**假数据都留了肉眼可辨的标记**,不会被人误当真的抄走:
-
-- 论文 DOI 统一 `10.9999/…`(`.9999` 段是编造专用段,真实 DOI 不走这里)
-- 专利号统一 `ZL20999900000N.x`,软著登记号统一 `2024SR999990N`
-- 期刊名是真实的(IEEE TGRS、Remote Sensing 等),但**题名全是编的**
-- 成果转化的受让单位一律带「(示例)」后缀
-- 头像 `a.jpg` / `a.png`(2085×2085 的真人照)换成 PIL 生成的 400×400 中性剪影 `photo.jpg`
-
-替换时把 `section_01`~`section_10` 整段换成自己的即可,版式不受影响;
-字数变化会自动重排,不需要动 `.cls`。
-
-### 3. 排版小修
-
-- **项目经验不再「缩进一大截」**:这一节原来整块右移了约 3.4 cm,与其他章节的
- 日期列对不齐(145.1pt vs 48.5pt)。根因不是 `\hfill` 也不是竖线,而是
- `\rightcolumnlength` **算早了**——`geometry` 的边距要到导言区结束才生效,
- 而 cls 里那句 `\setlength` 执行得更早,读到 article 默认的 345pt 文字宽,
- 算出 249.87pt,比应有的 417.02pt 少了 167.15pt;`longtable` 把这张窄表居中排,
- 于是整块右移 167.15/2 ≈ 83.6pt。修法两条:计算挪进 `\AtBeginDocument`
- (并额外减去 `|` 竖线的 `\arrayrulewidth`=0.4pt);`R` 列由
- `>{\hfill}m{2.5cm}`(固定宽右贴)改为 `>{\raggedright\arraybackslash}p{2.5cm}`。
- 改后日期左边缘 145.1 → **48.5pt**,与工作经历/教育经历/奖励与荣誉严格一致。
- ⚠️ 这类错误**零 error、零 warning**,只看日志发现不了,必须量 PDF 坐标。
-- **左栏宽度改按版心反算**:原来 `\leftcolumn 2.5cm + \rightcolumnlength 14.8cm`
- 看着小于版心 18 cm,但两列共 4 个 `\tabcolsep`(≈0.85 cm)没算进去,实际 18.15 cm,
- 日志有 `Overfull 4.48pt`。改成由 `\textwidth` 减去左列、列间距与竖线宽度,
- 改页边距也不用再调数字。
-- **中西文之间加断行弹性**:论文条目里「…Applications (ICIEA), 88--93. 中国青岛…」
- 这类「长英文名紧跟中文」的串,XeLaTeX 默认不在中英交界处断开,会把整串当
- 一个长单词硬冲出去(实测冲出 88.5pt,文字顶到纸边)。给 itemize 加
- `\emergencystretch=3em` 解决,不动字体、不改内容、不影响其他环境。
-- **抬头去掉两处空盒**:`\vspace*{0.3cm}\\` 和 `\smallskip\\` 会在换行前多产生一个
- 空 hbox(日志刷 `Underfull \hbox (badness 10000)`),改成 `\\[0.3cm]` /
- `\\[\smallskipamount]`,间距效果不变。
-- **`\socialinfo` 末尾不要留 `\\`**:`简历.tex` 里最后一行 `\address{...}` 后面加了
- `\\` 同样会多一个空行。中间的 `\\` 是分行,必须保留。
-
-### 4. 西文字体换成 Cochineal
-
-中文用思源宋体(中等粗细),原先配的 **TeX Gyre Termes** 是 Times 的度量兼容替代,
-笔画偏细偏紧,中英混排时西文那一段视觉上会「陷进去」。改用 **Cochineal**
-(Michael Sharpe 据 Minion 设计,SIL OFL 1.1,920 KB 已入 `../fonts/cochineal/`)。
-
-| 字体 | 同一句英文宽(10pt) | 相对 Termes | x 高 |
-|---|---|---|---|
-| TeX Gyre Termes(原) | 229.68pt | 100.0% | 0.450 |
-| **Cochineal(现)** | 225.42pt | **98.1%** | 0.433 |
-| Libertinus Serif | 234.62pt | 102.2% | 0.433 |
-| XCharter | 246.69pt | 107.4% | 0.481 |
-| TeX Gyre Pagella | 254.40pt | 110.8% | 0.472 |
-
-选 Cochineal 的理由是**宽度几乎不变(窄 1.9%)**,断行位置和表格列宽基本不动;
-Pagella / XCharter 宽 7~11%,会把全库的断行推着变。
-
-⚠️ 三点务必注意:
-
-1. **只影响简历**。切换命令 `\oucUseCochineal` 定义在 `../fonts.tex`,
- 但**不是**全局生效,只有本模板的 cls 调用。改全库请改 `\setmainfont` 本身。
-2. **必须放在 `\AtBeginDocument` 里**。cls 执行时主文件还没 `\input{../fonts.tex}`,
- 那个命令尚未定义,直接调用会报 `Undefined control sequence`。
-3. **换西文字体后必须复查 Overfull**。字体窄 1.9% 会让断点位置整体前移,
- 原本「刚好挤进去」的长串就会暴露成真溢出——本次换字体就是这样才发现
- ICIEA 那条论文冲出 88.5pt 的。
-
-### 5. 左上角校徽(可选)
-
-默认**不印**校徽,`简历.tex` 里加一行才出现:
+## 章节写法
```latex
-\cvlogo{28mm} % 横式彩色校徽(默认)
-\cvlogo{28mm}[ouc_logo_彩色] % 换圆形校徽
-\cvlogo{28mm}[ouc_横式_海大红] % 换配色
+\sectionTitle{工作经历}{\faUniversity}
+
+\begin{tabular}{rl}
+ \textsc{2021年12月 --至今} & \textbf{教授},信息科学与工程学部,中国海洋大学\\
+ \textsc{2016年09月 --2021年11月} & \textbf{副教授},信息科学与工程学部,中国海洋大学
+\end{tabular}
```
-位置默认距**纸边**左 10mm、上 6mm(不随页边距变),导言区可微调:
+- `\sectionTitle{标题}{图标}` — 章节标题,图标用 fontawesome
+- 两列 `tabular`:左列时间(`\textsc` 小型大写),右列内容
+- 时间用 `--` 排连接号,前后不加空格
-```latex
-\setlength{\cvlogox}{12mm}
-\setlength{\cvlogoy}{8mm}
+常用 fontawesome 图标:
+`\faUniversity`(学校)、`\faBriefcase`(工作)、`\faGraduationCap`(教育)、
+`\faBook`(论文)、`\faCogs`(软著)、`\faFlask`(项目)、
+`\faTrophy`(获奖)、`\faHeart`(兴趣)、`\faGlobe`(语言)。
+
+## 换头像
+
+替换 `photo.jpg`,或改 `\photo{2.5cm}{新文件名}`。图片要是方形,
+会裁成圆形。
+
+## 版式
+
+```
+A4,单页或多页
+中文正文 OUC Serif,西文 Cochineal
+左栏较窄(时间),右栏较宽(内容)
+章节标题带图标与分隔线
+头像为圆形,右上角
```
-`简历/logos/` 下**只放实际用到的那一个**(横式彩色,377 KB)。想换款式从
-`../科技报告/logos/` 复制过来——那边是全部官方 VI 素材:
+## 注意
-| 文件 | 形状 | 像素 |
-|---|---|---|
-| `ouc_logo_{彩色,海大红,海大蓝,天蓝,专金,墨黑}.png` | 圆形 | 1200×1200 |
-| `ouc_横式_{彩色,海大红,海大蓝,黑}.png` | 横式 | 2400×640 |
-
-不预先全放进来,是因为每个 300~380 KB,用不到就是纯占体积。
-
-⚠️ 四点务必注意:
-
-1. **28mm 是这块空间的上限附近**。简历页边距只有 15mm,姓名墨迹顶在 17.2mm;
- 28mm 宽的横式 logo 高 7.06mm,放在距顶 6mm 处下沿到 13.1mm,距姓名仍有
- 11.6pt(4.1mm)。再大就会挤到姓名。
-2. **距顶不能照搬科技报告的 20mm**。科技报告页边距 27mm,简历只有 15mm,
- 照抄会直接压到姓名上。同理距顶 8mm 只剩 2mm 间隙,视觉上贴着。
-3. **必须用负 `\vspace*{-17pt}` 抵消**。`tikzpicture` 即使内容全是 `overlay`,
- 本身仍占一行高度(17pt),会把姓名整体往下推。`\smash`、`\hbox to 0pt`、
- `\vbox to 0pt` 三种写法都消不掉——要断行就得有 `\par`,有 `\par` 就有行高。
- 这 17pt 与 logo 尺寸无关(18~30mm 五档实测一致),改 `\parskip` 或正文字号
- 后需重新量。
-4. **位置偏小,专业印刷需上调**。距纸左 10mm 已接近 A4 裁切余量(一般
- 10~12mm),距顶 6mm 也偏紧。屏幕阅读和普通办公打印没问题(A4 不裁切),
- 若要印刷装订,把 `\cvlogoy` 改成 8mm 以上,并接受 logo 与姓名靠得近一点。
-
-⚠️ 体积代价:PDF 从 158 KB 涨到 573 KB(内嵌 2400×605 的原图,实际只用到
-28mm ≈ 660px,约 3.6 倍冗余)。保留原图是为了将来放大不糊;真要瘦身,
-把 png 缩到 700px 宽即可。
-
-## 概述里的成果数字自动统计
-
-第一段概述通常要写「发表论文 N 篇、授权专利 M 项、转化 K 项……」。这些数字如果
-手写,每增删一条论文就得回头改概述,非常容易漏改。本模板让它们**自动从正文条目
-数出来**。
-
-### 先回答一个最常问的问题:它是全自动的吗?
-
-**分两种,取决于章节用哪种写法。**
-
-| 写法 | 要手动做什么 | 适合什么章节 |
-|---|---|---|
-| **`cvlist` 环境**(全自动) | **什么都不用做**。写 `\item` 就自动算一条。 | 一条 = 一个成果的章节:软著、成果转化、教研项目 |
-| **`\cvmark` 逐条标记**(半自动) | 每条末尾加一个 `\cvmark{类别}` | 一条要算进**多个类别**的章节:专利(要同时算「专利」和「第一发明人」)、科研项目(要同时算「科研项目」和「主持/负责」) |
-| **`\cvtagcount`**(半自动) | 每条末尾写 `\cvtagcount{SCI}`,替代原来的 `\textbf{SCI}` | 论文(收录类型本来就要显示出来,顺手计数) |
-
-也就是说:**三个你关心的章节(软著、成果转化、教研项目)已经是全自动的,不需要
-任何标记。** 增删条目后重新编译,概述里的数字自己就变了。
-
-### 全自动写法:`cvlist` 环境
-
-这是最省事的方式。原来写 `\begin{itemize}`,现在改成 `\begin{cvlist}{类别}`,
-其他一个字都不用动:
-
-```latex
-% 软著章节
-\sectionTitle{软件著作权}{\faTv}
-\begin{cvlist}{软著} % ← 只改这一行(原来是 itemize)
- \item 某某系统. 2024SR9999901. 软著登字第 9999901 号.
- \item 另一个系统. 2023SR9999902. 软著登字第 9999902 号.
-\end{cvlist} % ← 和这一行(原来是 \end{itemize})
-
-% 概述里
-登记软件著作权 \cvnum{软著} 项 % → 自动印出「2」
-```
-
-**就这样。** 以后加一条只是多写一个 `\item ...`,数字自动从 2 变 3;
-删一条自动变 1。不需要回来改概述,也不需要在条目里加任何标记。
-
-实测过的行为:
-
-| 操作 | 概述里的数字 |
-|---|---|
-| 原始 5 条 | 5 |
-| 加 1 条 | **6**(自动) |
-| 删 2 条(剩 3 条) | **3**(自动) |
-| 还原 | 5 |
-
-⚠️ `cvlist` 内部就是普通 `itemize`,**版面完全不变**(已逐行比对过,行数、
-位置一字不差)。
-
-⚠️ 不要在 `cvlist` 里再嵌套 `itemize` 写子项——子项的 `\item` 也会被算进去,
-数字会偏大。需要子项就用普通 `itemize` + 手写 `\cvmark`。
-
-### 半自动写法:`\cvmark` 与 `\cvtagcount`
-
-有些章节一条要算进**两个**类别,`cvlist` 一次只能管一个类别,这时用逐条标记。
-
-```latex
-% 专利:一条既算「专利」又可能要算「第一发明人」
-\item \textbf{张远航}, 李文博, 陈思远. 某某方法. ZL209999000001.9. 2024-05-14.
- \cvmark{专利}\cvmark{第一发明人} % ← 加标记(不产生可见输出)
-
-% 论文:收录类型本来就要显示,用 \cvtagcount 一步到位
-\item \textbf{张远航}, 李文博. 某某论文. IEEE TGRS, 62, 1, (2024), 1--15.
- DOI: 10.9999/TGRS.2024.0000001.\cvtagcount{SCI} % ← 显示 SCI 并计数
-```
-
-`\cvtagcount{SCI}` 等价于「印出加粗的 SCI」+「SCI 计数 +1」,所以**不要**写回
-`\textbf{SCI}`——那样只显示不计数,概述会少算。
-
-⚠️ 这种写法下,增删条目时**标记要跟着走**。删掉一条论文但留下 `\cvtagcount{SCI}`,
-数字就会多算一个。这是它的代价;能用 `cvlist` 的章节就别用这种。
-
-### 现有类别一览
-
-| 类别 | 章节 | 写法 | 概述里的用法 |
-|---|---|---|---|
-| `SCI` `EI` `核心` | `section_04` 论文 | `\cvtagcount{}` 每条末尾 | `\cvnum*{SCI,EI,核心}` |
-| `专利` `第一发明人` | `section_05` 专利 | `\cvmark{}` 每条末尾 | `\cvnum{专利}` / `\cvnum{第一发明人}` |
-| `软著` | `section_06` 软著 | **`cvlist` 全自动** | `\cvnum{软著}` |
-| `科研项目` `主持` `负责` | `section_07` 项目 | `\cvmark{}` 描述块内 | `\cvnum{主持}` / `\cvnum{负责}` |
-| `转化` | `section_08` 成果转化 | **`cvlist` 全自动** | `\cvnum{转化}` |
-| `教研` | `section_09` 教研项目 | **`cvlist` 全自动** | `\cvnum{教研}` |
-
-### 概述里怎么取数
-
-```latex
-\cvnum{软著} % 单类:印出数字,没这个类别就印 0
-\cvnum*{SCI,EI,核心} % 多类求和(注意是英文逗号)
-```
-
-**列几条就算几条**,不需要额外声明总数。空类别返回 `0` 而不是报错,所以可以先
-写 `\cvnum{EI}`,等真有了 EI 论文再加 `\cvtagcount{EI}`,中间不会有编译问题。
-
-### 加一个全新的类别
-
-比如想统计「一区论文」,三步:
-
-```latex
-% ① 条目上标记(论文类用 cvtagcount,其他用 cvmark)
-\item ...论文... \cvtagcount{一区}
-
-% ② 概述里取数(不用任何注册,直接写)
-其中一区论文 \cvnum{一区} 篇
-
-% ③ 编译两遍
-```
-
-类别名是**随用随建**的,不需要预先声明。`\cvnum*{一区,SCI}` 这种求和也可以
-直接用。
-
-⚠️ 类别名不要含英文逗号(`,` 是 `\cvnum*` 的分隔符)、不要含 `@ % # \ { }`。
-中文、英文、空格都可以。
-
-### 三条必须知道的限制
-
-1. **必须编译两遍**(`latexmk` 会自动跑够)。第一遍概述读到的是上一遍的统计,
- 首次编译会显示 `0`。日志末尾有 `CVSTATS:` 一行提示。
-2. **`\jobname.cvnum` 是生成文件**,每次编译重写,已加进 `.gitignore`。
- 不要手改、不要提交。删掉它只会让数字从 0 重算一遍,下一遍即恢复。
-3. **为什么不用 LaTeX 的 aux**:实测中文键经 aux 往返后 `\ifcsname` 全部匹配不上
- (xeCJK 把汉字设为活动字符,键的 token 形态与写入时不一致;ASCII 键正常、
- 中文键失效)。所以改用独立的 `.cvnum` 文件,键原样保留。
-
-### 为什么项目总经费仍是手填
-
-`\experience` 的参数里没有经费字段,无法从条目自动求和。若真要做到自动,得给
-`\experience` 增加一个经费参数(`{120万}` 之类),再由 `\cvnum` 累加。改动面较大,
-超出本次范围,故保留手填 `1200 余万元`。
-
-### ⚠️ 一个必须注意的语义变化
-
-自动统计只数**你列出来的条目**,不数你没列的。示例简历原来写「论文 40 余篇、
-专利 20 余项」,但正文只列了 9 篇代表作、9 项专利——改成自动统计后会变成
-「论文 9 篇、专利 9 项」。
-
-**这不是 bug,是两种口径**:
-- 简历惯例是**只列代表作**,概述写总量(40 余篇)——此时总数不能从条目数出来
-- 若你的正文就是全部成果,自动统计的数字才是真实总量
-
-用之前先想清楚自己属于哪种。要保留「40 余篇」这种总量表述,就把那处数字改回
-手写,只在真正列全的章节(软著、转化、教研这类)用 `\cvnum`。
-
-## 写的时候容易踩的三个坑
-
-1. **`\newExperience` 的参数顺序是「结束在前、开始在后」** —— 上游定义就是先印
- `#1`(结束时间)再印 `#5`(开始时间),第一次用极易写反,写反了两栏内容会错位。
-2. **每条后面必须跟 `\emptySeparator`**,否则下一条会并进同一格,不换行。
-3. **关键词用英文逗号 `,` 分隔**(`\foreach` 按 `,` 切分)。用中文逗号会把整串当成
- 一个标签,撑出一个超宽的大框。
-
-## 字体换成 SmallCaps 时的坑(已在 `../fonts.tex` 里解决)
-
-`\user` / `\resumetitle` / `\experience` 都用了 `\textsc`,而中文没有小型大写字形,
-不处理会每页刷 6 条 `Font shape 'TU/OUCSerif(0)/m/sc' undefined`。
-
-修的时候注意:`\setCJKmainfont` 里加 `SmallCapsFont` **与本仓库的 `ItalicFeatures`
-互斥** —— 斜体那一档带跨目录 `Path`,会把小型大写的字体查找带偏,无论写
-`*-Regular`、全名、还是带 `.otf` 全报
-`The font "OUCSerif-Regular" cannot be found.`。
-
-正解在 `../fonts.tex` 里用的是 LaTeX 原生的形状替换:
-
-```latex
-\DeclareFontShape{TU}{OUCSerif(0)}{m}{sc}{<->ssub * OUCSerif(0)/m/n}{}
-\DeclareFontShape{TU}{OUCSerif(0)}{b}{sc}{<->ssub * OUCSerif(0)/b/n}{}
-```
-
-比 fontspec 的选项低一层,不受选项间相互作用影响,效果等价。
-
-## 授权
-
-`LICENSE` 沿用上游。字体授权见仓库根 `../fonts/README.md`,全部允许免费商用与再分发。
\ No newline at end of file
+示例内容为虚构数据,使用时全部替换。
\ No newline at end of file
diff --git a/试卷/README.md b/试卷/README.md
index 5a22665..9fe31c4 100644
--- a/试卷/README.md
+++ b/试卷/README.md
@@ -1,99 +1,161 @@
-# 试卷 —— 试卷与参考答案 LaTeX 模板
+# 试卷
-中国海洋大学期末考试**试卷**与**参考答案及评分标准**的 XeLaTeX 模板。
-两份模板均不含真题,题目与分值都是示意,按教学大纲替换即可。
+期末考试试卷 + 参考答案与评分标准,两套模板,A4 两栏。
-> 样张是《数字逻辑》2025 秋的一份**完整虚构 A 卷**:16 类题型(填空 / 选择 /
-> 判断 / 化简 / 分析 / 设计 / 时序 / 计数器 / 状态机 / 存储器 / ADC-DAC /
-> Verilog / 综合设计 …)+ 对应参考答案与评分标准(8 大题 / 满分 100)。
-> **题目是按数字逻辑课程内容真编的、答案算过是对的**,不是「略」或「×××」——
-> 这样既能看清版式,也能看出各题型的排版难度(比如卡诺图、时序波形图
-> 都是 TikZ 内联画的)。
->
-> 与 [`课程教学日历/`](../课程教学日历/)、[`成绩构成说明/`](../成绩构成说明/)、
-> [`试卷归档封面/`](../试卷归档封面/) 是同一门课,四份一起看是自洽的。
-> 唯一**故意留空**的是命题人 / 审核人 / 各题得分栏 —— 那是要签字担责的,
-> 编名字上去容易被误当真实署名。
+## 编译
+
+```bash
+cd 试卷
+xelatex 试卷题型示例.tex
+xelatex 试卷题型示例.tex # 题号交叉引用需要两遍
+
+xelatex 参考答案与评分标准示例.tex
+xelatex 参考答案与评分标准示例.tex
+```
+
+或仓库根:`bash build.sh 试卷 试卷题型示例`(自动跑两遍)
## 文件
| 文件 | 说明 |
|---|---|
-| `oucexam.sty` | 试卷版式包。纸张 195×270mm(学校专用试卷纸),含装订栏、成绩表、页脚 |
-| `ouckey.sty` | 答案与评分标准版式包。默认 A4;加 `exampaper` 选项则与试卷同纸同边距 |
-| `试卷题型示例.tex` | 试卷范例,16 类题型,6 页 |
-| `参考答案与评分标准示例.tex` | 答案范例,8 大题 / 满分 100,3 页 |
+| `试卷题型示例.tex` | 试卷,16 种题型展示 |
+| `参考答案与评分标准示例.tex` | 答案与评分标准 |
+| `oucexam.sty` | 试卷版式包 |
+| `ouckey.sty` | 答案版式包 |
-## 编译
-
-```bash
-xelatex 试卷题型示例.tex
-xelatex 试卷题型示例.tex # 跑两遍,第二遍才能取到正确总页数(lastpage)
-```
-
-必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
-两份 .tex 都在本目录内自包含,不依赖任何图片文件(示例配图是 TikZ 内联画的)。
-
-## 试卷模板要点
-
-纸张、页边距、行距、装订栏位置、页脚样式都已在 `oucexam.sty` 里按原卷实测值定好,
-一般**只改 `\examsetup` 那一块**(下例是样张实际用的虚构值):
+## 试卷:卷头参数
```latex
+\documentclass[UTF8,fontset=none]{ctexart}
+\usepackage{oucexam}
+
\examsetup{
- year = {2025}, % 学年(会自动印成 2025—2026)
- term = {秋}, % 秋 / 春
- course = {数字逻辑},
+ year = {2025}, % 学年
+ term = {秋}, % 季学期
+ course = {数字逻辑}, % 课程名称
college = {信息科学与工程学院},
- type = {A}, % 卷头「试卷类型:A 卷」
- foottype = {}, % 页脚课程名后是否再印类型字母,空=不印
- proposer = {}, % 命题人
- reviewer = {}, % 审核人
- mode = {闭卷},
- allowed = {无}, % 允许携带的物品
- nsec = {16}, % 大题数,成绩表自动按 nsec+1 栏等分
+ type = {A}, % 试卷类型 A / B
+ foottype = {}, % 页脚是否再印类型字母,留空则不印
+ proposer = {}, % 命题人
+ reviewer = {}, % 审题人
+ mode = {闭卷}, % 考试方式
+ allowed = {无}, % 允许携带的物品
+ nsec = {16}, % 大题数量(成绩表按此栏数等分)
}
```
-- `proposer` / `reviewer` 样张里**故意留空**:命题人、审核人是要签字担责的,
- 编一个名字上去容易被误当真实署名。留空时模板自动不印该项、不留空横线。
-- `type` 与 `foottype` 互不影响:前者只管卷头,后者只管页脚。
- 原卷 A 卷页脚没印字母、B 卷印了 B,这是出卷人手工差异,不是规则。
-- 大题数变了必须同步改 `nsec`,否则成绩表格子会错位。
+| 参数 | 说明 |
+|---|---|
+| `year` | 学年 |
+| `term` | 季学期 |
+| `course` | 课程名称 |
+| `college` | 学院 |
+| `type` | 试卷类型,A / B |
+| `foottype` | 页脚类型字母,留空不印 |
+| `proposer` | 命题人,留空不印 |
+| `reviewer` | 审题人,留空不印 |
+| `mode` | 闭卷 / 开卷 |
+| `allowed` | 允许携带物品 |
+| `nsec` | 大题数量,决定卷头成绩表的栏数 |
-## 答案模板要点
+留空的项自动不印,不会留空白横线。
+
+## 试卷:题型命令
+
+16 种题型,按需用:
+
+| 题型 | 命令 |
+|---|---|
+| 一、填空题 | `\blank[n]` 按字宽画横线,`\lblank` 通栏横线 |
+| 二、判断题 | `\judge` 括号在题首 |
+| 三、单项选择题 | `\choices` 一行四栏 |
+| 四、多项选择题 | `\choicesII` 两行两栏 |
+| 五、名词解释 | `\answerlines[n]` 答题横线 |
+| 六、简答题 | 题号用 `\qiT`(Times 数字) |
+| 七、判断改错题 | `\judge` + 改错横线 |
+| 八、计算题 | 表格 + `\answerbox` 作答框 |
+| 九、作图题 | 大方框作答 |
+| 十、配伍题 | `\mtpair` 左右两栏,中间连线 |
+| 十一、表格填写题 | `\datatable` + 空格 |
+| 十二、术语翻译题 | 英译中 / 中译英 |
+| 十三、证明题 | 逻辑推演,大作答区 |
+| 十四、分析题 | 配图,用 `\examfig{宽度}{文件}` |
+| 十五、实验设计题 | 方案要素 + 大作答区 |
+| 十六、论述题 | 大段作答区 |
+
+大题标题写法:
```latex
+\examsection{一、填空题(每空 1 分,共 10 分)}
+```
+
+## 答案:卷头参数
+
+```latex
+\usepackage{ouckey}
+
\keysetup{
- year = {2025}, term = {秋}, course = {数字逻辑}, type = {A},
- dept = {计算机科学与技术学院}, college = {信息科学与工程学院},
- major = {计算机科学与技术专业 \TNR{2023} 级},
- teacher = {张远航}, examiner = {张远航},
- mode = {闭卷、笔试}, total = {100},
+ year = {2025}, % 学年
+ term = {秋}, % 季学期
+ course = {数字逻辑}, % 课程名称
+ type = {A}, % 试卷类型
+ dept = {计算机科学与技术学院},
+ college = {信息科学与工程学院},
+ major = {计算机科学与技术专业 \TNR{2023} 级},
+ teacher = {张远航}, % 任课教师
+ examiner = {张远航}, % 命题教师
+ mode = {闭卷、笔试},
+ total = {100}, % 满分
}
```
-如实现在试卷同一张纸上印,把 `\usepackage{ouckey}` 改成 `\usepackage[exampaper]{ouckey}`。
+| 参数 | 说明 |
+|---|---|
+| `year` `term` `course` `type` | 与试卷一致 |
+| `dept` | 系 |
+| `college` | 学院 |
+| `major` | 面向专业与年级 |
+| `teacher` | 任课教师 |
+| `examiner` | 命题教师 |
+| `mode` | 考试方式 |
+| `total` | 满分 |
-体例四条(学校没有统一模板,按国内高校通行做法拟定):
+## 答案:命令
-1. 抬头信息齐全,留空的项自动不印、不留空横线
-2. 客观题答案集中列(`\objkeys{C,B,A,...}`,每行 6 个自动换行),附统一给分规则
-3. 主观题**内嵌**分步分值(`\pt{2}`),阅卷时批到哪里看到哪里
-4. 每个大题末尾给【评分标准】`\scoring{...}`
+| 命令 | 用途 |
+|---|---|
+| `\makekeyhead` | 印抬头 |
+| `\keysection{标题}` | 大题的标题与答案区 |
+| `\keysectionfree{标题}` | 不带答案框的标题 |
+| `\keyitem{...}` | 一条答案与评分点 |
+| `\keyitemstar{...}` | 带星号的答案条目 |
+| `\keynote{...}` | 说明性注释 |
+| `\scoring{分值}` | 标出评分点分值 |
+| `\keytotal` | 末尾的分数汇总表 |
+| `\keysign` | 签字栏 |
+| `\objkeys{...}` | 客观题答案(判断、选择) |
+| `\pt{n}` / `\ptline` | 分值标注 |
-主观题内嵌分值是有意为之:阅卷是流水作业,分值必须和答案文字贴在一起,
-集中写在末尾会让批卷人来回翻页。
+答案与试卷的题号、分值要一一对应,改试卷时答案模板也要同步改。
-文末 `\keytotal{20,10,12,12,12,16,8,10}` 是分值汇总表,用于阅卷前核对
-「各大题相加 = 满分」。签名栏 `\keysign` 只留命题人一处。
+## 版式
-## 书写注意
+```
+A4 两栏,栏宽 82mm
+试卷:题号与作答区按题型自动排
+答案:每题带评分点标注,末尾总分汇总表
+正文宋体,题号用 Times
+```
-- 题干内部换行用 `\\*`,**不要用裸 `\\`**。裸 `\\` 语义是"允许在此断页",
- 题干会被切到上下两页,学生看到半句话。
-- 数字、英文用 `\TNR{...}` 包起来(内部显式 `\normalfont` 收尾)。
- 裸用字体切换命令会让字体状态泄漏到后续段落。
-- `\keyitem{题号}{分值}{答案正文}` 的参数里**不要嵌 `tabular` / `tikzpicture`**——
- 这些环境的 `&` 与 `\\` 会被当成参数分隔符,报 `File ended while scanning`。
- 表格和图写在 `\keyitem` 之后。
\ No newline at end of file
+## 配图
+
+分析题等需要配图时,用 TikZ 直接画,或:
+
+```latex
+\examfig{0.6\textwidth}{图片文件.png}
+```
+
+## 注意
+
+示例内容为虚构题目,使用时全部替换。
\ No newline at end of file
diff --git a/试卷归档封面/README.md b/试卷归档封面/README.md
index a0cbb7f..6bd4ae1 100644
--- a/试卷归档封面/README.md
+++ b/试卷归档封面/README.md
@@ -1,123 +1,142 @@
-# 试卷归档封面 —— 信息科学与工程学部试卷归档封面(理论课)
+# 试卷归档封面
-信息科学与工程学部**试卷归档封面**的 XeLaTeX 模板。原文件是学院/学部下发的
-`.doc` 表格,本目录把它做成可直接编译的 LaTeX 版。
+信息科学与工程学部试卷归档封面(理论课),A4 单页。
-> **改名说明**:原文件名为「附件1:信息科学与工程学院试卷封面(理论课)」,
-> 内文标题写的是「信息科学与工程学院试卷」。按现行建制与文档实际用途,
-> 已统一改为 **学部 + 归档封面**:目录名、文件名、内文标题三处同步。
+## 编译
-> 与 [`试卷/`](../试卷/) 的区别:`试卷/` 是**试卷正文 + 参考答案**(学校专用
-> 195×270mm 试卷纸、装订栏、成绩表);本目录是**随卷归档的封面单页**
-> (A4、11 行两列表单)。两者用途不同,不是同一份文件的两个版本。
+```bash
+cd 试卷归档封面
+xelatex 试卷归档封面.tex
+```
+
+或仓库根:`bash build.sh 试卷归档封面`
## 文件
| 文件 | 说明 |
|---|---|
-| `oucksfm.sty` | 版式包。A4、表宽 170mm、11 行固定行高,所有尺寸已注明换算过程 |
-| `试卷归档封面.tex` | 填写入口,【第 1 节】改课程信息即可 |
-| `试卷归档封面.pdf` | 成品样张 |
+| `试卷归档封面.tex` | 主文件,填内容改这里 |
+| `oucksfm.sty` | 版式包,一般不改 |
-## 编译
+## 填写参数
-```bash
-xelatex 试卷归档封面.tex
-```
-
-必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
-本模板自包含,不依赖任何图片。
-
-## 填表
-
-只改 `试卷归档封面.tex` 的【第 1 节】。下面注释里的值是**样张实际用的虚构值**
-(与 `课程教学日历/`、`成绩构成说明/`、`试卷/` 同为《数字逻辑》2025 秋):
+全部在 `\begin{document}` 之前定义:
```latex
-\newcommand{\sfmyear} {\ph{2025}年} % 学年
-\newcommand{\sfmterm} {\ph{秋}季学期} % 学期
-\newcommand{\sfmcno} {080502101231} % 课程号(纯数字,14pt)
-\newcommand{\sfmsno} {25252029} % 选课号(纯数字,14pt)
-\newcommand{\sfmcourse}{\ph{数字逻辑}} % 考试课程名称
-\newcommand{\sfmtype} {\ph{专业课}} % 课程类型
-\newcommand{\sfmmajor}{...} % 面向专业(多个用、隔开)
-\newcommand{\sfmgrade}{\ph{2023}级} % 面向年级
-\newcommand{\sfmcount}{\ph{86}} % 试卷份数
-\newcommand{\sfmteacher}{\ph{张远航}} % 授课教师
-\newcommand{\sfmdate}{...} % 日期
+\newcommand{\sfmyear} {\ph{2025}年} % 学年
+\newcommand{\sfmterm} {\ph{秋}季学期} % 学期
+\newcommand{\sfmcno} {080502101231} % 课程号
+\newcommand{\sfmsno} {25252029} % 选课号
+\newcommand{\sfmcourse}{\ph{数字逻辑}} % 考试课程名称
+\newcommand{\sfmtype} {\ph{专业课}} % 课程类型
+\newcommand{\sfmmajor}{% % 面向专业
+ \ph{计算机科学与技术}、\ph{软件工程}、\ph{智能科学与技术}}
+\newcommand{\sfmgrade} {\ph{2023}级} % 面向年级
+\newcommand{\sfmcount} {\ph{86}} % 试卷份数
+\newcommand{\sfmteacher}{\ph{张远航}} % 授课教师
+\newcommand{\sfmdate} {\ph{2025}年\ph{01}月\ph{08}日星期\ph{三}} % 日期
```
-⚠️ **换内容时保留 `\ph{}`**,只是把它里面的字换掉,别把宏本身删了 ——
-「×」和半角数字会被 fontspec 判成 ASCII 交给西文字体,宽度与汉字不一致,
-全表的字就会参差不齐(原因见 `.tex` 里的长注释)。
+| 参数 | 说明 |
+|---|---|
+| `\sfmyear` | 学年,写成「2025年」这种形式 |
+| `\sfmterm` | 学期,秋 / 春,或「秋季学期」 |
+| `\sfmcno` | 课程号,纯数字,14pt |
+| `\sfmsno` | 选课号,纯数字,14pt |
+| `\sfmcourse` | 考试课程名称 |
+| `\sfmtype` | 课程类型:专业课 / 公共基础课 / 通识课 |
+| `\sfmmajor` | 面向专业,多个用「、」隔开 |
+| `\sfmgrade` | 面向年级 |
+| `\sfmcount` | 试卷份数 |
+| `\sfmteacher` | 授课教师 |
+| `\sfmdate` | 日期 |
-## 版式参数
+### `\ph` 命令
-全部照原 `.doc` 实测值,未做主观调整:
-
-| 项目 | 值 | 来源 |
-|---|---|---|
-| 纸张 | A4 210×297mm | `pgSz` |
-| 页边距 | 左右 20mm、上下 25.01mm | `pgMar` 56.7 / 70.9 pt |
-| 表宽 | 170mm(= 版心宽) | `tblW` 100% |
-| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位)|
-| 单元格内边距 | 左右 1.4993mm、上下 0 | `tblCellMar` 85 twips |
-| 列宽 | 51mm + 119mm(30% : 70%) | `col_widths_pct` |
-| 标题 | 黑体 18pt 加粗居中 | `w:sz=36` + `w:b` |
-| 左列标签 | 黑体 18pt | `w:sz=36` |
-| 右列值 | 18pt(学年/学期)/16pt(多数)/14pt(课程号、选课号) | `w:sz=36/32/28` |
-| 行高 | 11 行固定高,合计 185.95mm | 各行 `trHeight` + `hRule=exact` |
-
-实测校验(pymupdf 读 PDF):
-
-```
-表格 左=20.0mm 右=189.91mm 宽=169.9mm ← 应为 170mm ✓
-行高 15.19/15.18/15.54/14.66/14.75/15.18/33.02/15.19/18.80/15.19/15.19 mm
-表格总高 187.89mm ← 含线宽与取整,与 185.95+线宽 吻合
-标题 宽 94.89mm,单行不折(版心 170mm,余量充足)
-```
-
-## 三个坑(改之前先看)
-
-### 1. `×` 占位符曾跑到 Times New Roman(已在公共字体包根治)
-
-xeCJK 按 Unicode 区段分类,`×`(U+00D7)落在 Latin-1,会被判成**西文**,
-交给 fontspec 的西文字体(Termes / Times)。`\heiti` / `\fangsong` 只切
-CJK 字体族,**管不到它** —— 包一层是没用的。TNR 的 × 宽度与汉字不一致,
-混排时基线也偏。
-
-现在这行已上移到仓库公共字体包 [`../fonts.tex`](../fonts.tex),**全局生效**:
+`\ph{文字}` 把内容排成黑体(表示可填写的占位值)。定义在 tex 里:
```latex
-\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号
-\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号
-\xeCJKDeclareCharClass{CJK}{"25A1} % □ 方框(勾选框)
+\newcommand{\ph}[1]{{\heiti #1\normalfont}}
```
-本模板不再需要自己声明。
+要改占位值的字体,改这一行。纯数字(课程号、选课号)本来该用西文字体,
+不用 `\ph` 包。
-> ✅ [`年度考核登记表/`](../年度考核登记表/) 也有同样问题,**已随本次改造一并修好**
-> (原先那条注释说能修,但实测 PDF 里 × 仍落在 TNR —— 因为注释在、声明也写了,
-> 却没有真正作用到字符类)。现在已经实测确认:10 处 `×` 全部落在 OUC Sans 上。
+### 面向专业这一格
-### 2. 字体全部来自公共字体包
+`\sfmmajor` 是全表唯一的高行(32.844mm),能容 3 行 16pt 文字。
+专业名超过 3 行会自动把行撑高,整表会超出版心。届时:
-本模板原先用 SimHei / SimSun / FangSong + `AutoFakeBold` 描边,换台机器
-(尤其 Linux/macOS)就编不出来,而且这些字体都不允许随仓库分发。现改为
-`\input{../fonts.tex}`,字体文件在 `../fonts/` 下,来源与授权见
-[`../fonts/README.md`](../fonts/README.md)。
+1. 精简专业名,或
+2. 把 `oucksfm.sty` 里 `row{7}` 的 `ht` 改大
-### 3. `\linespread` 会悄悄放大行高
+## 表格结构
-ctex 默认 `\linespread` 约为 **1.3**,它会把 `\fontsize{18}{21.6}` 里的
-21.6 pt 行距放大到 **28 pt 以上**,逐行累积后整张表会顶出页面。
+| 行 | 内容 |
+|---|---|
+| 1 | 学年 + 学期 |
+| 2 | 课程号 + 选课号 |
+| 3 | 考试课程名称 |
+| 4 | 课程类型 |
+| 5 | 面向专业(高行) |
+| 6 | 面向年级 |
+| 7 | 试卷份数 |
+| 8 | 授课教师 |
+| 9 | 日期 |
-`oucksfm.sty` 的解法是在**每个** `\fontsize` 之后紧跟 `\linespread{1}\relax`,
-并且在 `\AtBeginDocument` 之后再设一次(ctex 会在 `\begin{document}` 时
-把 `\linespread` 重新设回 1.3,只在导言区设是无效的):
+## 标签文字
+
+表左侧的标签默认是:
```latex
-\AtBeginDocument{\linespread{1}\selectfont}
+\newcommand{\sfmyearlabel} {学\quad 年}
+\newcommand{\sfmtermlabel} {学\quad 期}
+\newcommand{\sfmcnolabel} {课程号}
+\newcommand{\sfmsnolabel} {选课号}
+\newcommand{\sfmcourselabel} {考试课程名称}
+\newcommand{\sfmtypelabel} {课程类型}
+\newcommand{\sfmmajorlabel} {面向专业}
+\newcommand{\sfmgradelabel} {面向年级}
+\newcommand{\sfmcountlabel} {试卷份数}
+\newcommand{\sfmteacherlabel}{授课教师}
+\newcommand{\sfmdatelabel} {日\quad 期}
```
-没有这一步,表高会比原卷高出一大截。
+字号不一致的标签用 `\quad` 补空格对齐。
+
+## 正文
+
+```latex
+\begin{document}
+\sfmtitle{信息科学与工程学部试卷归档封面}
+\begin{sfmtable}
+ \sfmlabel{\sfmyearlabel} & \sfmvalbig{\sfmyear} \\
+ ...
+\end{sfmtable}
+```
+
+`\sfmlabel` 排标签,`\sfmval` / `\sfmvalbig` / `\sfmvalsmall` 排值(三档字号)。
+
+### 其他命令
+
+| 命令 | 用途 |
+|---|---|
+| `\sfmtitle{标题}` | 表外标题 |
+| `\sfmlabel{文字}` | 左列标签 |
+| `\sfmval{值}` | 中号值 |
+| `\sfmvalbig{值}` | 大号值 |
+| `\sfmvalsmall{值}` | 小号值 |
+| `\sfmtail{文字}` | 表尾文字 |
+| `\sfmrule` | 横线 |
+
+## 版式
+
+```
+A4,单页
+标签黑体,值黑体(\ph),纯数字用西文
+表格行高按原表设定,第 5 行(面向专业)为高行
+```
+
+## 注意
+
+示例内容为虚构数据,使用时全部替换成自己的课程。
\ No newline at end of file
diff --git a/试卷归档目录/README.md b/试卷归档目录/README.md
index 1cd5125..0e4a08b 100644
--- a/试卷归档目录/README.md
+++ b/试卷归档目录/README.md
@@ -1,199 +1,102 @@
-# 试卷归档目录 —— 信息科学与工程学部试卷归档目录(理论课)
+# 试卷归档目录
-信息科学与工程学部**试卷归档目录**的 XeLaTeX 模板。原文件是学院/学部下发的
-`.doc` 表(12 项核对清单),本目录把它做成可直接编译的 LaTeX 版。
+信息科学与工程学部试卷归档目录(理论课),A4 单页,12 项核对清单。
-> **改名说明**:原文件名为「附件2:信息科学与工程学院归档目录(理论课)」,
-> 内文写的是「归档目录」、未出现单位名。按现行建制已统一为 **学部**,
-> 目录名、文件名同步。内文标题保持原文「归 档 目 录」(四字间隔一个字宽)。
+## 编译
-> 与 [`试卷归档封面/`](../试卷归档封面/) 的关系:两件是**同一套归档材料**的
-> 两个附件的原件配套 —— 附件1 是封面(随卷装订、11 行表单),本目录是
-> 附件2(装袋前逐项核对的清单、12 项勾选表)。版式上都照原 `.doc` 1:1 还原,
-> 但一个是 A4 表单、一个是 A4 居中表格,互不依赖。
+```bash
+cd 试卷归档目录
+xelatex 试卷归档目录.tex
+```
+
+或仓库根:`bash build.sh 试卷归档目录`
## 文件
| 文件 | 说明 |
|---|---|
-| `oucgddir.sty` | 版式包。A4、表宽 150.64mm、13 行固定行高,每项尺寸都附换算过程 |
-| `试卷归档目录.tex` | 正文入口(12 项清单写在这里,增删改归档项只改这个文件) |
-| `试卷归档目录.pdf` | 成品样张 |
+| `试卷归档目录.tex` | 主文件,清单条目改这里 |
+| `oucgddir.sty` | 版式包,一般不改 |
-## 编译
+## 完整内容
-```bash
-xelatex 试卷归档目录.tex
-```
-
-必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
-自包含,不依赖任何图片。实测 1 页,零警告(无 Overfull / Underfull / 缺字)。
-
-## 用法
-
-正文就是一张表,加行改行即可:
+整个模板就一个清单表,改条目直接编辑 `.tex` 正文:
```latex
+\begin{document}
+\vspace*{\gdtopskip}
+
+\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
+
+\vspace{\gdheadskip}
+
\begin{gdtable}
\gdhead{序号} & \gdhead{内容} & \gdheadIII \\
- \gdno{1} & \gditem{考试签到表} & \\
- \gdno{2} & \gditem{监考记录} & \\
- % …… 照此继续
+ \gdno{1} & \gditem{考试签到表} & \\
+ \gdno{2} & \gditem{监考记录} & \\
+ ...
\end{gdtable}
+\end{document}
```
-可用的单元格宏:
+## 增加或删除条目
-| 宏 | 用途 | 字号/字形 |
-|---|---|---|
-| `\gdno{1}` | 序号列 | 楷体 12pt 粗 |
-| `\gditem{考试签到表}` | 内容列 | 楷体 12pt |
-| `\gdhead{序号}` | 表头单段格(序号、内容两列) | 楷体 18pt 粗 |
-| `\gdheadIII` | 表头第三格,**自带**「标注」+ 小字两段 | 18pt 粗 + 10.45pt |
-| `\gdnote{...}` | 单独排一行小字(10.45pt) | 楷体 10.45pt |
-
-标题用 `\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}` —— **`\gdgap` 不能省**,
-原因见下面第 3 条。
-
-## 版式参数
-
-全部照原 `.doc` 实测值,未做主观调整:
-
-| 项目 | 值 | 来源 |
-|---|---|---|
-| 纸张 | A4 210×297mm | `pgSz` 11906×16838 twips |
-| 页边距 | 上下 25.40mm、左右 29.599mm | `pgMar` top/bottom 1440 twips;左右经实测标定,见下 |
-| 表宽 | 150.81mm | `tblGrid` 合计 8540 twips = 150.64mm,加列取整余量 |
-| 列宽 | 23.072 + 77.346 + 50.218 mm | `gridCol` 1308 / 4385 / 2847 twips |
-| 单元格内边距 | 左右 1.905mm、上下 0 | `tblCellMar` 108 twips |
-| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位) |
-| 行高 | 表头 20.549mm、中间 12 行 13.758mm、末行 14.164mm | `trHeight` 1165 / 780 / 803 twips,`hRule=exact` |
-| 标题 | 楷体 24pt,首行缩进 46.55mm | `firstLine` 2640 twips |
-| 表头 | 楷体 18pt 粗 | `w:sz=36` + `w:b` |
-| 表头小注 | 楷体 10.45pt | `w:szCs=21`(未设 `w:sz`,Word 退回 10.5pt) |
-| 序号列 | 楷体 12pt 粗 | `w:sz=24` + `w:b` |
-| 内容列 | 楷体 12pt | `w:sz=24` |
-
-## 实测校验
-
-用 pymupdf 读两版 PDF,逐位对比(原稿由 WPS 导出):
-
-```
-表格竖线 x (mm) 原稿 29.686 / 52.758 / 130.104 / 180.322
- 新版 29.687 / 52.758 / 130.104 / 180.321 Δ ≤ 0.001
-
-表格横线 y (mm) 原稿 53.001 … 239.056(14 条)
- 新版 53.004 … 239.050 Δ ≤ 0.006
-
-标题四字 x0 (pt) 原稿 222.00 / 270.00 / 318.00 / 366.00
- 新版 221.95 / 269.93 / 317.93 / 365.93 Δ ≤ 0.07
-
-32 行文字水平中心 最大偏差 0.11pt
-32 行文字距行顶 最大偏差 0.57pt(数字与中文各自字体度量差,见下)
-字号 24.00 / 18.00 / 12.00 / 10.45 …………全部精确
-```
-
-> 纵向那 0.5pt 的来源:原稿序号列用 Times New Roman、正文用方正楷体,
-> Word 让**两种字体各自按自身 ascent 落基线**,同一行里数字比中文高 0.48pt
-> (原稿实测 232.25 vs 231.77)。新版用 Termes + OUC Kai 复刻了同样的
-> 相对关系(232.32 vs 232.32 —— 差 0,因为 Termes 与 OUC Kai 的 ascent
-> 恰好一致)。这是**字体度量差**,不是排版错误,且新版同一行内更整齐。
-
-## 五个坑(改之前先看)
-
-### 1. `\fontsize` 必须用 `bp`,不能用默认的 `pt`
-
-Word/PDF 里的 "pt" 是 **PostScript point**(1/72 英寸),TeX 的默认 `pt` 是
-**TeX point**(1/72.27 英寸),后者大出 0.36%。写 `\fontsize{24}{28.8}`,
-PDF 里实测只有 **23.91**(= 24 × 72/72.27),与原稿的 24.00 对不上。
+复制一行改内容即可,编号手动写:
```latex
-\fontsize{24bp}{28.8bp}\selectfont % 实测正好 24.000
+\gdno{13} & \gditem{新增的项目名称} & \\
```
-本包所有照抄 Word 数值的字号、行距、间距一律写 `bp`。
+删条目就删整行。条目数变了不影响版式。
-### 2. xeCJK 会吞掉连续半角空格
+## 标题间距
-标题原文是「归␣␣档␣␣目␣␣录」(字间各两个半角空格)。直接照抄进源码,
-编译出来是紧贴的「归档目录」—— 空格全没了(实测 x0=216.09,且只有一个
-span,而原稿是四个独立字、间隔恒 48pt)。
-
-正解是不依赖空格策略,用 `\kern` 手动摆:
+`\gdtitle` 里的四个字之间用 `\gdgap` 插空隙:
```latex
-\newcommand{\gdgap}{\kern\gdtitlegap} % \gdtitlegap = 24bp = 1 个字宽
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
```
-### 3. 必须关掉 xeCJK 的全角标点压缩(`PunctStyle=plain`)
+**不能直接写空格**(`归 档 目 录`)—— xeCJK 会吞掉连续半角空格,
+编译出来是紧贴的「归档目录」。
-**这条最隐蔽。** 现象:凡含全角括号的行,整行右移 4.23pt,而字宽完全正确。
-「试卷(项目设计报告)」原稿 x0=199.20,默认设置排出 **203.43**。
+## 常用命令
-根因是 xeCJK 默认 `PunctStyle=quanjiao` 会对全角标点做字宽挤压:「(」「)」
-的 advance 从 1.0em 压到 0.5em,省下的空间记在**行内盒子的起点**上,于是
-整行墨迹相对盒子右移。两端对齐的正文里这叫"标点紧凑",但在**居中**的表格
-单元格里就是整行偏移,且偏移量随括号个数变化(1 个 4.23pt、2 个 8.46pt)。
+| 命令 | 用途 |
+|---|---|
+| `\gdtitle{文字}` | 主标题 |
+| `\gdgap` | 标题字之间的固定空隙(24bp) |
+| `\gdtopskip` | 标题上方留白 |
+| `\gdheadskip` | 标题下方留白 |
+| `gdtable` 环境 | 清单表 |
+| `\gdhead{文字}` | 表头格(三列各一个变体:`\gdhead`、`\gdheadIII`) |
+| `\gdheadraw{文字}` | 表头格(不自动排版) |
+| `\gdno{数字}` | 序号格 |
+| `\gditem{文字}` | 条目格 |
+| `\gdnote{文字}` | 备注格 |
+| `\gdrule` | 横线 |
+
+### 三列表头
+
+表头有三个命令对应三列,因为各列的对齐和宽度不同:
```latex
-\xeCJKsetup{PunctStyle=plain}
+\gdhead{序号} & \gdhead{内容} & \gdheadIII \\
```
-Word 本来就不做这个挤压,关掉反而与原件一致。
+### 宽度常量
-### 4. `totalwidth` / 行高 / 位移都要比理论值多留一点
+| 常量 | 说明 |
+|---|---|
+| `\gdwa` `\gdbw` `\gdwc` | 三列的宽度 |
-tabularray 的**计宽**与**画宽**不是一回事,三处都要实测标定:
+## 版式
-- **列宽**:它把边框线宽算进列宽,故 `wd = gridCol − 2×colsep − 线宽`,
- 而不是"按竖线根数分摊"。按分摊算每列窄 0.154mm,整表窄 0.466mm。
-- **表宽**:左竖线画在版心左边界**内侧**,整个 tblr 盒子比
- `Σwd + 6×colsep + 4×线宽` 又多约 0.4945pt,不补足就报
- `Overfull \hbox (0.49452pt too wide)`。
-- **行高**:`row{..}={ht=..}` 是**内容区**高度,hline 线宽不含在内,
- 每行实际比 ht 高整整一个 `\gdrule`(0.5pt)。13 行累计多 6.5pt,
- 必须逐档减掉 0.1764mm。
+```
+A4,单页,三线表
+标题黑体加宽字距,表头黑体,条目宋体
+```
-### 5. 单元格里想"整体下移",只有一种写法有效
+## 注意
-`\gdheadIII` 要让「标注」+ 小注两段整体下移 1.49pt,五种手段实测对比
-(数值为距行顶距离,末项是两段间距):
-
-| 手段 | 标注 | 小注 | 间距 | 结论 |
-|---|---|---|---|---|
-| 原样 | 25.43 | 46.53 | 21.09 | 偏低 1.49 |
-| 尾部 `\vspace*{-2.98pt}` | 26.92 | 48.01 | 21.10 | ✅ 正确 |
-| 顶部 `\vspace*{+2.98pt}` | 23.95 | 48.01 | 24.06 | 反向且拉大间距 |
-| 顶部 `\rule{0pt}{26.5pt}` | 31.25 | 52.34 | 21.09 | 位移过大 |
-| `\raisebox{-1.49pt}{\vbox{..}}` | 25.43 | 46.53 | 21.09 | 完全无效 |
-
-原理:尾部间距 s 改变盒子总高 H(H' = H + s),m 居中后
-内容顶端 = 行顶 + (行高 − H')/2。所以 **s 与位移是 2:1 关系**,
-但实测灵敏度是 0.778 而非 0.5(hline 也参与高度分配),故最终标定值是
-`\vspace*{-2.98pt}` 而不是 −1.49×2。
-
-顺带一个反直觉的点:**顶部间距会被首行的 ascent 吃掉** —— 3.6pt 的
-`\rule` 远小于 18pt 字的 ascent,写了等于没写;必须超过 ascent 才有反应,
-但那时位移已经过量。所以"顶部加高"这条路走不通。
-
-## 字体
-
-全部来自仓库公共字体包 [`../fonts.tex`](../fonts.tex),来源与授权见
-[`../fonts/README.md`](../fonts/README.md)。
-
-原稿中文用「方正楷体_GB2312」(商业字体,不允许随仓库分发),现换成
-**OUC Kai**(霞鹜文楷 GB2312 子集,SIL OFL 1.1)—— 同为楷体、同为
-GB2312 字符集,字宽逐字相同(实测「考试签到表」= 60.00pt,
-「试卷(项目设计报告)」= 120.00pt,与原稿全等)。西文/数字原用
-Times New Roman,现用 **TeX Gyre Termes**(度量兼容替代)。
-
-## 一个已知的"不改动"
-
-原表 `tblGrid` 合计 8540 twips = **150.64mm**,而原版心 210 − 2×31.75
-= **146.50mm** —— 原文档里这张表本来就在版心之外各溢出 2.07mm,靠
-`jc=center` 居中掩盖,看起来正常。
-
-本模板把版心直接设成表宽(150.81mm),表格居中与纸面绝对位置与原稿一致
-(见上面的实测校验),但不再"溢出版心":**视觉上无差别,且不产生
-Overfull 警告**。这是唯一的主动偏离,属修正而非改版。
\ No newline at end of file
+清单条目是学校的固定要求,一般不改。示例中的 12 项即完整清单。
\ No newline at end of file
diff --git a/课程大纲/README.md b/课程大纲/README.md
index 8996239..65537d0 100644
--- a/课程大纲/README.md
+++ b/课程大纲/README.md
@@ -1,126 +1,112 @@
# 课程大纲
-中国海洋大学本科生课程大纲 LaTeX 模板。
-
-## 来源
-
-版式取自学校下发的 `课程大纲模板-数字逻辑-2024版.docx`
-(2025-01-02 修订,45 段落 + 6 表格),所有尺寸从 OOXML 量出。
+中国海洋大学本科生课程大纲,A4 多页。
## 编译
```bash
cd 课程大纲
-xelatex 课程大纲.tex # 单次即可,无交叉引用
+xelatex 课程大纲.tex
+xelatex 课程大纲.tex % 跑两遍,目录与交叉引用才正确
```
-或在仓库根:
-
-```bash
-bash build.sh 课程大纲
-```
-
-## 换课程改哪里
-
-只有三处:
-
-1. **文首的课程基本信息**(`\sylnamecn` 等 12 个宏)—— 对应表 0
-2. **各章节正文** —— 一至八章
-3. **四个表格的内容**
+或仓库根:`bash build.sh 课程大纲`(自动跑两遍)
## 文件
-| 文件 | 作用 |
+| 文件 | 说明 |
|---|---|
-| `oucSyllabus.sty` | 版式包(页面、字体、表格环境) |
-| `课程大纲.tex` | 示例,用数字逻辑的真实内容(已脱敏) |
-| `README.md` | 本文件 |
+| `课程大纲.tex` | 主文件,课程信息与正文改这里 |
+| `oucSyllabus.sty` | 版式包,一般不改 |
-## 版式参数(实测)
+## 换课程要改三处
-```
-页面 A4 210 × 297 mm
-边距 上下左右均 25.4 mm(正好 1 英寸)
-正文字号 12pt
-大标题 15pt 居中
-表格 9~10pt
-```
+1. 文首的课程基本信息(`\newcommand` 那一段)
+2. 各章节正文
+3. 各表格的内容
-## 字体
+## 课程基本信息
-全部取自仓库 `../fonts.tex`,**无系统字体依赖**:
-
-| 用途 | 字体 |
-|---|---|
-| 中文正文 | OUC Serif(思源宋体子集) |
-| 章节标题 | OUC Sans(思源黑体子集) |
-| 西文数字 | 默认西文族(`\TNR{}` 可局部切换) |
-
-⚠️ 原 docx 用了「仿宋_GB2312」和「微软雅黑」,都是商业字体,
-不能随仓库分发,且换机器编不出来。这是 #17 脱敏时定下的规矩。
-
-## 结构说明
-
-一章一节对照:
-
-| 章节 | 内容 | 表格 |
-|---|---|---|
-| 表 0 | 课程基本信息 | 6 行,不规则(见下) |
-| 一 | 课程介绍 | — |
-| 二 | 课程目标 | 表 1(打勾矩阵)、表 2(目标×内容) |
-| 三 | 学习要求 | — |
-| 四 | 教学进度 | 表 3(8×5) |
-| 五 | 参考教材 | — |
-| 六 | 成绩评定 | 表 4(成绩对应)、表 5(评分体系) |
-| 七 | 学术诚信 | — |
-| 八 | 大纲审核 | — |
-
-### 表 0 是不规则表
-
-四行的列跨度不同:
-
-```
-R0 课程名称 | (中文)xxx ← 值跨 5 列
-R1 课程名称 | (英文)xxx ← 值跨 5 列
-R2 课程代码 | 值 | 责任教师 | 值 ← 4 格
-R3 课程属性 | 值 | 课程性质 | 值 ← 4 格
-R4 学分 | 值 | 总课时 | 值 ← 4 格
-R5 理论课时 | 值 | 实践课时 | 值 | 课外学时 | 值 ← 6 格
-```
-
-### ⚠️ tabularray 的 `\SetCell` 陷阱(重要)
-
-**`\SetCell[c=n]{c} 内容 & 下一格` 会吞掉下一格,内容消失,且不报错。**
-
-最小复现(6 列表):
+在 `\begin{document}` 之前定义:
```latex
-A & \SetCell[c=2]{c} B & C & \SetCell[c=2]{c} D \\
-% 渲染只得 A / B / D —— C 消失了
+\newcommand{\sylnamecn}{数字逻辑} % 课程名称(中文)
+\newcommand{\sylnameen}{Digital Logic} % 课程名称(英文)
+\newcommand{\sylcode}{080502101231} % 课程代码
+\newcommand{\sylteacher}{张远航} % 责任教师
+\newcommand{\sylattr}{专业知识} % 课程属性
+\newcommand{\sylnature}{必修} % 必修/选修
+\newcommand{\sylcredit}{2.5} % 学分
+\newcommand{\sylhours}{48} % 总学时
+\newcommand{\syltheory}{32} % 理论学时
+\newcommand{\sylpractice}{16} % 实践学时
+\newcommand{\sylextra}{32} % 课外学时
```
-正确写法:跨 n 列后用 n-1 个 `{}` 占位
+| 参数 | 说明 |
+|---|---|
+| `\sylnamecn` | 课程名称(中文) |
+| `\sylnameen` | 课程名称(英文) |
+| `\sylcode` | 课程代码 |
+| `\sylteacher` | 责任教师 |
+| `\sylattr` | 课程属性(专业知识 / 通识教育 …) |
+| `\sylnature` | 必修 / 选修 |
+| `\sylcredit` | 学分 |
+| `\sylhours` | 总学时 |
+| `\syltheory` | 理论学时 |
+| `\sylpractice` | 实践学时 |
+| `\sylextra` | 课外学时 |
+
+## 正文写法
```latex
-A & \SetCell[c=2]{c} B & {} & C & \SetCell[c=2]{c} D & {} \\
-% 渲染得 A / B / C / D,位置正确
+\oucsylmaintitle{中国海洋大学本科生课程大纲}
+
+\oucsylsection{一、课程介绍}
+\oucsylsubsection{1.课程描述(中英文):}
+\oucsylp{数字逻辑是数字电路逻辑设计的简称……}
+\oucsylp{Digital logic, short for digital logic circuit design, ...}
+
+\oucsylsubsection{2.设计思路:}
+\oucsylp{本课程主要讲授……}
+
+\oucsylsection{二、课程目标}
+\oucsylp{通过对该课程的学习,学生将达到如下课程目标:}
```
-**规律:`&` 总数固定为「列数 - 1」,与是否跨列无关。**
-跨列只是把内容摊到多格上,被摊掉的格要用 `{}` 顶住。
+| 命令 | 用途 |
+|---|---|
+| `\oucsylmaintitle{标题}` | 主标题 |
+| `\oucsylsection{标题}` | 一级节(一、二、三…) |
+| `\oucsylsubsection{标题}` | 二级节(1.2.3.…) |
+| `\oucsylsubsub{标题}` | 三级节 |
+| `\oucsylp{正文}` | 正文段落,首行缩进 |
+| `\oucsylpz{正文}` | 正文段落,不缩进 |
+| `\oucsylsignature` | 签字栏 |
-例外:`c=n` 放在行末(直接 `\\`,后面不接 `&`)也能正确渲染,
-这种写法更易读,本模板 R0/R1 用的就是它。
+编号(一、二 / 1.2.)手写在参数里,模板不自动生成。
-## 已知偏离
+## 表格
-| 位置 | 原 docx | 本模板 | 原因 |
-|---|---|---|---|
-| 「六、成绩评定」字号 | 10.5pt | 12pt | 原文件此处与其余七章不一致,是复制粘贴漏改 |
-| 行距 | 由 Word 自动 | 12pt/19pt | 与原文件观感一致,未逐行卡死 |
-| 表 0 的竖线 | 逐行不同 | 统一 6 等分 | tabularray 限制,见上 |
+课程大纲有四个表:课程基本信息、课程目标与毕业要求对应关系、
+教学内容与学时分配、考核方式与成绩构成。
-## 脱敏
+表格用 `tblr`(tabularray)环境,合并格用 `\SetCell`。改内容时
+注意**每行的段数要与列数一致**,被合并掉的格子留空。
-责任教师等姓名一律为虚构(`张远航`),与仓库其他模板一致。
-真实内容不进仓库。
\ No newline at end of file
+```latex
+\SetCell[c=1]{c} 课程名称 & \SetCell[c=5]{l} (中文)\sylnamecn \\
+```
+
+## 版式
+
+```
+A4,多页
+正文宋体,标题黑体,表格内 9pt
+表格带边框,合并单元格较多
+页眉页脚含课程名称
+```
+
+## 注意
+
+示例内容为虚构数据,使用时全部替换。
\ No newline at end of file
diff --git a/课程执行大纲/README.md b/课程执行大纲/README.md
index b00a372..b5c3fe0 100644
--- a/课程执行大纲/README.md
+++ b/课程执行大纲/README.md
@@ -1,292 +1,112 @@
-# `课程执行大纲` —— 本科课程教学执行大纲、教学日历(LaTeX 模板)
+# 课程执行大纲
-中国海洋大学下发的《本科课程教学执行大纲》Word 模板的 XeLaTeX 复刻版。
-内容全部**虚构**(课程名、课程代码、开课号、教师、教材、思政案例),只复刻版式。
-
-> 样张是一份**填完整的虚构大纲**:《信号与系统基础》2026 秋、电子信息工程专业、
-> 56 课时 3.0 学分(含 18 实践学时)、开课号 `99663311`、任课教师「陈立群」、
-> 教材用吴大正《信号与线性系统分析》(高等教育出版社)、参考书用郑君里那本。
->
-> 注意**本模板刻意不套用其他模板的「数字逻辑 / 张远航」那套设定** ——
-> 这份大纲原作就是《信号与线性系统分析》的课,强行改成数字逻辑,
-> 大纲里的章节体系、学时分配、思政案例就全对不上了。虚构也要虚构得自洽。
-
-| 文件 | 说明 |
-|---|---|
-| `课程执行大纲.tex` | 主文件。虚构课程的一份完整示例 |
-| `ouccourse.sty` | 版式宏包。尺寸全部从原 docx 的 OOXML 量出 |
-| `课程执行大纲.pdf` | 编译产物,5 页(与原 docx 一致) |
+中国海洋大学本科课程教学执行大纲,A4 多页(含封面、基本信息表、各节正文)。
## 编译
```bash
-xelatex 课程执行大纲.tex # 单次即可,无交叉引用
+cd 课程执行大纲
+xelatex 课程执行大纲.tex
+xelatex 课程执行大纲.tex % 跑两遍,目录与交叉引用才正确
```
-需要 `ctex` + `geometry` + `fontspec` + `xeCJK` + `tabularray`。
-实测环境:TeX Live 2022 / tabularray 2022A。
+或仓库根:`bash build.sh 课程执行大纲`(自动跑两遍)
-## 换成一门真实的课
+## 文件
-**只改 `课程执行大纲.tex` 顶部的宏定义,不要动 `ouccourse.sty`。**
+| 文件 | 说明 |
+|---|---|
+| `课程执行大纲.tex` | 主文件,课程信息与正文改这里 |
+| `ouccourse.sty` | 版式包,一般不改 |
+
+## 课程信息
+
+在 `\begin{document}` 之前定义:
```latex
-\newcommand{\cfcourse}{信号与系统基础} % 课程名
-\newcommand{\cfyear}{2026} % 学年
-\newcommand{\cfseason}{秋} % 季学期
-\newcommand{\cfmode}{考试} % 考核方式:考试/考查/论文
-\newcommand{\cfcode}{081203304517} % 课程代码
-\newcommand{\cfhour}{56} % 总课时
-\newcommand{\cfcredit}{3.0} % 学分
-\newcommand{\cfprac}{18} % 实践学时
-\newcommand{\cfteacher}{陈立群} % 任课教师
-\newcommand{\cfteachno}{99663311} % 开课号
-\newcommand{\cfmajor}{电子信息工程} % 面向专业
-\newcommand{\cfattr}{专业核心必修课} % 课程属性
+\newcommand{\cfcourse}{信号与系统基础} % 课程名
+\newcommand{\cfyear}{2026} % 开课年份
+\newcommand{\cfseason}{秋} % 季
+\newcommand{\cfmode}{考试} % 考核方式
+\newcommand{\cfcode}{081203304517} % 课程代码
+\newcommand{\cfhour}{56} % 总课时
+\newcommand{\cfcredit}{3.0} % 学分
+\newcommand{\cfprac}{18} % 实践学时
+\newcommand{\cfteacher}{陈立群} % 任课教师
+\newcommand{\cfteachno}{99663311} % 开课号
+\newcommand{\cfmajor}{电子信息工程} % 面向专业
+\newcommand{\cfattr}{专业核心必修课} % 课程属性
```
-正文各节直接用 `\ccsec{}`(一级标题)、`\ccp{}`(带 2 字首行缩进的正文)。
+| 参数 | 说明 |
+|---|---|
+| `\cfcourse` | 课程名 |
+| `\cfyear` | 开课年份 |
+| `\cfseason` | 季学期,春 / 秋 |
+| `\cfmode` | 考核方式(考试 / 考查) |
+| `\cfcode` | 课程代码 |
+| `\cfhour` | 总课时 |
+| `\cfcredit` | 学分 |
+| `\cfprac` | 实践学时 |
+| `\cfteacher` | 任课教师 |
+| `\cfteachno` | 开课号 |
+| `\cfmajor` | 面向专业 |
+| `\cfattr` | 课程属性 |
-### 表 0 —— 成绩综合评分体系
+## 正文写法
```latex
-\begin{ccscoretable}
-成绩综合评分体系 & 比例\% \\ % 表头
-1.课下作业、课堂讨论及平常表现 & 24 \\
-2.实验成绩 & 20 \\
-3.期末考试成绩 & 56 \\
-总计 & 100 \\
-\end{ccscoretable}
+\ccschool
+\ccsubtitle
+\ccmaintitle{本科课程执行大纲}
+
+\ccsec{一、课程基本信息}
+
+\ccfieldrow{【课程名】}{\cfcourse}{【开课时间】}{\cfyear\ 学年 \cfseason\ 季学期}
+\ccfieldrow{【考核方式】}{\cfmode}{【课程代码】}{\cfcode}
+\ccfieldrow{【总课时/学分】}{\cfhour/\cfcredit}{【实践学时】}{\cfprac}
+\ccfieldone{【任课教师/开课号】}{\cfteacher/\cfteachno}
+\ccfieldone{【面向专业/课程属性】}{\cfmajor/\cfattr}
+
+\ccsec{二、课程内容}
+\ccp{1.课程描述(中英文):}
+\ccp{本课程是电子信息类专业的核心基础课……}
+\ccp{This course is a core foundation subject for ...}
```
-行数可以增减,行高自动(每行 7.834mm)。
+| 命令 | 用途 |
+|---|---|
+| `\ccschool` | 印「中国海洋大学」校名 |
+| `\ccsubtitle` | 印副标题 |
+| `\ccmaintitle{标题}` | 主标题 |
+| `\ccsec{标题}` | 一级节(一、二、三…) |
+| `\ccp{正文}` | 正文段落 |
+| `\ccpz{正文}` | 正文段落,不缩进 |
+| `\ccfieldrow{标签1}{值1}{标签2}{值2}` | 一行两栏的信息行 |
+| `\ccfieldone{标签}{值}` | 一行一栏的信息行 |
+| `\ccblank{n}` | n 个空行位 |
+| `\ccdateblank` | 日期空位 |
+| `\ccsignlab{文字}` | 签字栏标签 |
+| `\ccnewpage` | 强制分页 |
-### 表 1 —— 教学日历
+## 表格
-```latex
-\begin{cctable}
-{\ccfang\ccszxi\bfseries 周次} & ... & {\ccszix 内容} & 2 & {\ccszix ...} & {\ccszix ...} \\
-\end{cctable}
-```
+教学安排表、考核方式表用 `tblr` 环境。表宽常量:
-- 6 列,顺序固定:周次 / 内容顺序 / 主题 / 计划课时 / 教学内容及教学方式 / 思政点及支撑指标点情况
-- 纵向合并周次段用 `\SetCell[r=2]{c}`(跨 2 行,`r=N` 即跨 N 行)
-- 表尾「合计」行后有两个 `\SetCell[c=6]{c}` 的整行合并(任课老师签字 / 审核意见)
-- 表内默认 9pt;表头用 `\ccszxi`(11pt)加粗;审核意见格内部钉死 10.5pt/12.6pt
+| 常量 | 说明 |
+|---|---|
+| `\cctblw` | 表格总宽 |
+| `\ccAwd` … `\ccFwd` | 各列宽度 |
+| `\ccscoretblw` / `\ccscoreAwd` / `\ccscoreBwd` | 成绩表的宽与列宽 |
-## 版式数据来源(twips → mm)
-
-原 docx 的 `sectPr`:
-
-| 属性 | twips | mm | 说明 |
-|---|---|---|---|
-| `pgSz w` | 11910 | 210.08 | WPS 存的"非标准 A4",本包用标准 210 |
-| `pgSz h` | 16840 | 297.04 | 同上,用 297 |
-| `pgMar top` | 1420 | 25.05 | 上边距 |
-| `pgMar bottom` | 280 | **4.94** | 下边距极小,原文件为塞进 5 页压出来的 |
-| `pgMar left` | 1560 | 27.52 | 左边距 |
-| `pgMar right` | 1300 | 22.93 | 右边距(左右不对称,照抄) |
-| `pgMar header/footer` | 720 | 12.70 | 无页眉页脚内容,仅占位 |
-
-换算:`mm = twips / 1440 × 25.4`,`pt = twips / 20`。
-
-### 表 0(成绩综合评分体系)
-
-| 项目 | twips | mm |
-|---|---|---|
-| `gridCol` | 7479 + 1418 | 131.921 + 25.012 |
-| 表宽 | 8897 | **156.93** |
-| `tblCellMar left/right` | 108 | 1.905 |
-| `trHeight`(exact) | 454 | 8.01(本包用 7.834,见坑 3) |
-| 边框 `sz` | 4 | 0.5pt |
-
-`tblLayout fixed`、`jc center`、`tblW 0 auto`。全表 12pt 仿宋(朱雀仿宋)。
-
-### 表 1(教学日历)
-
-| 项目 | twips | mm |
-|---|---|---|
-| `gridCol` | 846,1134,1877,850,2835,1843 | 14.922, 20.002, 33.108, 14.993, 50.006, 32.508 |
-| 表宽 | 9385 | **165.54**(超版心 5.91) |
-| `trHeight` R0(atLeast) | 917 | 16.17 |
-| `trHeight` R14(atLeast) | 1825 | 32.19 |
-| `trHeight` R15(atLeast) | 1073 | 18.93(只是下限,实际被撑到 56mm) |
-
-**16 行**。R1~R13 无 `trHeight`,行高由内容决定。纵向合并 5 组(R1-R2、R3-R4、
-R5-R6、R7-R8、R9-R10);R14/R15 是 `gridSpan=6` 的整行合并。
-
-## 六个必须知道的坑
-
-### 1. 表宽 > 版心时,不要缩放列宽
-
-docx 里表 1 是 165.54mm,版心只有 159.55mm。Word 允许表格超出、居中后压进左右页边距。
-
-**不要按 159.55/165.54 按比例缩列宽。** 缩了之后长文字会提前折行,行高、页数全变。
-正确做法:列宽照抄 `gridCol`,用 `\leftskip` 把整块左移。
-
-```latex
-\hsize=\cctblw \linewidth=\cctblw % 让表内得下,不报 Overfull
-\leftskip=-\cctblshift \rightskip=0pt % 整块左移 5.29mm,落到 22.23mm
-```
-
-`\hspace*` 对 `longtblr` 生成的 `\halign` 盒子**无效**,会被吞掉,必须用 `\leftskip`。
-
-### 2. `wd=` 是内容宽,不含竖线自身的宽度
-
-tabularray 的 `Q[...,wd=X]` 里 X 是**内容宽**。每条 `vline` 自身还占 0.5pt = 0.17639mm。
+## 版式
```
-表 1:6 列 7 条线,每列承担 7/6 条 ⇒ wd = gridCol − 2×colsep − 0.2058
-表 0:2 列 3 条线,每列承担 1.5 条 ⇒ wd = gridCol − 2×colsep − 0.2646
+A4,多页
+封面 + 基本信息表 + 各节正文
+正文宋体,标题黑体,表格 9pt
```
-漏算的后果很隐蔽:表看起来对,但总宽每列多 0.18mm,6 列就差出 1mm。
+## 注意
-### 3. `ht=` 也含横线宽度预算
-
-`row{1-Z}={ht=8.01mm}` 画出来是 **8.19mm**(每行多一条 0.5pt 横线)。
-要得到 8.01mm 的真实行高,`ht` 要给 **7.834mm**。
-
-### 4. `presep/postsep/headsep/footsep` 是 outer 键
-
-写进 `\begin{longtblr}[...]` 的**方括号**里;写进花括号(inner spec)不会生效,
-反而会把 `0pt` 当表内容印在表格第一行 —— 表头上会出现一串
-`0pt0pt0pt0pt` 的垃圾文字,而且**不报错**。
-
-同理,表级默认字号必须写 `cells={font=\ccszix}`,单独写 `font=` 会被静默忽略。
-
-### 5. 跨页续页提示要清两组模板
-
-`longtblr` 跨页时默认印 `( Continued )`、表尾印 `Continued on next page`,
-有 caption 时还印 `表0:`。清干净要动两组:
-
-```latex
-% (a) 内容模板 *-text —— 不能设成 empty!会报
-% "LaTeX3 Error: Erroneous variable \l__tblr_template_conthead_text_tl"
-\DefTblrTemplate{conthead-text}{normal}{}
-\DefTblrTemplate{contfoot-text}{normal}{}
-\SetTblrTemplate{conthead-text}{normal}
-\SetTblrTemplate{contfoot-text}{normal}
-% (b) 模板实例
-\SetTblrTemplate{caption-tag}{empty}
-\SetTblrTemplate{caption-sep}{empty}
-\SetTblrTemplate{caption-text}{empty}
-\SetTblrTemplate{caption}{empty}
-\SetTblrTemplate{conthead}{empty}
-\SetTblrTemplate{contfoot}{empty}
-```
-
-只做 (b) 时第 5 页仍会出现「表0:」与「(Continued)」,因为模板实例里调的是
-`\UseTblrTemplate{...}{default}`,会回退到 `normal` 内容。
-
-### 6. `\linespread` 是乘在基准字号上的
-
-ctex 默认 `\linespread ≈ 1.3`,会把 `\fontsize{12}{18}` 的行距放大到 23.4pt。
-
-给字号设行距时**必须**先归 1:
-
-```latex
-\newcommand{\ccfont}[2]{\linespread{1}\relax\fontsize{#1}{#2}\selectfont}
-```
-
-反过来,在已经缩小过字号的上下文里,**不能**用 `\linespread{1.2}` 当"1.2 倍行距"
-(它乘的是外层的 9pt,不是当前的 10.5pt),要直接钉 `\fontsize{10.5}{12.6}`。
-
-## 字体
-
-原 docx 用了 4 个字体,其中 3 个是**方正商业字体**,嵌在 docx 里但本机没装。
-旧版做法是降级到 Windows 自带字体(宋体/黑体/仿宋 + `AutoFakeBold` 伪粗),
-但这既依赖本机装了什么字体(换台机器就可能编不出),而且 SimSun / SimHei /
-FangSong 也都不允许随仓库分发。
-
-现在全部改用仓库公共字体包 `../fonts.tex`:
-
-| docx 原字体 | 用在哪 | 本包替代 | 命令 |
-|---|---|---|---|
-| 方正小标宋简体 | 校名、副标题、大标题、教学日历 | OUC Serif **真粗体** | `\ccbiaosong` |
-| 方正仿宋_GB2312 | 正文、表 0、签字栏 | 朱雀仿宋 | `\ccfang` |
-| 黑体 | 各级标题 | OUC Sans(思源黑体) | `\cchei` |
-| 宋体 | 教学日历表 9pt | OUC Serif(思源宋体) | `\ccsong` |
-
-比原来的伪粗更好:小标宋本来就是宋体的标题变体,用思源宋体自带的真粗体,
-笔画不会像 `AutoFakeBold=3.2` 那样糊在一起。
-
-> ⚠️ **朱雀仿宋只有常规一档**,`\ccfang` 下 `\bfseries` 不会真的变粗。
-> 教学日历表头(`课程执行大纲.tex` 里的 `{\ccfang\ccszxi\bfseries 周次}` 等 6 处)
-> 原来靠 `AutoFakeBold=2.5` 伪粗,现在给 `ccfang` 单独开了 `FakeBold=0.8`
-> 保住层次(见 `ouccourse.sty` 的注释)。若要更实在的粗体,把那几处
-> `\ccfang` 换成 `\cchei` —— 黑体本身就是标题用的重字面。
-
-同时 `\xeCJKsetup{CJKecglue={}}` 关掉了西文与汉字之间的自动空隙 —— 原 docx 没有这种空隙,
-不关会在中英交界处多出一个空格(原 docx 里紧挨着的「2026 学年」「56/3.0」都会松开)。
-
-## 院名可改(原先是硬编码的 ×× 占位)
-
-首页抬头第二行原本在 `ouccourse.sty` 里**写死**成「××学部××学院」,PDF 里
-能直接看到 4 个叉号。现在拆成两个名称宏,改院名只动导言区:
-
-```latex
-\renewcommand{\ccdepartment}{海洋地球科学学院} % 默认「信息科学与工程学部」
-\renewcommand{\cccollege}{地质学系} % 默认「计算机科学与技术学院」
-```
-
-默认值取自本模板的虚构设定(陈立群 / 电子信息工程 / 2025 秋),与课程教学日历、
-成绩构成说明、试卷等模板保持一致。校名「中国海洋大学」是真实的,不虚构。
-
-> ⚠️ 为什么不写成 `\ccschool[学部][学院]`:LaTeX 的 `\newcommand` 只支持
-> **一个**可选参数,第二个方括号会被当成正文印出来。
-
-## 与 docx 的已知差异
-
-| 项目 | docx | 本模板 | 原因 |
-|---|---|---|---|
-| 纸张 | 210.08 × 297.04 | 210 × 297 | 标准 A4,肉眼不可辨 |
-| 表格是否跨页 | 表 1 跨第 4/5 页 | 同 | 表高 334mm > 版心 267mm |
-| 跨页处表头 | 不重复(无 `tblHeader`) | 不重复 | 一致 |
-| 行内是否允许断开 | 允许(无 `cantSplit`) | 允许 | 一致 |
-| 表 0 每行高 | 8.01 | 8.01 | 一致 |
-| 表 1 表宽 | 165.54 | 165.36(−0.18) | 竖线宽度舍入 |
-| 字体 | 方正小标宋/仿宋 | 思源宋体粗/朱雀仿宋 | 商业字体不可分发,已换开源替代 |
-| 修订标记 | 46 处 `w:ins` | 不保留 | 已接受全部插入修订 |
-| 46 处 `w:ins` 中的红字 | `color=C00000` | 黑色 | 那是修订高亮,非正式版式 |
-
-## 校验方法
-
-不靠肉眼,靠量。
-
-```bash
-pdftocairo -svg -f 4 -l 4 课程执行大纲.pdf /tmp/p4.svg # 矢量线条
-pdftotext -bbox 课程执行大纲.pdf /tmp/bbox.html # 字坐标
-```
-
-或用 `pymupdf` 直接读(推荐,能同时拿到线段与 span 的 bbox):
-
-```python
-import pymupdf
-d = pymupdf.open('课程执行大纲.pdf')
-for dr in d[3].get_drawings(): # 表格横竖线
- for it in dr['items']:
- if it[0] == 'l':
- print(it[1], it[2]) # 两端点,单位 pt
-```
-
-**注意**:同一条竖线会被重复计入多次(每个单元格一段),做列宽计算前必须
-`sorted(set(round(x,2) ...))` 去重,否则 `xs[1]-xs[0]` 算出来是 0。
-
-### 验收结果(实测,26/26 项达标)
-
-```
-表 0 宽 156.753 目标 156.930 差 −0.177
- 左 27.608 目标 27.520
- 高 40.040 目标 40.050
- 列 131.830 / 24.924 目标 131.921 / 25.012
-表 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
- R0 16.334(目标 16.170) R14 32.385(目标 32.190)
- R15 56.339(atLeast 下限 18.930,被 12 段内容撑高)
-页数 5(与原 docx 一致)
-编译 零错误、零 Overfull、零 Underfull
-各页最低点均 ≤ 292.06mm 版心下沿,无越界
-```
\ No newline at end of file
+示例内容为虚构数据,使用时全部替换。签字栏留空手填。
\ No newline at end of file
diff --git a/课程教学日历/README.md b/课程教学日历/README.md
index afab1cd..32f00fe 100644
--- a/课程教学日历/README.md
+++ b/课程教学日历/README.md
@@ -1,428 +1,114 @@
-# 课程教学日历 —— 中国海洋大学课程教学日历(理论课程)
+# 课程教学日历
-学校下发的**通用空白表**「附件3:中国海洋大学课程教学日历(理论课程)」的
-XeLaTeX 模板。原文件是学校统一的 `.doc` 表(7 列 × 18 行的 16 周教学日历 +
-课程考核说明 + 签字栏),本目录把它做成可直接编译的 LaTeX 版。
+中国海洋大学课程教学日历(理论课程),A4 单页,16 周日历表。
-> **本模板不含任何真实课程数据。** 原 `.doc` 是一份**填过的实例**,本模板只复刻
-> 它的版式,一个字段都没带过来 —— 见下面「真实数据零泄漏」。
->
-> 但样张**不是满篇叉号**:为了能看出排版效果,填了一份**完整的虚构课程**——
-> 《数字逻辑》2025 秋学期、计算机科学与技术学院、任课教师「张远航」、
-> 86 人、4 学分 64 学时、开课号 `080502101231`,16 周周次与章节内容全部写满
-> (含每章作业编号)。这套设定与 [`成绩构成说明/`](../成绩构成说明/)、
-> [`试卷归档封面/`](../试卷归档封面/)、[`试卷/`](../试卷/) 是**同一门课**,
-> 四份文档放在一起看是自洽的。
+## 编译
-> 与 [`试卷归档封面/`](../试卷归档封面/)、[`试卷归档目录/`](../试卷归档目录/)
-> 的关系:三件同属教务处下发的表格套件(附件1 封面、附件2 归档目录、
-> 附件3 教学日历),版式上都照原 `.doc` 1:1 还原,做法同一套
-> (版心设成表格可见范围 + `caloutside` 环境放回表格外的段落),互不依赖。
+```bash
+cd 课程教学日历
+xelatex 课程教学日历.tex
+xelatex 课程教学日历.tex % 跑两遍
+```
+
+或仓库根:`bash build.sh 课程教学日历`(自动跑两遍)
## 文件
| 文件 | 说明 |
|---|---|
-| `oucal.sty` | 版式包。A4、表宽 174.625mm、7 列、18 行显式行高,每项尺寸都附换算过程 |
-| `课程教学日历.tex` | 正文入口(课程信息与 16 周内容写在这里) |
-| `课程教学日历.pdf` | 成品样张 |
+| `课程教学日历.tex` | 主文件,课程信息与 16 周内容改这里 |
+| `oucal.sty` | 版式包,一般不改 |
-## 编译
+## 课程信息
-```bash
-xelatex 课程教学日历.tex
-```
-
-必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
-自包含,不依赖任何图片。实测 **3 页**、零警告(无 Overfull / Underfull / 缺字)。
-
-> ⚠️ 页数与原件不同:原件 2 页,本模板 3 页。原因见「原件的不一致之处」第 1 条 ——
-> 原件第一周那一行的行距缺省(15.6pt),本模板统一按 23pt 排,多出 22pt,
-> 正好把表格顶到第 3 页。这是**有意取舍**,不是 bug。
-
-## 用法
-
-### 课程信息
-
-改 `.tex` 开头的宏(下面注释里的值是**样张实际用的虚构值**,不是占位符):
+在 `\begin{document}` 之前定义:
```latex
\newcommand{\calcno}{附件3} % 附件编号
-\newcommand{\calcname}{数字逻辑} % 课程名称
-\newcommand{\calyear}{2025} % 学年
-\newcommand{\calseason}{秋} % 季学期(春/秋)
+\newcommand{\calcname}{数字逻辑} % 课程名称
+\newcommand{\calyear}{2025} % 学年
+\newcommand{\calseason}{秋} % 季学期(春/秋)
\newcommand{\caldept}{计算机科学与技术学院(系)} % 开课单位
-\newcommand{\calcodenum}{080502101231} % 开课号(12 位)
-\newcommand{\calteacher}{张远航} % 任课教师
-\newcommand{\calcredit}{4.0} % 课程学分
-\newcommand{\calhour}{64} % 总学时
-\newcommand{\calstudent}{86} % 学生人数
-\newcommand{\calassess}{闭卷考试} % 考核方式
+\newcommand{\calcodenum}{080502101231} % 开课号(12 位)
+\newcommand{\calteacher}{张远航} % 任课教师
+\newcommand{\calcredit}{4.0} % 课程学分
+\newcommand{\calhour}{64} % 总学时
+\newcommand{\calstudent}{86} % 学生人数
+\newcommand{\calassess}{闭卷考试} % 考核方式
```
-> ⚠️ 改课程名 / 教师名时注意**字数**:表头标题、日期列宽都是按 4 字课程名、
-> 3 字教师名标定的。课程名超过 6 字可能让「中国海洋大学 ○○ 课程教学日历」
-> 那行折行,教师名超过 4 字会挤压签字栏。改完翻到 PDF 看一眼再走。
-
-签字栏的「年 月 日」**没有对应的宏**,因为那是手写填写的空位,
-模板中保持印刷好的「年」「月」「日」三个字,中间留白给老师签日期。
-
-### 教学日历表
-
-每行格式:
-
-```latex
-\calcell{第一周} & \calcell{×月×日至×月×日} & \calcell{×} &
-\calcell{课程基本情况介绍\par 引例\par 补充知识} & \calcell{多媒体讲课} & & \\
-```
-
-可用的单元格宏:
-
-| 宏 | 用途 | 说明 |
-|---|---|---|
-| `\calcell{...}` | 左对齐格 | 正文常用 |
-| `\calctr{...}` | 居中格 | 表头、第 11~16 周的周次列 |
-| `\calhead{...}` | 表头(**不加粗**,见下) | 原件表头无 `w:b` |
-
-## ⚠️ 改表之前必读:行高是写死的
-
-`oucal.sty` §5 里 18 个 `row{n}={ht=...}` 是**按每行的实际行数**算出来的:
-
-```
-ht = (内容行数 − 1) × 23pt
-```
-
-原件所有表格段落都是 `w:line=460 exact`(23pt 固定行距),且每个单元格
-多带一个空段落,所以**最少 2 行**。于是:
-
-| 内容行数 | ht | 原件实测行高 |
-|---|---|---|
-| 2 行 | 46.00pt | 46.5pt |
-| 3 行 | 69.00pt | 69.5pt |
-| 4 行 | 92.00pt | 92.5pt |
-| 5 行(表头) | 115.50pt | 115.5pt |
-
-差的那 0.5pt 是边框线宽,由 tabularray 自己加。
-
-**ht 是最小高度**(内容多了会顶高、少了不会压扁)。所以:
-
-- **加长**某周的教学内容 → 折行数变多 → 该行会被内容顶高,`ht` 不用改,但整表会变长
-- **缩短**某周的教学内容 → 折行数变少 → `ht` 就会留下空白,必须手动改小
-- **改字号或列宽** → 全部折行数都可能变 → 18 个 `ht` 都要重新标定
-
-重新标定的办法(不靠猜):编译后导出 PDF,读第 1 页的横线:
-
-```python
-import pymupdf
-d = pymupdf.open("课程教学日历.pdf")
-ys = {}
-for dr in d[0].get_drawings():
- r = dr["rect"]
- if abs(r.y1 - r.y0) < 2 and r.width > 20: # 横线
- k = round(r.y0, 1)
- ys[k] = ys.get(k, 0) + r.width
-rows = sorted(k for k, w in ys.items() if w > 300) # 只留跨多列的
-print([round(rows[i] - rows[i-1], 2) for i in range(1, len(rows))])
-```
-
-输出就是逐行行高,与上表对照即可。
-
-## 版式参数
-
-全部照原 `.doc` 换算,未做主观调整:
-
-| 项目 | 值 | 来源 |
-|---|---|---|
-| 纸张 | A4 210×297mm | `pgSz` 11906×16838 twips |
-| 页边距 | 上下 25.40mm、左右 31.75mm | `pgMar` 1440 / 1800 twips |
-| 表宽 | 174.625mm | `tblW` 9900 twips |
-| 表格缩进 | −13.97mm(**负**,比版心更靠左) | `tblInd` −792 twips |
-| 表格可见左边界 | 15.875mm | 31.75 − 13.97 − 1.905(cellMar) |
-| 列宽 | 15.875 / 25.559 / 18.150 / 47.078 / 24.095 / 21.590 / 22.278 mm | `gridCol` 900/1449/1029/2669/1366/1224/1263 twips |
-| 单元格内边距 | 左右 1.905mm、上下 0 | `tblCellMar` 108 twips |
-| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位) |
-| 行距 | **23.00pt 固定** | `w:line=460` `lineRule=exact` |
-| 行高 | 全表无 `trHeight`,由内容撑开 | 实测 = 行数×23 + 0.5pt |
-| 附件号/标题 | 14pt 粗 | `w:sz=28` + `w:b` |
-| 学年学期行 | 12pt 粗 | `w:sz=24` + `w:b` |
-| 正文/表格/签字栏 | 10.5pt | Normal 样式 `w:sz=21` |
-
-### 列宽为什么是 `gridCol − 2×colsep − 线宽`
-
-`wd = gridCol − 2×1.905mm − 0.1764mm`。tabularray 把边框线宽算进列宽里
-(相邻竖线中心距 = `wd + 2×colsep + 线宽`)。按「竖线根数分摊」算每列会窄
-0.154mm,整表窄 1.07mm —— 这点在 `试卷归档目录/` 里实测验证过,直接沿用。
-
-### `totalwidth` 为什么是 174.80mm 而不是 174.625mm
-
-Σwd + 内边距 + 8 条竖线 = 174.8013mm。若取 174.625 会报
-`Table width is too small` —— tabularray 的盒子还要多占约 0.4945pt
-(左竖线画在边界内侧、右竖线外缘又占半个线宽)。
-
-## 实测校验
-
-用 pymupdf 读两版 PDF(原件由 WPS COM 导出,136 个文字 span + 21 条横线 + 8 条竖线),
-逐位对比:
-
-### 竖线(8 条,单位 mm)
-
-| # | 原件 | 本模板 | Δ |
-|---|---|---|---|
-| 1 | 15.875 | 15.875 | 0.000 |
-| 2 | 31.750 | 31.750 | 0.000 |
-| 3 | 57.309 | 57.309 | 0.000 |
-| 4 | 75.458 | 75.454 | −0.004 |
-| 5 | 122.560 | 122.556 | −0.004 |
-| 6 | 146.629 | 146.625 | −0.004 |
-| 7 | 168.218 | 168.214 | −0.004 |
-| 8 | 190.500 | 190.500 | 0.000 |
-
-**最大 |Δ| = 0.004mm。**
-
-### 纵向锚点(基线 y,单位 pt)
-
-| 锚点 | 原件 | 本模板 | Δ |
-|---|---|---|---|
-| 「附件3:」 | 92.69 | 92.69 | **0.00** |
-| 标题 | 123.89 | 123.89 | **0.00** |
-| 「学年 学期」 | 150.41 | 150.42 | +0.01 |
-| 课程信息第 1 行 | 191.81 | 191.82 | +0.01 |
-| 课程信息第 2 行 | 214.85 | 214.82 | −0.03 |
-| 表格顶线 | 242.60 | 242.60 | **0.00** |
-| 「院(系)负责人签字」x | 321.00 | 320.99 | −0.01 |
-| 签字栏「年」x | 355.08 | 355.09 | +0.01 |
-| 签字栏「月」x | 376.08 | 376.09 | +0.01 |
-| 签字栏「日」x | 397.08 | 397.10 | +0.02 |
-
-### 行高(21 条横线,单位 pt)
-
-17/18 行 **Δ ≤ 0.4pt**;唯一例外是第 2 行(第一周)多 22.0pt,
-原因见「原件的不一致之处」第 1 条。
-
-### 字号
-
-导出 PDF 读 span 的 `size`:**14.00 / 12.00 / 10.50** 三档,与 Word 的
-28/24/21(半磅)÷2 逐位相同。
-
-## 五个坑(改之前先看)
-
-### 1. `\fontsize` 必须用 `bp`,不能用默认的 `pt`
-
-Word 的 pt 是 PostScript point(1/72 英寸),TeX 默认的 pt 是 TeX point
-(1/72.27 英寸),**大 0.36%**。写 `\fontsize{10.5}{23}` 实测排出来 10.45、
-23pt 的 `\baselineskip` 实测 22.9167。必须写 `10.5bp` / `23bp`。
-
-这条与 `试卷归档目录/` 的坑 1 是同一个。
-
-### 2. Word 的「固定行距」在 TeX 里不是 `\fontsize` 的第二参数
-
-原件的 `w:line=460 exact` 意思是**每一行都占满 23pt,首行也不例外**
-(既不算字体的 ascent,也不算 descent,硬压成 23)。而 TeX 的
-`\fontsize{10.5bp}{23bp}` 只设了 `\baselineskip = 23pt`:
-
-| n 行格子 | Word | TeX 裸排 |
-|---|---|---|
-| 1 行 | 23.00pt | 11.00pt(ascent + descent) |
-| 5 行 | 115.00pt | 99.00 + 约 8pt = 107pt |
-
-初版没有处理这一条,编译出来表头只有 102.2pt(应 115.5),第七列第 5 行
-「节」直接压到表格底线以下。
-
-**试过但都不行的三个方案**:
-
-| 方案 | 实测结果 |
+| 参数 | 说明 |
|---|---|
-| `rowsep=6.6pt`(单元格上下 padding) | 1 行格 23.0 ✓、2 行格 **39.3** ✗(斜率 16.4 而非 23) |
-| `\rule[-4.35pt]{0pt}{23pt}` 段首段尾各一 | 表头 150pt ✗(`\lineskip` 介入,每行多 1pt,首行基线跑到框外) |
-| `\vrule height 18.65pt depth 4.35pt` | 与 `\rule` 同 |
+| `\calcno` | 左上角附件编号 |
+| `\calcname` | 课程名称 |
+| `\calyear` | 学年 |
+| `\calseason` | 季学期,春 / 秋 |
+| `\caldept` | 开课单位 |
+| `\calcodenum` | 开课号,12 位数字 |
+| `\calteacher` | 任课教师 |
+| `\calcredit` | 课程学分 |
+| `\calhour` | 总学时 |
+| `\calstudent` | 学生人数 |
+| `\calassess` | 考核方式 |
-原因是 **xeCJK 的 `\CJKglue` 与 `\lineskip`** 会介入自动折行,行间距不是
-线性的,没法用单一 padding 同时满足 1/2/4/5 行。
+## 16 周日历表
-**最终用的**:直接给 `row{n}={ht=...}`,把「行高」这件事从盒模型手里拿走。
-`ht` 是最小值,配上内容刚好 = 目标值,结果确定、可复现。
-
-### 3. `\linespread` 必须在 `\fontsize` **之后**调用
-
-`\fontsize` 会重设 `\baselineskip`,把先前设的系数覆盖掉;反之
-`\linespread` 改的是系数,对已生成的 `\baselineskip` 立即生效。
+每行一周,7 个栏目用 `&` 分隔:
```latex
-\linespread{0.67826}\calfontC % ❌ 无效,行距还是 23pt
-\calfontC\linespread{0.67826}\selectfont % ✅ 15.6pt
+\begin{caltable}
+ \calctr{周次} & \calctr{日期} & \calctr{学时} & \calctr{教学内容} &
+ \calctr{教学方式} & \calctr{课堂讨论内容及其它教学环节} &
+ \calctr{课下作业及课后必读教材或参考书章节} \\
+
+ \calweek{第1周} & \caldate{9/1} & \calhourn{4} & 绪论 & 讲授 & —
+ & 教材第 1 章 \\
+ ...
+\end{caltable}
```
-(本包最终没用这条 —— 见「原件的不一致之处」第 1 条。但改行距时会踩。)
+| 命令 | 用途 |
+|---|---|
+| `\calctr{文字}` | 表头格(居中) |
+| `\calcell{文字}` | 表体格(左对齐) |
+| `\calweek{文字}` | 周次格 |
+| `\caldate{文字}` | 日期格 |
+| `\calhourn{数字}` | 学时格 |
-### 4. `\SetCell[c=7]{c}` 里的 `c` 是自然宽度,不折行
+增加周次直接复制一行改内容。删周次删整行。
-跨列的格必须显式给宽,否则整句不折行、直接冲出表外报 Overfull:
+## 版面微调
+
+`\calskip{距离}` 控制各区块的垂直间距:
```latex
-\SetCell[c=7]{c} % ❌ Overfull 197.8pt too wide
-\SetCell[c=7]{m,wd=170.638mm} % ✅
+\calskip{-4.330mm} % 顶端补偿
+\calskip{2.894mm} % 附件编号到标题
+\calskip{1.243mm} % 标题到学年行
+\calskip{6.493mm} % 学年行到课程信息
```
-`wd = 表宽 − 2×colsep − 取整余量 = 174.625 − 3.810 − 0.177 = 170.638mm`。
+各数值是按版面标定的。改学校名或课程名后如有偏移,按其差值调整对应
+的 `\calskip`,响应是线性的,一轮就能对准。
-### 5. `\leftskip` 与 `geometry` 的左边距会**叠加**,不是覆盖
-
-本包把版心设成表格可见范围(`left=15.787mm`),表格外的段落要靠
-`\leftskip` 放回原版心的 31.75mm。但 `\leftskip = 15.875mm` 排出来是
-**31.662mm**(15.787 + 15.875),而不是 31.75mm。
-
-必须取 `\leftskip = 31.75 − 15.787 = 15.963mm`。差 0.088mm 看着小,
-但它让所有「按原版心再做负缩进」的段落全部错位 —— 初版
-【开课单位】一行实测偏右 16.3pt。
-
-### 6.(附)负的 `\vspace*` 在 `\par` 处会被丢弃
-
-想压掉两段之间 2.11pt 的余差,写 `\vspace*{-2.11pt}` 或
-`\calskip{-0.734mm}` 都无效(TeX 在 `\par` 处丢弃负的垂直胶,
-不能"压缩"已存在的间距)。
-
-**正解**:让两行落在**同一段落**里,用 `\newline` 换行,`\baselineskip`
-就直接生效:
+## 字体档
```latex
-【开课单位】…\newline
-【课程学分】…\par
+\calfontA % 标题(附件编号、课程名、学年行)
+\calfontB % 学年行
+\calfontC % 课程信息行
```
-注意 `\newline` 之后的行是"段中行",**不吃 `\parindent`**,只认 `\leftskip`,
-所以要在段落开头把 `\leftskip` 整体前移。
+定义在 `oucal.sty`,改字号或字体在那里改。
-## 原件的不一致之处
+## 版式
-### 1. 第一周(第 2 行)的行距是 15.6pt,其余 17 行是 23pt
-
-原 `.doc` 里只有这一行的段落没写 `w:spacing`,随 `docGrid`
-(`linePitch=312` twips = 15.6pt)排。于是该行高 47.3pt,而同为 3 行的
-第五周(第 6 行)是 69.5pt —— 同样内容量,差 22.2pt。
-
-**本模板不复制这个不一致**,全表统一 23pt。后果是该行比原件高 22.0pt,
-表格总高 1132.3pt(原件 1114.2pt),最终排出 **3 页**(原件 2 页)。
-
-要压回 2 页的话:把第一周那一行的 3 个段落合并成自动折行(`\par` 分段
-不行,`\linespread` 只对段内行生效),再把 `row{2}` 的 `ht` 改成 24.30pt。
-但那等于把疏漏重新引入,故未采用。
-
-### 2. 周次列的对齐前 10 行、后 6 行不一致
-
-原件第 1~10 周(第一周~第十周)是 `jc=left`,第 11~16 周是 `jc=center`:
-
-| 周次 | 原件 x | 本模板 x |
-|---|---|---|
-| 第一周~第十周 | 50.40pt | 50.65pt |
-| 第十一周~第十六周 | 51.72pt | 51.75pt |
-
-差 1.32pt,肉眼几乎看不出,但确实是原件的行为。**本模板照抄这个不一致**
-(`.tex` 里前 10 行用 `\calcell`、后 6 行用 `\calctr`),因为改成统一反而
-会与原件对不上。若你想统一,把后 6 行的 `\calctr` 全换 `\calcell` 即可。
-
-### 3. 表头第 6、7 格是「2 个段落又各自折行」
-
-原件里这两格各是 2 个段落,但 PDF 显示 4 行与 5 行 —— 说明每个段落
-在格内**又自动折行**了一次。本模板把整句写进一格交给自动折行,
-实测折行数与原稿一致(c6 折 4 行、c7 折 5 行),表头行高 115.5pt
-= 5×23pt 就是这么来的。
-
-### 4. 表头**不加粗**
-
-视觉上表头显得醒目,但原 `.doc` 的表头格只有 `jc=center`,**没有 ``**。
-本模板照抄,不加粗。`\calhead` 保留了 `\bfseries` 的能力,想加粗自己去打开。
-
-### 5. 签字栏的「年 月 日」是手写填空位,不要填年份
-
-原件第 2 页底部两段:
-
-| 段落 | 定位方式 | 起点 x |
-|---|---|---|
-| 「院(系)负责人签字:」 | `w:ind firstLine=4515`(79.64mm) | 321.00 |
-| 「×××× 年 月 日」 | **无** `ind`,靠空格顶位 | 331.44 |
-
-原件是被填过的实例,年份位印着 4 个半角数字(x=331.44~352.50)。
-**本模板不写年份** —— 空白模板应该留白给老师手写。所以直接从「年」开始排:
-
-```latex
-\hspace*{93.517mm}\calfontC 年\hspace*{10.55pt}月\hspace*{10.55pt}日\par
+```
+A4,单页
+标题黑体,表格 7 列 × 17 行(1 表头 + 16 周)
+表格行高 23pt,行距统一
```
-三个字的实测锚点(10.45pt 宋体),本模板与原件逐字对齐:
+## 注意
-| 字 | 原件 x | 本模板 x | Δ |
-|---|---|---|---|
-| 年 | 355.08 | 355.09 | +0.01 |
-| 月 | 376.08 | 376.09 | +0.01 |
-| 日 | 397.08 | 397.10 | +0.02 |
-
-`\hspace*{93.517mm}` 的来历:目标 x = 355.09pt = 125.23mm,
-`caloutside` 环境的 `\leftskip` 是 15.963mm,geometry 左边距 15.787mm,
-两者叠加后排版起点在 31.75mm 处,故
-`125.23 − 31.75 = 93.48mm`。取 93.48mm 实测落在 354.98(偏左 0.10pt),
-加 0.037mm 微调到 **93.517mm**,实测 355.09(偏右 0.01pt)。
-
-⚠️ 三字之间的空档是 **10.55pt**,不是 21pt。因为中文字形本身占 10.5pt,
-「年」起点到「月」起点 = 字形宽 10.5 + 空档 10.55 ≈ 21.0pt。
-
-#### ❌ 曾经踩的坑:用负 `\hspace` 塞年份占位符 → 三字重叠
-
-第一版模板里有 `\calgrade`(`20××`)占位,写法是:
-
-```latex
-\hspace*{92.604mm}\calfontC \calgrade~年\hspace{-8.35mm}月\hspace{3.34mm}日
-```
-
-实测:「月」落在 376.08,但 `20×× 年` 一直延伸到 x=399.74,
-「月」正好压在「年」上 —— **三个字叠成一个墨团**。
-
-原因:**负 `\hspace` 只能压缩它后面盒子之间的间距,不能把已经排出去的
-字符收回来**。减少间距减到负数 = 重叠,而不是"往回挪"。
-
-最终解法不是修排版技巧,而是**去掉年份占位符** —— 那本来就不该有。
-现在这一行只有三个中文字,不存在宽度变化,位置永远稳定。
-
-### 6. `\calgrade` 已删除
-
-曾经有过 `\newcommand{\calgrade}{20××}`,后因「签字栏不该印年份」而删除。
-如果你需要**预填**年份(比如批量生成带年份的表),自己加回来:
-
-```latex
-\hspace*{81.52mm}{\calfontC\makebox[34.0pt][r]{2026}年}%
-\hspace*{10.55pt}\calfontC 月\hspace*{10.55pt}日\par
-```
-
-要点:年份必须放进**定宽 `\makebox`**,让盒宽吸收内容长度变化,
-否则换 `2026` 与 `20××` 时「月」「日」会跟着漂移。
-
-实测该写法落到:年 354.95 / 月 375.96 / 日 396.97(目标 355.08 / 376.08 / 397.08)。
-
-## 真实数据零泄漏
-
-原 `.doc` 是一份**填过的实例**(真实课程名、开课号、教师姓名、人数、
-年份、16 周真实日期与章节名)。本模板把这些字段**全部换掉**了:
-换成一组同样完整、但纯属编造的课程数据(见开头那段),字段一个没留。
-
-已逐类 grep 确认以下**类别**在 `oucal.sty` 与 `课程教学日历.tex` 中零命中:
-原件课程名、原件开课号、原件教师姓名、原件年份、原件周次日期、
-原件章节名、原件学部名、原件考核方式。
-
-> ⚠️ 为什么是「换掉」而不是「打叉」:这张表**16 行格子、每行 3~4 个字段**,
-> 全打叉的话整张表是灰的,既看不出周次排布,也判断不出某行内容多了会不会
-> 撑高行高(本表的行高是写死的 `ht=` 最小高,内容超了会顶出去)。
-> 填满一遍才发现「有的周章节名写两行,有的写一行」正是原件的真实形态。
-
-**替换成你自己课程的内容时,注意不要把原件的真实信息再写回模板提交。**
-`git diff` 里出现真实课程名 / 教师名就等于泄了。
-
-## 字体
-
-全部取自仓库根目录的 [`fonts/`](../fonts/),通过 [`fonts.tex`](../fonts.tex) 声明:
-
-| 用途 | 字体 | 授权 |
-|---|---|---|
-| 正文宋体 | OUC Serif(思源宋体 SC 子集) | OFL 1.1 |
-| 西文/数字 | TeX Gyre Termes(Times 度量兼容) | GUST Font License |
-
-原件用的是「宋体 + Times New Roman」。换开源等价字体后**字宽逐字相同**,
-所以列宽、折行数、行高都不受影响 —— 这一点已由上面的行高实测表验证。
\ No newline at end of file
+示例内容是虚构的教学安排,使用时全部替换。
\ No newline at end of file