diff --git a/README.md b/README.md
index 6ba2f57..77761e4 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@
| 目录 | 内容 | 编译入口 |
|---|---|---|
| [`试卷/`](试卷/) | 期末考试**试卷**、**参考答案及评分标准**两套模板 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` |
+| [`试卷归档封面/`](试卷归档封面/) | 信息科学与工程学部**试卷归档封面**(理论课) | `试卷归档封面.tex` |
| [`年度考核登记表/`](年度考核登记表/) | 教职工**年度考核登记表** | `年度考核登记表.tex` |
| [`劳务发放说明表/`](劳务发放说明表/) | **劳务发放说明表** | `劳务发放说明表.tex` |
| [`课程执行大纲/`](课程执行大纲/) | 本科**课程教学执行大纲、教学日历** | `课程执行大纲.tex` |
@@ -23,15 +24,32 @@ xelatex slides.tex
xelatex slides.tex # 跑两遍,第二遍才能取到正确的目录、交叉引用与总页数
```
-目录名含中文不影响编译(已实测 6 个模板在中文目录下零报错编译通过)。
+目录名含中文不影响编译(已实测 7 个模板目录在中文目录下零报错编译通过)。
## 说明
-- **每个子目录自包含**:样式文件(`.sty` / `.cls`)、字体、图片都在各目录内,编译时不需要额外的宏包搜索路径。
-- **字体随模板附带**:`幻灯片/fonts/`(鸿蒙 HarmonyOS Sans)、`科技报告/font/`(鸿蒙 + 方正系列)内置了字体文件,**无需在系统里安装字体**。其余四个模板用系统自带的宋体 / 黑体 / 仿宋 / Times New Roman,缺失时按各目录 README 的降级表替换。
+- **字体单一来源**:全库字体集中在根目录 [`fonts/`](fonts/),由 [`fonts.tex`](fonts.tex) 统一加载。七个模板通过 `\input{../fonts.tex}` 取字体,**不自带字体、不依赖系统字体**——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。
+- **全部开源可商用**:无方正、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、无微软雅黑。用的是思源宋体/黑体、霞鹜文楷、朱雀仿宋、TeX Gyre Termes、鸿蒙 HarmonyOS Sans(各字体授权见 [`fonts/LICENSE`](fonts/LICENSE),来源与字符集见 [`fonts/README.md`](fonts/README.md))。
+- **每个子目录自包含**:样式文件(`.sty` / `.cls`)、图片都在各目录内,编译时不需要额外的宏包搜索路径;只有字体是共享的上层目录。
- **各目录的 `README.md`** 写明该模板的用法、可改参数、版式数据来源与书写注意事项,改之前先看。
- **示例内容为占位**:模板均不含真题、不含真人信息,姓名 / 学号 / 职工号 / 课程代码等一律用 `×` 或虚构值占位,按实际情况替换即可。
+## 字体
+
+| 目录 | 字体 | 上游 | 授权 |
+|---|---|---|---|
+| `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/harmonyos-sans/` | HarmonyOS Sans(幻灯片/科技报告) | 华为 | 华为官方允许免费商用 |
+
+合计约 49 MB(改造前 141 MB,见 [`fonts/README.md`](fonts/README.md) 第五节)。
+
+> 子集字体已按 OFL §3 改名(`Source` / `LXGW` 是上游的 Reserved Font Name,裁剪即构成修改版),并保留了 OFL 声明。
+> 用本模板编译出的文档**不受**这些字体授权约束,版权归作者本人。
+
## 历史沿革
`幻灯片/` 与 `科技报告/` 此前分别维护在两个独立仓库(`ouc-slide-latex-template`、`ouc-report-latex-template`),2026-10 起**并入本仓库统一维护**,两个旧仓库不再更新。迁入时保留了原有目录结构、字体与图片资源,旧仓库的提交历史留在原仓库中。
\ No newline at end of file
diff --git a/fonts.tex b/fonts.tex
new file mode 100644
index 0000000..428e8a2
--- /dev/null
+++ b/fonts.tex
@@ -0,0 +1,274 @@
+%======================================================================
+% oucfonts.tex —— 中国海洋大学模板库的公共字体入口
+%
+% 本文件是仓库内**唯一**允许声明字体的地方。七个模板全部通过
+% \input{../fonts.tex}
+% 取字体,不再各自写 \setCJKmainfont / \setmainfont。
+%
+% 为什么是 .tex + \input 而不是 .sty + \usepackage:
+% \usepackage 走 LaTeX 的 package 机制,要求 \ProvidesPackage 的名字
+% 与 \usepackage 的参数严格一致。我们从子目录用相对路径调用
+% (\usepackage{../oucfonts}),名字必然对不上,会报
+% "You have requested package `../oucfonts' but the package provides
+% `oucfonts'." 的警告。用 \input 直接插入文件内容,没有这个问题,
+% 而且对宏包加载顺序的控制也更直接。
+%
+% ------------------------------------------------------------------
+% 用法
+% ------------------------------------------------------------------
+% \documentclass[UTF8,fontset=none]{ctexart}
+% \input{../fonts.tex}
+%
+% ⚠️ 必须保留 fontset=none:否则 ctex 会先按系统字体配一套,
+% 再被这里覆盖,既浪费又有平台依赖。
+%
+% ⚠️ Path=../fonts/ 是相对**模板目录**的(编译时的工作目录)。
+% 在本模板目录下 xelatex 编译即可,不要从仓库根调用。
+%
+% ------------------------------------------------------------------
+% 提供的字族命令
+% ------------------------------------------------------------------
+% \songti 宋体(衬线正文) OUC Serif ← 思源宋体 SC 子集
+% \heiti 黑体(无衬线标题) OUC Sans ← 思源黑体 SC 子集
+% \kaiti 楷体 OUC Kai ← 霞鹜文楷子集
+% \fangsong 仿宋 Zhuque Fangsong ← 朱雀仿宋
+% \tnr 西文 Times 等价 TeX Gyre Termes
+% \tnrb 西文 Times 粗体 TeX Gyre Termes Bold
+% \hm 鸿蒙 Sans SC 幻灯片/科技报告 原有字体
+% \hmlatin 鸿蒙 Sans(西文) 幻灯片/科技报告 原有字体
+%
+% 正文字体:中文 OUC Serif,西文 TeX Gyre Termes。
+%
+% 本文件**可重复** \input(用 \ifdefined 保护),方便多个 .sty 各自引用。
+%
+% ------------------------------------------------------------------
+% 字体来源与授权(全部允许免费商用与再分发)
+% ------------------------------------------------------------------
+% OUC Serif / OUC Sans 思源宋体/黑体 SC 的 GB2312 子集,
+% Adobe 原版 SIL OFL 1.1。改名以符合 OFL §3
+% (原 Reserved Font Name 为 "Source")。
+% OUC Kai 霞鹜文楷 GB2312 子集,SIL OFL 1.1。
+% Zhuque Fangsong 朱雀仿宋,OFL 1.1。
+% TeX Gyre Termes GUST Font License(GPL + 字体例外)。
+% HarmonyOS Sans 华为,官方声明可免费商用。
+%
+% 详细来源、版本与被裁剪的字符集见 fonts/README.md。
+% **本模板库不含任何商业字体**(无方正、无 SimSun/SimHei/KaiTi/FangSong、
+% 无 Times New Roman)。
+%======================================================================
+\ifdefined\OUCFontsLoaded
+ \endinput
+\else
+ \def\OUCFontsLoaded{1}
+\fi
+
+\RequirePackage{fontspec}
+\RequirePackage{xeCJK}
+
+%======================================================================
+% 一、西文主字体:TeX Gyre Termes(Times 的度量兼容开源替代)
+%
+% Termes 与 Times New Roman 字符宽度逐字相同,因此原有的西文断行、
+% 表格列宽、行内公式对齐都不会因为换字体而漂。
+%======================================================================
+\setmainfont{texgyretermes}[
+ Extension = .otf,
+ Path = ../fonts/tex-gyre-termes/,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-italic,
+ BoldItalicFont = *-bolditalic,
+]
+
+%======================================================================
+% 二、中文主字体
+%
+% 宋体为正文,黑体为强调。二者的粗体都是字体自带的真粗体,
+% 不再用 AutoFakeBold 算法描边 —— 描边出来的粗体笔画会糊在一起,
+% 尤其小字号下(原模板 14pt 的宋体会糊成一团)。
+%
+% ⚠️ 这里用 \setCJKmainfont 而不是 \setCJKfamilyfont + \def:
+% \setCJKmainfont 会顺带把 \CJKrmdefault 指到新族上,正文默认
+% 字体才真的换过来。若文档是 ctex 默认 fontset,ctex 早已设过
+% \CJKrmdefault,xeCJK 会打一条
+% Package xeCJK Warning: Redefining CJKfamily `\CJKrmdefault'
+% 这是**预期**行为(我们就是要覆盖 ctex 按系统字体配的那套),
+% 不影响输出,也无害;看到它不必处理。
+%
+% ------------------------------------------------------------------
+% 斜体与粗斜体:中文没有真正的斜体字形,中文排版惯例是「用楷体代
+% 斜体、用仿宋代粗斜体」(《党政机关公文格式》与 Word 的中文默认
+% 行为都是这么做的)。原科技报告模板正是
+% ItalicFont = 方正楷体
+% BoldItalicFont = 方正仿宋
+% 这里保持同样的语义映射:楷体 → OUC Kai,仿宋 → Zhuque Fangsong。
+%
+% ⚠️ 各档位的字体在**不同目录**里,不能共用主选项的 Path/Extension。
+% 必须在该档位的 *Features 里单独写一套 Path + Extension +
+% UprightFont —— 主 Path 会被继承,若不在 Features 里覆盖,就会
+% 拿 ../fonts/ouc-serif/ 去拼 OUCKai-Regular.ttf,报
+% "The font "OUCKai-Regular" cannot be found"。
+%
+% ⚠️ 只在 \setCJKmainfont 上给了斜体,**不影响** \songti / \heiti /
+% \kaiti / \fangsong 这几个字族命令 —— 它们是独立的字体族,各自
+% 没有斜体档。要中文斜体就用默认正文(或先 \songti 再 \textit,
+% 此时 \textit 落回 \CJKrmdefault 也就是 OUC Serif 的斜体)。
+%======================================================================
+\setCJKmainfont{OUCSerif}[
+ Extension = .otf,
+ Path = ../fonts/ouc-serif/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ ItalicFont = OUCKai-Regular,
+ ItalicFeatures = {
+ Extension = .ttf,
+ Path = ../fonts/ouc-kai/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ },
+ BoldItalicFont = ZhuqueFangsong-Regular,
+ BoldItalicFeatures = {
+ Extension = .ttf,
+ Path = ../fonts/zhuque-fangsong/,
+ UprightFont = *-Regular,
+ },
+]
+
+%======================================================================
+% 三、字族命令
+%
+% ⚠️ 这里**不能**用 \newCJKfontfamily / \newfontfamily。
+% 原因:只要文档用了 ctex 的默认 fontset(即 \documentclass 里没写
+% fontset=none),ctex 就已经定义了 \songti / \heiti / \kaiti /
+% \fangsong,而这两个命令底层是 LaTeX3 的 \NewDocumentCommand,
+% 命令已存在时会抛
+% ! LaTeX3 Error: Control sequence \songti already defined.
+% 并**中断编译**(试卷/ouckey.sty 就是这种情况,报 4 个错误)。
+% 用 \providecommand 先占位也没用 —— \newCJKfontfamily 仍然报。
+%
+% 正确写法分两步:
+% 1. \setCJKfamilyfont{族名}[选项]{字体} 只登记字体,不建命令,
+% 同名重复登记只是覆盖,永远不报错;
+% 2. \def\songti{\CJKfamily{族名}} 纯 \def,从不管旧定义。
+% 这也是 ctex 自己定义 \songti 的方式。
+%======================================================================
+
+% 宋体
+\setCJKfamilyfont{OUCSong}[
+ Extension = .otf,
+ Path = ../fonts/ouc-serif/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]{OUCSerif}
+\def\songti{\CJKfamily{OUCSong}}
+
+% 黑体
+\setCJKfamilyfont{OUCHei}[
+ Extension = .otf,
+ Path = ../fonts/ouc-sans/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]{OUCSans}
+\def\heiti{\CJKfamily{OUCHei}}
+
+% 楷体(霞鹜文楷)
+% 顺带提供 \kaishu 别名:ctex 的默认 fontset 用 \kaishu,而原模板多用
+% \kaiti,两个名字都指同一族,免得改接时漏改一处就静默回落系统字体。
+\setCJKfamilyfont{OUCKai}[
+ Extension = .ttf,
+ Path = ../fonts/ouc-kai/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]{OUCKai}
+\def\kaiti{\CJKfamily{OUCKai}}
+\def\kaishu{\CJKfamily{OUCKai}}
+
+% 仿宋(朱雀仿宋,只有常规一档,无粗体)
+% ⚠️ 需要粗体的场合请改用 \heiti 或 \songti,不要指望 \fangsong 变粗。
+\setCJKfamilyfont{OUCFang}[
+ Extension = .ttf,
+ Path = ../fonts/zhuque-fangsong/,
+ UprightFont = *-Regular,
+]{ZhuqueFangsong}
+\def\fangsong{\CJKfamily{OUCFang}}
+
+% 西文:显式取 Times 形态(原模板里 \tnr / \tnrb / \sunfont 的替代)
+%
+% ⚠️ 四个档位必须全给。只给 UprightFont 的话,在 \bfseries 环境里会落到
+% "Font shape `TU/texgyretermes/b/n' undefined" 并静默替换,
+% 表现为加粗失效(试卷的 \TNRB 与 \qnum 都会踩到)。
+\newfontfamily\tnr{texgyretermes}[
+ Extension = .otf,
+ Path = ../fonts/tex-gyre-termes/,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-italic,
+ BoldItalicFont = *-bolditalic,
+]
+\newfontfamily\tnrb{texgyretermes}[
+ Extension = .otf,
+ Path = ../fonts/tex-gyre-termes/,
+ UprightFont = *-bold,
+ BoldFont = *-bold,
+ ItalicFont = *-bolditalic,
+ BoldItalicFont = *-bolditalic,
+]
+
+% 鸿蒙 Sans:幻灯片与科技报告原有字体,保留以维持这两个模板的原有观感
+% ⚠️ 鸿蒙的文件名以下划线分隔(HarmonyOS_Sans_SC_Regular.ttf),
+% 不是 OHM 风格的 "族名-字重",所以这里不能写 *-Regular 通配,
+% 必须显式给完整文件名。
+% ⚠️ 用了 UprightFont 就**不要**再给主参数 {字体名}。给了两个,fontspec
+% 会把主参数当文件名、UprightFont 当变体名再拼一次,报
+% "The font HarmonyOS_Sans_SC_Regular.ttf cannot be found"。
+% 正确写法是只留主参数(下面这种),或用 Extension + UprightFont。
+\setCJKfamilyfont{OUCHM}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_SC_Bold.ttf,
+]{HarmonyOS_Sans_SC_Regular.ttf}
+\def\hm{\CJKfamily{OUCHM}}
+
+\newfontfamily\hmlatin{HarmonyOS_Sans_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_Bold.ttf,
+ ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf,
+ BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf,
+]
+
+%======================================================================
+% 四、把几个「长得像西文、其实该走中文」的符号归入 CJK 字符类
+%
+% 顺序很重要:必须在 \setCJKmainfont 之后、正文开始之前。
+% 下面这些 \xeCJKDeclareCharClass 是**全局**生效的,一次即可。
+%
+% 为什么要这么做:xeCJK 按 Unicode 区段分类,下面这些字符落在
+% Latin-1 / General Punctuation / Geometric Shapes,默认都被判成
+% **西文**,交给 fontspec 的西文字体(Termes)。后果有两层:
+% ① 宽度错:× 在 SimSun/思源里本来是 1.0 em 全角,被当西文排
+% 就只剩 0.56 em,与汉字不齐、基线也偏(\heiti{××} 尤其明显);
+% ② 缺字:□(U+25A1)Termes 里根本没有,直接报
+% "Missing character: There is no □ (U+25A1)",印出来是空白。
+% 而 \heiti / \fangsong 只切 CJK 字体族,管不到它们 —— 包一层没用。
+%======================================================================
+\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号(占位符 ××× 最常用)
+\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号(em dash)
+\xeCJKDeclareCharClass{CJK}{"25A1} % □ 白方框(勾选框 □ 同意 □ 不同意)
+\xeCJKDeclareCharClass{CJK}{"25A0} % ■ 实心方框
+\xeCJKDeclareCharClass{CJK}{"25CB} % ○ 白圆圈(单选题选项圈)
+\xeCJKDeclareCharClass{CJK}{"25CF} % ● 实心圆
+\xeCJKDeclareCharClass{CJK}{"2610} % ☐ 选票框
+\xeCJKDeclareCharClass{CJK}{"2611} % ☑ 打勾选票框
+\xeCJKDeclareCharClass{CJK}{"2612} % ☒ 打叉选票框
+\xeCJKDeclareCharClass{CJK}{"221A} % √ 根号(勾选/判卷常用)
+\xeCJKDeclareCharClass{CJK}{"203B} % ※ 参考标记
+
+%======================================================================
+% 五、行距
+%
+% 这里不全局改 \linespread,因为各模板需求不同(科技报告依赖 ctex
+% 默认值,试卷归档封面/课程执行大纲/年度考核登记表必须归 1 才能
+% 还原 docx 的精确行高)。只提供工具命令,由各模板自行调用。
+%======================================================================
+\newcommand{\ouclinespread}[1]{\linespread{#1}\relax}
+
+\endinput
\ No newline at end of file
diff --git a/fonts/LICENSE b/fonts/LICENSE
new file mode 100644
index 0000000..59bde55
--- /dev/null
+++ b/fonts/LICENSE
@@ -0,0 +1,97 @@
+本目录(fonts/)下的字体文件版权与授权说明
+==========================================
+
+本目录不含任何商业字体。以下逐项列明来源、授权与授权原文位置。
+本文件不是授权全文的替代 —— 每个字体各自的完整授权文本见其 name 表
+的第 13/14 号记录(License Description / License Info URL),也可在
+下列上游地址取得。
+
+--------------------------------------------------------------------------------
+一、OUCSerif-*.otf / OUCSans-*.otf
+--------------------------------------------------------------------------------
+上游字体:思源宋体 SC(Source Han Serif SC)/ 思源黑体 SC(Source Han Sans SC)
+上游作者:Adobe(与 Google 合作,Noto Serif/Sans CJK 为同源字体)
+上游地址:https://github.com/adobe-fonts/source-han-serif
+ https://github.com/adobe-fonts/source-han-sans
+授权:SIL Open Font License, Version 1.1
+授权原文:https://scripts.sil.org/OFL
+
+本仓库的文件是上述字体的 GB2312 子集(保留 7555 字符),并已按 OFL 1.1
+第 3 条改名(上游 Reserved Font Name 为 "Source")。改名同时更新了
+CFF 层的 fontNames / FamilyName / FullName 与 name 表,并在 name 表
+13/14 号记录中保留了完整 OFL 声明及以下免责说明:
+
+ This is a subset of the upstream font, renamed to comply with
+ SIL OFL 1.1 Section 3 (Reserved Font Name). It is not affiliated
+ with, nor endorsed by, the upstream authors.
+
+--------------------------------------------------------------------------------
+二、OUCKai-*.ttf
+--------------------------------------------------------------------------------
+上游字体:霞鹜文楷(LXGW WenKai)
+上游作者:LXGW
+上游地址:https://github.com/lxgw/LxgwWenKai
+授权:SIL Open Font License, Version 1.1
+授权原文:https://scripts.sil.org/OFL
+
+本仓库的文件是 GB2312 子集(保留 7557 字符),已按 OFL 1.1 第 3 条改名
+(上游 Reserved Font Name 含 "LXGW"),免责说明同上。
+
+--------------------------------------------------------------------------------
+三、ZhuqueFangsong-Regular.ttf
+--------------------------------------------------------------------------------
+上游字体:朱雀仿宋(TrionesType Zhuque Fangsong)
+上游地址:https://github.com/TrionesType/zhuque
+授权:SIL Open Font License, Version 1.1
+授权原文:https://scripts.sil.org/OFL
+
+本仓库的文件为原版直接分发,未做字符集裁剪,未改名。
+版本:Version 0.212 (technical preview)。注意为预览版,字形可能随上游更新。
+
+--------------------------------------------------------------------------------
+四、texgyretermes-*.otf
+--------------------------------------------------------------------------------
+上游字体:TeX Gyre Termes
+上游项目:GUST(Polish TeX Users Group)e-foundry
+上游地址:http://www.gust.org.pl/projects/e-foundry/tex-gyre
+授权:GUST Font License (GFL)
+ 即 GNU General Public License 附加"字体嵌入例外"——
+ 把本字体嵌入文档(含 PDF)并分发该文档,不构成对 GPL 的违反。
+授权原文:随 TeX Live 分发于
+ texmf-dist/doc/fonts/tex-gyre/GUST-FONT-LICENSE.txt
+
+本仓库为原版直接分发,未修改。
+
+--------------------------------------------------------------------------------
+五、HarmonyOS_Sans_*.ttf / HarmonyOS_Sans_SC_*.ttf
+--------------------------------------------------------------------------------
+上游字体:HarmonyOS Sans / HarmonyOS Sans SC
+上游作者:华为(Huawei)
+上游地址:https://developer.harmonyos.com/cn/docs/design/font-0000001157868583
+授权:华为官方在 HarmonyOS 设计文档中声明,HarmonyOS Sans 字体
+ **可免费用于商业用途**,可自由下载、使用、复制、合并、发布。
+ 该授权不是 SIL OFL,属于华为自有许可。
+
+本仓库为原版直接分发,未修改。仅保留实际用到的 6 个字重
+(Regular / Bold / 各自的 Italic / SC Regular / SC Bold)。
+
+--------------------------------------------------------------------------------
+六、关于"用这些字体排出来的文档"
+--------------------------------------------------------------------------------
+按 SIL OFL 1.1 第 5 条,以 OFL 字体排版、嵌入或衍生的**文档本身**
+不受 OFL 约束,不因此被"感染"为 OFL 作品。因此用本模板库编译出的
+论文、报告、试卷、幻灯片,其著作权完全属于作者本人,可自由发表、
+商用、闭源分发。
+
+--------------------------------------------------------------------------------
+七、合规自查结论
+--------------------------------------------------------------------------------
+[x] 无方正(FZ*)、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、
+ 无 Microsoft YaHei —— 这些均不允许随仓库再分发。
+[x] 思源系列与霞鹜文楷的子集已改名,符合 OFL 1.1 §3。
+[x] 所有 OFL 字体均保留授权全文(name 表 13/14 号),符合 OFL 1.1 §1。
+[x] 未使用上游作者名义作任何背书暗示。
+[x] TeX Gyre Termes 的 GFL 允许随文档分发。
+[x] HarmonyOS Sans 为华为官方允许免费商用。
+
+如对本目录内任何字体的授权有疑问,请以上游地址的授权原文为准。
\ No newline at end of file
diff --git a/fonts/README.md b/fonts/README.md
new file mode 100644
index 0000000..29c9b8b
--- /dev/null
+++ b/fonts/README.md
@@ -0,0 +1,264 @@
+# fonts/ —— 模板库公共字体目录
+
+本目录是**中国海洋大学 LaTeX 模板库唯一的一份字体来源**。仓库里七个模板全部通过
+根目录的 [`../fonts.tex`](../fonts.tex) 取字体,不再有任何模板自带字体、也不依赖
+操作系统里装了什么字体。换一台机器、换一个操作系统(Windows / macOS / Linux /
+Overleaf),编译出来的样子都一样。
+
+```
+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
+└── harmonyos-sans/ HarmonyOS Sans 鸿蒙(中英各一档) 6 个,16 MB
+```
+
+合计约 **49 MB**(改造前是 141 MB:幻灯片 49 MB + 科技报告 92 MB 各自带一份,
+外加两套重复的字体。现在全库只有这一份,省掉 65%)。
+
+---
+
+## 一、为什么要把字体打进仓库
+
+原先七个模板是两种做法:
+
+| 做法 | 模板 | 问题 |
+|---|---|---|
+| 各自带一份字体 | `幻灯片/`(鸿蒙 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 量级。
+
+### 4. HarmonyOS Sans —— 鸿蒙字体
+
+| | |
+|---|---|
+| 上游 | HarmonyOS Sans(华为) |
+| 授权 | 华为官方声明允许**免费商用**(随 HarmonyOS 开发者文档发布) |
+| 保留原因 | `幻灯片/` 与 `科技报告/` 原有观感就是鸿蒙,换成思源会明显改变这两个模板的视觉 |
+
+只保留实际用到的 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` 通配,
+> 必须显式给完整文件名。
+
+---
+
+## 三、字体是怎么被调用的
+
+所有模板都只做一件事:在导言区 `\input{../fonts.tex}`(幻灯片与科技报告因为
+目录层级不同,路径略作调整)。`fonts.tex` 负责:
+
+1. 加载 fontspec / xeCJK;
+2. 注册默认族与 `\songti` / `\heiti` / `\kaiti` / `\fangsong` / `\kaishu` /
+ `\tnr` / `\tnrb` / `\hm` / `\hmlatin`;
+3. 把 `×` `—` `□` `○` `√` 等「长得像西文、其实该走中文」的符号
+ 归入 CJK 字符类(详见该文件的注释);
+4. 提供 `\ouclinespread` 行距工具。
+
+各模板自己**不再写任何** `\setCJKmainfont` / `\setmainfont`。
+
+### ⚠️ 三个容易踩的坑(都写在 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
+ harmonyos-sans 16.4 MB
+ 合计 49 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 |
+| `幻灯片/` | 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 |
+| `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
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Bold.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_Bold.ttf
similarity index 100%
rename from 幻灯片/fonts/HarmonyOS_Sans_Bold.ttf
rename to fonts/harmonyos-sans/HarmonyOS_Sans_Bold.ttf
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Bold_Italic.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_Bold_Italic.ttf
similarity index 100%
rename from 幻灯片/fonts/HarmonyOS_Sans_Bold_Italic.ttf
rename to fonts/harmonyos-sans/HarmonyOS_Sans_Bold_Italic.ttf
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Regular.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_Regular.ttf
similarity index 100%
rename from 幻灯片/fonts/HarmonyOS_Sans_Regular.ttf
rename to fonts/harmonyos-sans/HarmonyOS_Sans_Regular.ttf
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Regular_Italic.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_Regular_Italic.ttf
similarity index 100%
rename from 幻灯片/fonts/HarmonyOS_Sans_Regular_Italic.ttf
rename to fonts/harmonyos-sans/HarmonyOS_Sans_Regular_Italic.ttf
diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Bold.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_SC_Bold.ttf
similarity index 100%
rename from 幻灯片/fonts/HarmonyOS_Sans_SC_Bold.ttf
rename to fonts/harmonyos-sans/HarmonyOS_Sans_SC_Bold.ttf
diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Regular.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_SC_Regular.ttf
similarity index 100%
rename from 幻灯片/fonts/HarmonyOS_Sans_SC_Regular.ttf
rename to fonts/harmonyos-sans/HarmonyOS_Sans_SC_Regular.ttf
diff --git a/fonts/ouc-kai/OUCKai-Bold.ttf b/fonts/ouc-kai/OUCKai-Bold.ttf
new file mode 100644
index 0000000..7143f93
Binary files /dev/null and b/fonts/ouc-kai/OUCKai-Bold.ttf differ
diff --git a/fonts/ouc-kai/OUCKai-Regular.ttf b/fonts/ouc-kai/OUCKai-Regular.ttf
new file mode 100644
index 0000000..21aa785
Binary files /dev/null and b/fonts/ouc-kai/OUCKai-Regular.ttf differ
diff --git a/fonts/ouc-sans/OUCSans-Bold.otf b/fonts/ouc-sans/OUCSans-Bold.otf
new file mode 100644
index 0000000..e05185c
Binary files /dev/null and b/fonts/ouc-sans/OUCSans-Bold.otf differ
diff --git a/fonts/ouc-sans/OUCSans-Regular.otf b/fonts/ouc-sans/OUCSans-Regular.otf
new file mode 100644
index 0000000..fe96c8f
Binary files /dev/null and b/fonts/ouc-sans/OUCSans-Regular.otf differ
diff --git a/fonts/ouc-serif/OUCSerif-Bold.otf b/fonts/ouc-serif/OUCSerif-Bold.otf
new file mode 100644
index 0000000..279bd2c
Binary files /dev/null and b/fonts/ouc-serif/OUCSerif-Bold.otf differ
diff --git a/fonts/ouc-serif/OUCSerif-Regular.otf b/fonts/ouc-serif/OUCSerif-Regular.otf
new file mode 100644
index 0000000..5d85f8a
Binary files /dev/null and b/fonts/ouc-serif/OUCSerif-Regular.otf differ
diff --git a/fonts/tex-gyre-termes/texgyretermes-bold.otf b/fonts/tex-gyre-termes/texgyretermes-bold.otf
new file mode 100644
index 0000000..c181d55
Binary files /dev/null and b/fonts/tex-gyre-termes/texgyretermes-bold.otf differ
diff --git a/fonts/tex-gyre-termes/texgyretermes-bolditalic.otf b/fonts/tex-gyre-termes/texgyretermes-bolditalic.otf
new file mode 100644
index 0000000..028b170
Binary files /dev/null and b/fonts/tex-gyre-termes/texgyretermes-bolditalic.otf differ
diff --git a/fonts/tex-gyre-termes/texgyretermes-italic.otf b/fonts/tex-gyre-termes/texgyretermes-italic.otf
new file mode 100644
index 0000000..935f9db
Binary files /dev/null and b/fonts/tex-gyre-termes/texgyretermes-italic.otf differ
diff --git a/fonts/tex-gyre-termes/texgyretermes-regular.otf b/fonts/tex-gyre-termes/texgyretermes-regular.otf
new file mode 100644
index 0000000..20f26fb
Binary files /dev/null and b/fonts/tex-gyre-termes/texgyretermes-regular.otf differ
diff --git a/科技报告/font/fangzhengshusong_GBK.TTF b/fonts/zhuque-fangsong/ZhuqueFangsong-Regular.ttf
similarity index 53%
rename from 科技报告/font/fangzhengshusong_GBK.TTF
rename to fonts/zhuque-fangsong/ZhuqueFangsong-Regular.ttf
index 5812315..cf36fd1 100644
Binary files a/科技报告/font/fangzhengshusong_GBK.TTF and b/fonts/zhuque-fangsong/ZhuqueFangsong-Regular.ttf differ
diff --git a/劳务发放说明表/README.md b/劳务发放说明表/README.md
index 8b84789..038a1b3 100644
--- a/劳务发放说明表/README.md
+++ b/劳务发放说明表/README.md
@@ -149,7 +149,7 @@ tabularray 给每个单元格垫了 strut,`[t]` 生成的盒子顶部与 strut
| :-- | :-- | :-- | :-- |
| 表宽 | 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 | 同上,竖线计入行高 |
-| 字体 | 宋体 | SimSun | 同一字体。缺字体时用 `fc-list` 找替代 |
+| 字体 | 宋体 | OUC Serif(思源宋体子集) | 原用系统 SimSun。现改为仓库公共字体包 `../fonts/`,换机器/换系统都能编,且允许分发 |
| 标题 | 宋体 14 pt **加粗** | 同 | 字号与正文相同,只靠加粗区分 |
## 校验方法
diff --git a/劳务发放说明表/ouclw.sty b/劳务发放说明表/ouclw.sty
index 410bde0..0628ff3 100644
--- a/劳务发放说明表/ouclw.sty
+++ b/劳务发放说明表/ouclw.sty
@@ -84,12 +84,12 @@
% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread
% 归 1。这一步不能省,也必须在 \AtBeginDocument 之后再设一次
% (ctex 在 begin document 时会重设)。
+%
+% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的
+% SimSun / SimHei / FangSong + AutoFakeBold,换台机器(尤其 Linux/macOS)
+% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。
%======================================================================
-\setmainfont{Times New Roman}
-\setCJKmainfont{SimSun}[AutoFakeBold=2.5]
-\newCJKfontfamily\songti{SimSun}[AutoFakeBold=2.5]
-\newCJKfontfamily\heiti{SimHei}
-\newCJKfontfamily\fangsong{FangSong}[AutoFakeBold=2.5]
+\input{../fonts.tex}
\newcommand{\lwbodyfont}{%
\linespread{1}\relax
diff --git a/劳务发放说明表/劳务发放说明表.pdf b/劳务发放说明表/劳务发放说明表.pdf
index 28a4df4..20c4a45 100644
Binary files a/劳务发放说明表/劳务发放说明表.pdf and b/劳务发放说明表/劳务发放说明表.pdf differ
diff --git a/年度考核登记表/README.md b/年度考核登记表/README.md
index 493044b..745d0e6 100644
--- a/年度考核登记表/README.md
+++ b/年度考核登记表/README.md
@@ -18,9 +18,12 @@ xelatex 年度考核登记表.tex
xelatex 年度考核登记表.tex # 跑两遍,第二遍取到正确页码
```
-需要 **XeLaTeX**(用 fontspec + xeCJK 调系统字体),并安装:
+需要 **XeLaTeX**(用 fontspec + xeCJK),并安装:
`ctex`、`geometry`、`fontspec`、`xeCJK`、`tabularray`。
+字体不需要安装 —— 全部来自仓库公共字体包 `../fonts/`(由 `../fonts.tex` 加载),
+详见 [`../fonts/README.md`](../fonts/README.md)。**不再依赖系统里的宋体/黑体/仿宋**。
+
实测环境:TeX Live 2022 + `tabularray 2022A`。用 LuaLaTeX 理论上也行,但未验证。
产出 2 页、A4、正反面打印正好。
@@ -43,9 +46,14 @@ xelatex 年度考核登记表.tex # 跑两遍,第二遍取到正确页码
\newcommand{\khpost}{{\fangsong ×××}} % 所聘岗位
```
-> **`{\fangsong ...}` 不能去掉。** 占位符 `×` 是 U+00D7,fontspec 会把它当
-> ASCII 交给 Times New Roman,而那儿的 `×` 是 **1em 宽的数学乘号**
-> (14pt 下一个占 14pt),几个就能撑破整列。包上 `\fangsong` 才会按全角汉字宽度排。
+> **`{\fangsong ...}` 不能去掉。** 占位符 `×` 是 U+00D7,xeCJK 默认按 Unicode
+> 区段把它判成**西文**,交给 fontspec 的西文字体(Termes/Times),而那儿的
+> `×` 宽度与汉字不一致,几个就能撑破整列。
+>
+> **更好的做法**:`../fonts.tex` 里已经全局加了
+> `\xeCJKDeclareCharClass{CJK}{"00D7}`,把 `×` 归入 CJK 字符类 ——
+> 于是它自动按汉字全角宽度排,**不必再包 `\fangsong` 也不会撑破**。
+> 这是本次字体改造顺带修掉的老 bug(原注释的修法从未真正生效过)。
### 年度总结
@@ -122,7 +130,7 @@ Word 是靠 `tblPr/jc=center` 把这张表“压”进页边距里的。
| 「师德考核结果」首列 | `师师德考核结果` | `师德考核结果` | docx 原文首字重复(WPS 竖排遗留),已按正常写法更正 |
| 「单位年度考核建议档次」首列 | `单单位年度考核建议档次` | `单位年度考核建议档次` | 同上 |
| 单元格内边距 | 左右各 108 twips(1.905 mm) | 0 | c10 只有 1.41 mm,比两倍内边距还窄,统一内边距会算出负宽。代价是文字可贴竖线,但全部单元格本就水平居中,观感一致 |
-| 未勾选框 | Wingdings `¨`(char 0x00A8) | U+25A1 `□` | Wingdings 在 Linux/macOS 上不可靠。仿宋、黑体都有 `□`,**宋体没有** —— 改正文为宋体时需另指方框字体 |
+| 未勾选框 | Wingdings `¨`(char 0x00A8) | U+25A1 `□` | Wingdings 在 Linux/macOS 上不可靠。仓库里的仿宋、黑体、宋体都含 `□`;且 `../fonts.tex` 已把 U+25A1 归入 CJK 类,不会再落到不含该字的西文字体上 |
| 电子签名图片 | 内嵌两张手写签名 JPEG | 无 | 模板不含真人信息 |
## 校验方法(想改版式时照这个验)
diff --git a/年度考核登记表/ouckhtb.sty b/年度考核登记表/ouckhtb.sty
index 2b535b7..d8e642c 100644
--- a/年度考核登记表/ouckhtb.sty
+++ b/年度考核登记表/ouckhtb.sty
@@ -61,12 +61,12 @@
% “2025 年度”一行 仿宋 16pt (w:sz=32)
% R1C6 的括注 仿宋 12pt (w:sz=24),只有“研究所、实验室、科室”
% 页脚页码 9pt (footer 样式 w:sz=18)
+%
+% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的
+% FangSong / SimHei / SimSun + AutoFakeBold,换台机器(尤其 Linux/macOS)
+% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。
%======================================================================
-\setmainfont{Times New Roman}
-\setCJKmainfont{FangSong}[AutoFakeBold=2.5]
-\newCJKfontfamily\fangsong{FangSong}[AutoFakeBold=2.5]
-\newCJKfontfamily\heiti{SimHei}
-\newCJKfontfamily\songti{SimSun}
+\input{../fonts.tex}
% 正文字号;行距 15.6pt 对应 docx docGrid/linePitch=312 twips
\newcommand{\khtbbodyfont}{\fontsize{14}{15.6}\selectfont}
diff --git a/年度考核登记表/年度考核登记表.pdf b/年度考核登记表/年度考核登记表.pdf
index 038d0b9..c559abf 100644
Binary files a/年度考核登记表/年度考核登记表.pdf and b/年度考核登记表/年度考核登记表.pdf differ
diff --git a/幻灯片/README.md b/幻灯片/README.md
index 44d69da..33636dc 100644
--- a/幻灯片/README.md
+++ b/幻灯片/README.md
@@ -16,7 +16,7 @@
1. slides.tex:主文件,编写的演示文稿内容主要存放在该文件当中。
2. oucslide.sty:模板的样式文件。
-3. fonts:字体文件夹,所有编译需要用到的字体。默认字体使用的是华为鸿蒙字体。
+3. (字体不在本目录) 全部字体已统一到仓库根 `../fonts/`,由 `../fonts.tex` 统一加载。默认字体仍是华为鸿蒙字体。
4. theme:主题文件夹。
1. beamercolorthemeOUCSlide.sty:颜色定义文件。
2. beamerfontthemeOUCSlide.sty:字体定义文件。
@@ -33,7 +33,7 @@
git clone https://code.yangyq.net/laoyang/ouc_latex_template.git
cd ouc_latex_template/幻灯片
```
- 子目录内自包含(`theme/`、`fonts/`、`logos/`、`figs/` 都在本目录),不需要额外的宏包搜索路径。
+ 子目录内自包含(`theme/`、`logos/`、`figs/` 都在本目录),只有字体是共享的上层目录 `../fonts/`,不需要额外的宏包搜索路径。
2. 安装Tex编译器,推荐使用TexLive,安装成功后,可以使用自带的TeXworks打开目录下的tex文件进行编译。
3. 可以安装其他的IDE工具进行Tex文件的编写和修改,推荐使用Visual Studio Code。
4. 编译时,请选择XeLaTex,有时候,可能需要连续编译两次,以得到正确的页码和图表编号。
@@ -199,7 +199,9 @@ Tex文件的开头,是基本信息部分,可以根据需要添加`\title`{
## 字体
模板使用的默认字体是华为鸿蒙字体 (HarmonyOS Sans)。该字体可以免费商用。
-如果对字体不满意,可下载其他字体,放入fonts文件夹,并在`beamerfontthemeOUCSlide.sty`文件中修改。
+如果对字体不满意,可把字体放进仓库根的 `fonts/` 目录,并在 `theme/beamerfontthemeOUCSlide.sty` 中修改。**注意**:`Path=` 是相对编译时工作目录(= `幻灯片/`)的,所以写 `../fonts/xxx/`,不是 `fonts/`。
+
+只保留实际用到的 6 个鸿蒙文件(Regular/Bold 及其 Italic,加 SC Regular/Bold)——原先 `幻灯片/fonts/` 里的 Black / Light / Medium / Thin 等 12 个字重全库无人引用,已随目录一并删除,省下 49 MB。
推荐的字体包括:思源黑体、阿里普惠字体、OPPO字体、小米字体。这些字体基本上都可以免费商用,并且效果都很不错。关于他们是否能够继续免费商用的政策,请查阅其官方网站以得到最准确的信息。
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Black.ttf b/幻灯片/fonts/HarmonyOS_Sans_Black.ttf
deleted file mode 100644
index 855943b..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_Black.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Black_Italic.ttf b/幻灯片/fonts/HarmonyOS_Sans_Black_Italic.ttf
deleted file mode 100644
index 2bf4653..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_Black_Italic.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Light.ttf b/幻灯片/fonts/HarmonyOS_Sans_Light.ttf
deleted file mode 100644
index 9b67785..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_Light.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Light_Italic.ttf b/幻灯片/fonts/HarmonyOS_Sans_Light_Italic.ttf
deleted file mode 100644
index 0fe624a..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_Light_Italic.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Medium.ttf b/幻灯片/fonts/HarmonyOS_Sans_Medium.ttf
deleted file mode 100644
index 9bcfaa1..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_Medium.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Medium_Italic.ttf b/幻灯片/fonts/HarmonyOS_Sans_Medium_Italic.ttf
deleted file mode 100644
index 6a8e1e7..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_Medium_Italic.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Black.ttf b/幻灯片/fonts/HarmonyOS_Sans_SC_Black.ttf
deleted file mode 100644
index 824b3d4..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_SC_Black.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Light.ttf b/幻灯片/fonts/HarmonyOS_Sans_SC_Light.ttf
deleted file mode 100644
index 8cfbc9d..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_SC_Light.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Medium.ttf b/幻灯片/fonts/HarmonyOS_Sans_SC_Medium.ttf
deleted file mode 100644
index 350f6a0..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_SC_Medium.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Thin.ttf b/幻灯片/fonts/HarmonyOS_Sans_SC_Thin.ttf
deleted file mode 100644
index 6a58b15..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_SC_Thin.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Thin.ttf b/幻灯片/fonts/HarmonyOS_Sans_Thin.ttf
deleted file mode 100644
index 9b95ebd..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_Thin.ttf and /dev/null differ
diff --git a/幻灯片/fonts/HarmonyOS_Sans_Thin_Italic.ttf b/幻灯片/fonts/HarmonyOS_Sans_Thin_Italic.ttf
deleted file mode 100644
index a5c4e3e..0000000
Binary files a/幻灯片/fonts/HarmonyOS_Sans_Thin_Italic.ttf and /dev/null differ
diff --git a/幻灯片/slides.pdf b/幻灯片/slides.pdf
index 1fdfe65..606699e 100644
Binary files a/幻灯片/slides.pdf and b/幻灯片/slides.pdf differ
diff --git a/幻灯片/theme/beamerfontthemeOUCSlide.sty b/幻灯片/theme/beamerfontthemeOUCSlide.sty
index c5e4214..f55c0de 100644
--- a/幻灯片/theme/beamerfontthemeOUCSlide.sty
+++ b/幻灯片/theme/beamerfontthemeOUCSlide.sty
@@ -10,39 +10,57 @@
%字体
-%设置英文字体 鸿蒙字体
-\setmainfont[
- Path=fonts/,
- BoldFont=HarmonyOS_Sans_Bold.ttf,
- ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf,
- BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf,
-]{HarmonyOS_Sans_Regular.ttf}
-\setsansfont[
- Path=fonts/,
- BoldFont=HarmonyOS_Sans_Bold.ttf,
- ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf,
- BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf,
-]{HarmonyOS_Sans_Regular.ttf}
-\setmonofont[
- Path=fonts/
-]{HarmonyOS_Sans_Regular.ttf}
+%======================================================================
+% 字体全部取自仓库公共字体包 ../../fonts.tex(文件在 ../../fonts/ 下)。
+%
+% 旧版这里是 Path=fonts/ 直接读本目录下的 幻灯片/fonts/ —— 那 18 个
+% 鸿蒙字体文件共 49MB,与其它模板重复,且一旦别处升级就会版本不一致。
+% 现在统一到仓库根的 fonts/,全库只有一份。
+%
+% ⚠️ 路径用 ../fonts/ 而不是 ../../fonts/:
+% 本文件虽然在 幻灯片/theme/ 下,但被 \usetheme 载入时,
+% XeTeX 解析 Path= 的相对基准是**编译时的工作目录**(= 幻灯片/),
+% 不是本文件所在目录。用 ../../ 会跑到仓库外面去找。
+% 同理 \input{../fonts.tex} 也是相对工作目录的。
+%======================================================================
+\input{../fonts.tex}
+
+% 幻灯片的主字体是鸿蒙:西文用 HarmonyOS Sans,中文用 HarmonyOS Sans SC。
+% 公共包已把它们登记为 \hmlatin(西文)与 \hm(CJK),这里把三个
+% fontspec 的"默认族"都指过去 —— beamer 的 \sffamily / \ttfamily
+% 都要落到鸿蒙上,否则正文会出现一半鸿蒙、一半 Termes 的混排。
+\setmainfont{HarmonyOS_Sans_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_Bold.ttf,
+ ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf,
+ BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf,
+]
+\setsansfont{HarmonyOS_Sans_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_Bold.ttf,
+ ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf,
+ BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf,
+]
+\setmonofont{HarmonyOS_Sans_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+]
%设置中文字体 鸿蒙字体
-\setCJKmainfont[
- Path=fonts/,
- BoldFont=HarmonyOS_Sans_SC_Bold.ttf,
- ItalicFont=HarmonyOS_Sans_SC_Regular.ttf,
- BoldItalicFont=HarmonyOS_Sans_SC_Bold.ttf
-]{HarmonyOS_Sans_SC_Regular.ttf}
-\setCJKsansfont[
- Path=fonts/,
- BoldFont=HarmonyOS_Sans_SC_Bold.ttf,
- ItalicFont=HarmonyOS_Sans_SC_Regular.ttf,
- BoldItalicFont=HarmonyOS_Sans_SC_Bold.ttf
-]{HarmonyOS_Sans_SC_Regular.ttf}
-\setCJKmonofont[
- Path=fonts/
-]{HarmonyOS_Sans_SC_Regular.ttf}
+\setCJKmainfont{HarmonyOS_Sans_SC_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_SC_Bold.ttf,
+ ItalicFont = HarmonyOS_Sans_SC_Regular.ttf,
+ BoldItalicFont = HarmonyOS_Sans_SC_Bold.ttf,
+]
+\setCJKsansfont{HarmonyOS_Sans_SC_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_SC_Bold.ttf,
+ ItalicFont = HarmonyOS_Sans_SC_Regular.ttf,
+ BoldItalicFont = HarmonyOS_Sans_SC_Bold.ttf,
+]
+\setCJKmonofont{HarmonyOS_Sans_SC_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+]
%以下为原模板代码,未做改动
diff --git a/科技报告/README.md b/科技报告/README.md
index ed23576..261d0d8 100644
--- a/科技报告/README.md
+++ b/科技报告/README.md
@@ -6,7 +6,7 @@
## 特性
-- **中英文字体一体化**:英文默认使用鸿蒙字体(HarmonyOS Sans),中文使用方正书宋 / 小标宋 / 楷体 / 仿宋 / 中等线,字体文件随模板附于 `font/` 目录,编译时自动调用,**无须安装任何字体**;
+- **中英文字体一体化**:英文默认使用鸿蒙字体(HarmonyOS Sans),中文使用仓库公共字体包(宋体 / 宋体粗 / 楷体 / 仿宋 / 黑体),字体文件在仓库根 `../fonts/` 目录,编译时自动调用,**无须安装任何字体**;
- **模块化文档类**:`report.cls` 按功能拆分为 `cls/` 下的多个模块(全局设定、字体、页面布局、标题、页眉页脚、信息框、代码块等),便于按需修改;
- **三种信息框**:`titledbox`(带标题)、`notebox`(提示)、`importantbox`(重要),基于 tcolorbox 实现;
- **代码排版**:基于 listings 预设了多种样式,支持行内命令 `shellbox` / `invertedshellbox` 展示 shell 命令及输出;
@@ -35,7 +35,7 @@
xelatex report.tex
```
-5. 临时切换字体可使用命令:`\fzss`(方正书宋)、`\fzxbs`(方正小标宋)、`\fzkai`(方正楷体)、`\fzfs`(方正仿宋)、`\fzzdx`(方正中等线)、`\hm`(鸿蒙字体)。
+5. 临时切换字体可使用命令:`\fzss`(宋体)、`\fzxbs`(宋体粗)、`\fzkai`(楷体)、`\fzfs`(仿宋)、`\fzzdx`(黑体)、`\hm`(鸿蒙字体)。命令名沿用旧版(fz 取自原方正系列),实际用的是随仓库分发的开源字体,对应关系见 `cls/font.cls` 的注释。
## 署名与联系方式(二次分发前请修改)
@@ -72,7 +72,7 @@
├── cls/ # 功能模块:全局设定、字体、页面、标题、信息框、代码块等
├── input/ # 文档内容:封面、目录、摘要、信息与整体设置
├── figs/ # 图片资源
-├── font/ # 鸿蒙及方正字体文件(自动加载)
+├── (字体在仓库根 fonts/) # 不再自备字体,详见 ../fonts/README.md
├── fontawesome.pdf # fontawesome 图标使用手册
└── report.tex # 主文件(XeLaTeX 编译入口)
```
diff --git a/科技报告/cls/boxes.cls b/科技报告/cls/boxes.cls
index 9dc73dd..15b09a5 100644
--- a/科技报告/cls/boxes.cls
+++ b/科技报告/cls/boxes.cls
@@ -86,9 +86,12 @@
\end{tcolorbox}
}
-%% 命令行(深底白字)——中性反白,不参与配色体系
-% 说明:反白块的用途是"终端里的黑底",语义上就该是黑的;
-% 换成海大蓝会变成强调块,反而抢正文的注意力,所以保留黑。
+%% 命令行(深底白字)——海大蓝底 + 白字
+% 说明:这个框的用途是"一整条终端命令",需要与正文明确区分。
+% 用海大蓝实底 + 白字:
+% · 白字压在 #004098 上对比度约 10:1,远高于 WCAG AA 要求的 4.5:1
+% · 与 notebox(5% 浅蓝底 + 蓝字)区分得开:一个是实底,一个是浅底
+% 底色不要改浅:一旦降到 oucblue!60 以下,白字对比度会掉到 4 以下,读起来吃力。
\newenvironment{invertedshellbox}
{%
\VerbatimEnvironment
@@ -98,8 +101,8 @@
boxrule=.5pt,
left=5pt, right=5pt, top=0pt, bottom=0pt,
boxsep=5pt,
- colframe=black!70!white,
- colback=black!70!white,
+ colframe=oucblue,
+ colback=oucblue,
coltext=white,
title={},
fontupper=\linespread{1.2}
diff --git a/科技报告/cls/font.cls b/科技报告/cls/font.cls
index 44d311a..8bc1bd1 100644
--- a/科技报告/cls/font.cls
+++ b/科技报告/cls/font.cls
@@ -1,96 +1,136 @@
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% fonts settings
%% 字体设定
+%%
+%% 【2026-11 改造记录:全部改为开源可商用字体】
+%%
+%% 旧版本这里用的是 5 个**方正商业字体** + 鸿蒙,字体文件都放在
+%% 科技报告/font/ 下(共 92MB):
+%% fangzhengshusong_GBK.TTF 方正书宋 SJK 正文
+%% fangzhengxiaobiaosong_GBK.TTF 方正小标宋 粗体/标题
+%% fangzhengkaiti_GBK.TTF 方正楷体 引文、页眉、题注
+%% fangzhengfangsong_GBK.TTF 方正仿宋 斜体位
+%% fangzhengzhongdengxian_GBK.TTF 方正中等线 等宽位
+%%
+%% 问题:方正这 5 款都**不允许随仓库分发**(个人非商用免费,商用须授权),
+%% 把它们打进公开模板库属于越界使用;而且 92MB 的字体让 clone 变得很重。
+%%
+%% 现在全部映射到仓库公共字体包 ../fonts.tex(文件在 ../fonts/ 下):
+%% 方正书宋 → OUC Serif(思源宋体 SC 子集,OFL 1.1)
+%% 方正小标宋 → OUC Serif Bold(真粗体,思源宋体自带)
+%% 方正楷体 → OUC Kai(霞鹜文楷子集,OFL 1.1)
+%% 方正仿宋 → Zhuque Fangsong(朱雀仿宋,OFL 1.1)
+%% 方正中等线 → OUC Sans(思源黑体 SC 子集,OFL 1.1)
+%% 鸿蒙 → 保留 HarmonyOS Sans(华为官方允许免费商用)
+%%
+%% 上层的 \fzss / \fzxbs / \fzkai / \fzfs / \fzzdx / \hm 六个命令名
+%% **保持不变**,所以 boxes.cls / code.cls / headandfoot.cls / cover.tex
+%% 里的调用一行都不用改。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% \usepackage{ebgaramond}
-
%% 开明式:句末点号用占一个汉字宽度,标号和句内点号占半个汉字宽度
%\punctstyle{kaiming}
-%\setmainfont{Minion Pro}
-% \setmainfont{Myriad Pro}
-% \setsansfont{Myriad Pro}
-% \setmonofont{Courier Std}
+%======================================================================
+% 一、先载入仓库公共字体包
+% 它负责:fontspec/xeCJK 的加载、\songti/\heiti/\kaiti/\fangsong/\tnr
+% /\tnrb/\hm 的登记、以及 ×/□ 这类字符的 CJK 归类。
+% 本文件只在其基础上覆盖"默认族",并补 5 个方正语义别名。
+%======================================================================
+\input{../fonts.tex}
-%设置英文字体 鸿蒙字体
-% \setmainfont[
-% Path=font/,
-% BoldFont=Arvo-Bold.ttf,
-% ItalicFont=Arvo-Italic.ttf,
-% BoldItalicFont=Arvo-BoldItalic.ttf,
-% ]{Arvo-Regular.ttf}
-\setmainfont[
- Path=font/,
- BoldFont=HarmonyOS_Sans_Bold.ttf,
- ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf,
- BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf,
-]{HarmonyOS_Sans_Regular.ttf}
-\setsansfont[
- Path=font/,
- BoldFont=HarmonyOS_Sans_Bold.ttf,
- ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf,
- BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf,
-]{HarmonyOS_Sans_Regular.ttf}
-\setmonofont[
- Path=font/
-]{HarmonyOS_Sans_Regular.ttf}
+%======================================================================
+% 二、默认字体族
+%
+% 西文:鸿蒙 HarmonyOS Sans(与原模板一致,观感不变)
+% 中文:OUC Serif 书宋(对应原方正书宋),粗体用 OUC Serif Bold
+% (对应原方正小标宋 —— 小标宋本身就是宋体的标题变体)
+%
+% ⚠️ Path= 是相对**编译时工作目录**(= 科技报告/)的,不是相对 cls/。
+% 故写作 ../fonts/...,不要写 ../../。
+%======================================================================
+\setmainfont{HarmonyOS_Sans_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_Bold.ttf,
+ ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf,
+ BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf,
+]
+\setsansfont{HarmonyOS_Sans_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_Bold.ttf,
+ ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf,
+ BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf,
+]
+\setmonofont{HarmonyOS_Sans_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+]
-\setCJKmainfont[
- Path=font/,
- BoldFont=fangzhengxiaobiaosong_GBK.TTF,
- ItalicFont=fangzhengkaiti_GBK.TTF,
- BoldItalicFont=fangzhengfangsong_GBK.TTF,
- ]{fangzhengshusong_GBK.TTF}
-\setCJKsansfont[
- Path=font/,
- BoldFont=HarmonyOS_Sans_SC_Bold.ttf,
- ItalicFont=HarmonyOS_Sans_SC_Light.ttf,
- BoldItalicFont=HarmonyOS_Sans_SC_Black.ttf,
-]{HarmonyOS_Sans_SC_Regular.ttf}
-\setCJKmonofont[
- Path=font/
-]{fangzhengzhongdengxian_GBK.TTF}
+% \hm 已在 fonts.tex 里登记(CJK 族名 OUCHM),这里不重复定义。
+% 只把 CJK 的 sans / mono 两族指到鸿蒙上,与旧版行为一致。
+\setCJKsansfont{HarmonyOS_Sans_SC_Regular.ttf}[
+ Path = ../fonts/harmonyos-sans/,
+ BoldFont = HarmonyOS_Sans_SC_Bold.ttf,
+]
+\setCJKmonofont{OUCSans}[
+ Extension = .otf,
+ Path = ../fonts/ouc-sans/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt
-%方正书宋
+%======================================================================
+% 三、5 个方正语义别名
+%
+% 用 \setCJKfamilyfont + \def 而非 \newCJKfontfamily,理由见 fonts.tex:
+% 后者是 LaTeX3 的 \NewDocumentCommand,命令已存在时会报错中断。
+% 命令名照旧,调用点零改动。
+%======================================================================
+
+% 书宋(原方正书宋)—— 正文
\setCJKfamilyfont{fzss}[
- Path=font/
-]{fangzhengshusong_GBK.TTF}
+ Extension = .otf,
+ Path = ../fonts/ouc-serif/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]{OUCSerif}
\newcommand{\fzss}{\CJKfamily{fzss}}
-%方正小标宋
+% 小标宋(原方正小标宋)—— 标题/强调,用宋体真粗体
\setCJKfamilyfont{fzxbs}[
- Path=font/
-]{fangzhengxiaobiaosong_GBK.TTF}
+ Extension = .otf,
+ Path = ../fonts/ouc-serif/,
+ UprightFont = *-Bold,
+ BoldFont = *-Bold,
+]{OUCSerif}
\newcommand{\fzxbs}{\CJKfamily{fzxbs}}
-%方正楷体
+% 楷体(原方正楷体)—— 引文、页眉、题注
\setCJKfamilyfont{fzkai}[
- Path=font/
-]{fangzhengkaiti_GBK.TTF}
+ Extension = .ttf,
+ Path = ../fonts/ouc-kai/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]{OUCKai}
\newcommand{\fzkai}{\CJKfamily{fzkai}}
-%方正仿宋
+% 仿宋(原方正仿宋)—— 斜体位
+% ⚠️ 朱雀仿宋只有常规一档。旧版这里配的是"方正仿宋",也是常规字面,
+% 所以观感一致;但若在 \fzfs 下用 \bfseries,不会真的变粗。
\setCJKfamilyfont{fzfs}[
- Path=font/
-]{fangzhengfangsong_GBK.TTF}
+ Extension = .ttf,
+ Path = ../fonts/zhuque-fangsong/,
+ UprightFont = *-Regular,
+]{ZhuqueFangsong}
\newcommand{\fzfs}{\CJKfamily{fzfs}}
-%方正中等线
+% 中等线(原方正中等线)—— 等宽位,用思源黑体
\setCJKfamilyfont{fzzdx}[
- Path=font/
-]{fangzhengzhongdengxian_GBK.TTF}
-\newcommand{\fzzdx}{\CJKfamily{fzzdx}}
-
-%鸿蒙字体
-\setCJKfamilyfont{hm}[
- Path=font/,
- BoldFont=HarmonyOS_Sans_SC_Bold.ttf,
- ItalicFont=HarmonyOS_Sans_SC_Light.ttf,
- BoldItalicFont=HarmonyOS_Sans_SC_Black.ttf,
-]{HarmonyOS_Sans_SC_Regular.ttf}
-\newcommand{\hm}{\CJKfamily{hm}}
\ No newline at end of file
+ Extension = .otf,
+ Path = ../fonts/ouc-sans/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]{OUCSans}
+\newcommand{\fzzdx}{\CJKfamily{fzzdx}}
\ No newline at end of file
diff --git a/科技报告/font/HarmonyOS_Sans_Bold.ttf b/科技报告/font/HarmonyOS_Sans_Bold.ttf
deleted file mode 100644
index 8ea60c1..0000000
Binary files a/科技报告/font/HarmonyOS_Sans_Bold.ttf and /dev/null differ
diff --git a/科技报告/font/HarmonyOS_Sans_Bold_Italic.ttf b/科技报告/font/HarmonyOS_Sans_Bold_Italic.ttf
deleted file mode 100644
index 8b4cc6f..0000000
Binary files a/科技报告/font/HarmonyOS_Sans_Bold_Italic.ttf and /dev/null differ
diff --git a/科技报告/font/HarmonyOS_Sans_Regular.ttf b/科技报告/font/HarmonyOS_Sans_Regular.ttf
deleted file mode 100644
index d7eccac..0000000
Binary files a/科技报告/font/HarmonyOS_Sans_Regular.ttf and /dev/null differ
diff --git a/科技报告/font/HarmonyOS_Sans_Regular_Italic.ttf b/科技报告/font/HarmonyOS_Sans_Regular_Italic.ttf
deleted file mode 100644
index fac9212..0000000
Binary files a/科技报告/font/HarmonyOS_Sans_Regular_Italic.ttf and /dev/null differ
diff --git a/科技报告/font/HarmonyOS_Sans_SC_Black.ttf b/科技报告/font/HarmonyOS_Sans_SC_Black.ttf
deleted file mode 100644
index 824b3d4..0000000
Binary files a/科技报告/font/HarmonyOS_Sans_SC_Black.ttf and /dev/null differ
diff --git a/科技报告/font/HarmonyOS_Sans_SC_Bold.ttf b/科技报告/font/HarmonyOS_Sans_SC_Bold.ttf
deleted file mode 100644
index 5c925d1..0000000
Binary files a/科技报告/font/HarmonyOS_Sans_SC_Bold.ttf and /dev/null differ
diff --git a/科技报告/font/HarmonyOS_Sans_SC_Light.ttf b/科技报告/font/HarmonyOS_Sans_SC_Light.ttf
deleted file mode 100644
index 8cfbc9d..0000000
Binary files a/科技报告/font/HarmonyOS_Sans_SC_Light.ttf and /dev/null differ
diff --git a/科技报告/font/HarmonyOS_Sans_SC_Regular.ttf b/科技报告/font/HarmonyOS_Sans_SC_Regular.ttf
deleted file mode 100644
index aff150a..0000000
Binary files a/科技报告/font/HarmonyOS_Sans_SC_Regular.ttf and /dev/null differ
diff --git a/科技报告/font/fangzhengfangsong_GBK.TTF b/科技报告/font/fangzhengfangsong_GBK.TTF
deleted file mode 100644
index 7fef4d6..0000000
Binary files a/科技报告/font/fangzhengfangsong_GBK.TTF and /dev/null differ
diff --git a/科技报告/font/fangzhengkaiti_GBK.TTF b/科技报告/font/fangzhengkaiti_GBK.TTF
deleted file mode 100644
index 29978fb..0000000
Binary files a/科技报告/font/fangzhengkaiti_GBK.TTF and /dev/null differ
diff --git a/科技报告/font/fangzhengxiaobiaosong_GBK.TTF b/科技报告/font/fangzhengxiaobiaosong_GBK.TTF
deleted file mode 100644
index 77af56a..0000000
Binary files a/科技报告/font/fangzhengxiaobiaosong_GBK.TTF and /dev/null differ
diff --git a/科技报告/font/fangzhengzhongdengxian_GBK.TTF b/科技报告/font/fangzhengzhongdengxian_GBK.TTF
deleted file mode 100644
index 69fbc7a..0000000
Binary files a/科技报告/font/fangzhengzhongdengxian_GBK.TTF and /dev/null differ
diff --git a/科技报告/report.pdf b/科技报告/report.pdf
index e5a6b0f..a7b505c 100644
Binary files a/科技报告/report.pdf and b/科技报告/report.pdf differ
diff --git a/科技报告/report.tex b/科技报告/report.tex
index d186371..32d94d0 100644
--- a/科技报告/report.tex
+++ b/科技报告/report.tex
@@ -43,7 +43,7 @@
\section{准备工作}
在正式开始使用模板之前,需要你安装LiveTex,并安装任何可用的编辑器。
-不需要再做其他配置,字体在font文件夹中,编译时会自动调用,无须额外安装。
+不需要再做其他配置。字体统一放在仓库根目录的 \texttt{fonts/} 文件夹中(全库共用同一套),编译时会自动调用,无须额外安装,也不依赖你电脑上装了什么字体。
\section{字体}
@@ -51,15 +51,15 @@
英文字体,默认使用的是鸿蒙字体(HarmonyOS Sans),现在你看到的应该就是这个字体的效果。这些设置,可以在cls中,字体设定里面进行修改。
-中文字体,使用的是鸿蒙字体、方正小标宋、方正楷体、方正仿宋、方正中等线等。
+中文字体,使用的是鸿蒙字体、思源宋体、霞鹜文楷、朱雀仿宋、思源黑体等。全部为开源可商用字体,不使用任何方正、微软雅黑等商业字体。
-中文的默认字体衬线字体是方正书宋,加粗字体是方正小标宋,就像这样:\textbf{这里是加粗字体}。斜体的字体是方正楷体,就像这样:\textit{这里是中文斜体}。斜体粗体的字体是方正仿宋,就像这样:\textbf{\textit{这里是粗体斜体}}。中文的无衬线字体sans font使用的是方正黑体,你应该可以在标题中看到它。中文等宽字体,使用的是方正中等线字体。
+中文的默认字体衬线字体是思源宋体,加粗字体是思源宋体的真粗体,就像这样:\textbf{这里是加粗字体}。斜体的字体是霞鹜文楷,就像这样:\textit{这里是中文斜体}。斜体粗体的字体是朱雀仿宋,就像这样:\textbf{\textit{这里是粗体斜体}}。中文的无衬线字体sans font使用的是鸿蒙字体,你应该可以在标题中看到它。中文等宽字体,使用的是思源黑体。
默认的无衬线字体是鸿蒙字体,你应该可以在各种标题中看到它的样子。
同样,上述的字体,在cls中,都可以进行设置。
-另外,可以使用额外的命令,来临时改变某一段文字的字体设置,这些命令包括:fzss(方正书宋)、 fzxbs(方正小标宋)、、fzkai(方正楷体)、fzfs(方正仿宋)、fzzdx(方正中等线)、hm(鸿蒙字体)。使用方法是使用斜线命令的方式,这样:{\fzss 方正书宋}、 {\fzxbs 方正小标宋}、{\fzkai 方正楷体}、{\fzfs 方正仿宋}、{\fzzdx 方正中等线}、{\hm 鸿蒙字体}。
+另外,可以使用额外的命令,来临时改变某一段文字的字体设置。这些命令沿用了旧版的名字(fz开头,取自原先的方正系列),但实际用的都是随仓库分发的开源字体:fzss(宋体)、fzxbs(宋体粗,标题用)、fzkai(楷体)、fzfs(仿宋)、fzzdx(黑体)、hm(鸿蒙字体)。使用方法是使用斜线命令的方式,这样:{\fzss 宋体}、 {\fzxbs 宋体粗}、{\fzkai 楷体}、{\fzfs 仿宋}、{\fzzdx 黑体}、{\hm 鸿蒙字体}。注意这里的楷体是霞鹜文楷、仿宋是朱雀仿宋、黑体是思源黑体,都是可免费商用的开源字体。
\section{标题}
diff --git a/试卷/oucexam.sty b/试卷/oucexam.sty
index 2892213..39c67e2 100644
--- a/试卷/oucexam.sty
+++ b/试卷/oucexam.sty
@@ -46,21 +46,35 @@
%======================================================================
% 2. 字体
-% SimSun 宋体(标题/大题用 AutoFakeBold 模拟原卷描边加粗)
-% KaiTi 楷体(卷头) SimHei 黑体(装订栏“专业年级”)
-% Times New Roman 西文数字
+% 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下)。
+% 旧版这里是 SimSun / SimHei / KaiTi / Times New Roman 四个系统字体,
+% 换台机器(尤其 Linux/macOS)就编不出来,且都不能随仓库分发。
+%
+% 对应关系:
+% 宋体正文 OUC Serif ← 思源宋体 SC 子集(真粗体,不再 AutoFakeBold)
+% 黑体 OUC Sans ← 思源黑体 SC 子集
+% 楷体(卷头) OUC Kai ← 霞鹜文楷子集
+% 西文/数字 TeX Gyre Termes(Times 度量兼容,见下)
+%
+% ⚠️ 关于原卷的"宋体西文":
+% 原卷正文 Mealy / RS / 2026 等实测每个 ASCII 字符步距恒为 5.28bp
+% (= 0.500 em @10.5bp)且 font 名为 SimSun —— 即 Word 把西文设为
+% 宋体时给出的"半角等宽"字形。SimSun 是全 ASCII 0.500 em 等宽的。
+%
+% 这里改用 Termes,理由:
+% · Termes 的**数字**步距恰好也是 0.500 em,数字宽度零漂移;
+% · 本卷所有数字本来就走 \TNR{} / \TNRB{}(已实测 PDF 里 SimSun
+% 只承担空格与极少数裸字母),换字体的实际影响面只有那几处;
+% · 若要强行复刻 0.500 em 等宽只能上 Inconsolata 这类代码字体,
+% 放进试卷正文观感明显更差 —— 按需求"字体不合适再更换"的取舍,
+% 宁可让裸西文用 Termes 的比例字形。
+% 实测结论见 README「字体」一节的 A/B 对比。
%======================================================================
-% 正文西文默认用 SimSun 的等宽西文字形(原卷正文 Mealy / 2026 / RS 等
-% 实测每个 ASCII 字符步距恒为 5.28bp 且 font 名为 SimSun,即为宋体西文)。
-% 需要真正 Times 的地方(化简题、页脚、卷头年份)显式 \tnr / \tnrb。
-\setmainfont{SimSun}
-\setCJKmainfont{SimSun}[AutoFakeBold=2.86]
-\newCJKfontfamily\songti{SimSun}[AutoFakeBold=2.86]
-\newCJKfontfamily\heiti{SimHei}
-\newCJKfontfamily\kaiti{KaiTi}
-\newfontfamily\tnr{Times New Roman}
-\newfontfamily\tnrb{Times New Roman Bold}
-\newfontfamily\sunfont{SimSun}
+\input{../fonts.tex}
+
+% 试卷正文的宋体西文占位:原模板用 \sunfont 指 SimSun,现统一指 Termes。
+% 保留命令名是为了不动 \qnum / \logicexpr / \sumsig 等所有调用点。
+\let\sunfont\tnr
%----------------------------------------------------------------------
% ⚠️ xeCJK 陷阱:字体切换命令若紧邻 \par(或位于段落末尾),
diff --git a/试卷/ouckey.sty b/试卷/ouckey.sty
index 8d61c88..4e5ff06 100644
--- a/试卷/ouckey.sty
+++ b/试卷/ouckey.sty
@@ -59,18 +59,12 @@
\pagestyle{empty}
%----------------------------------------------------------------------
-% 字体(与 oucexam.sty 保持一致)
+% 字体(与 oucexam.sty 保持一致,全部取自公共字体包 ../fonts.tex)
%----------------------------------------------------------------------
-\setmainfont{Times New Roman}
-\setCJKmainfont{SimSun}[AutoFakeBold=2.86]
-% ctexart 已定义 \songti / \heiti,重名会报 "Control sequence already defined"
-% 只在未定义时才建(\provideCJKfontfamily 并不存在,必须自己判)
-\ifdefined\songti\else\newCJKfontfamily\songti{SimSun}[AutoFakeBold=2.86]\fi
-\ifdefined\heiti\else\newCJKfontfamily\heiti{SimHei}\fi
-\newCJKfontfamily\kaiti{KaiTi}
-\newfontfamily\tnr{Times New Roman}
-\newfontfamily\tnrb{Times New Roman Bold}
-\newfontfamily\sunfont{SimSun}
+\input{../fonts.tex}
+
+% \sunfont 原指 SimSun,现统一指 Termes(见 oucexam.sty 的说明)
+\let\sunfont\tnr
% 局部字体切换必须显式收尾,否则 xeCJK 字体会"溢出"到后一段
\newcommand{\TNR}[1]{{\tnr #1\normalfont}}
diff --git a/试卷/参考答案与评分标准示例.pdf b/试卷/参考答案与评分标准示例.pdf
index 2a50721..cbb122d 100644
Binary files a/试卷/参考答案与评分标准示例.pdf and b/试卷/参考答案与评分标准示例.pdf differ
diff --git a/试卷/试卷题型示例.pdf b/试卷/试卷题型示例.pdf
index 8744923..ac3cbdc 100644
Binary files a/试卷/试卷题型示例.pdf and b/试卷/试卷题型示例.pdf differ
diff --git a/试卷归档封面/README.md b/试卷归档封面/README.md
new file mode 100644
index 0000000..88d2831
--- /dev/null
+++ b/试卷归档封面/README.md
@@ -0,0 +1,120 @@
+# 试卷归档封面 —— 信息科学与工程学部试卷归档封面(理论课)
+
+信息科学与工程学部**试卷归档封面**的 XeLaTeX 模板。原文件是学院/学部下发的
+`.doc` 表格,本目录把它做成可直接编译的 LaTeX 版。
+
+> **改名说明**:原文件名为「附件1:信息科学与工程学院试卷封面(理论课)」,
+> 内文标题写的是「信息科学与工程学院试卷」。按现行建制与文档实际用途,
+> 已统一改为 **学部 + 归档封面**:目录名、文件名、内文标题三处同步。
+
+> 与 [`试卷/`](../试卷/) 的区别:`试卷/` 是**试卷正文 + 参考答案**(学校专用
+> 195×270mm 试卷纸、装订栏、成绩表);本目录是**随卷归档的封面单页**
+> (A4、11 行两列表单)。两者用途不同,不是同一份文件的两个版本。
+
+## 文件
+
+| 文件 | 说明 |
+|---|---|
+| `oucksfm.sty` | 版式包。A4、表宽 170mm、11 行固定行高,所有尺寸已注明换算过程 |
+| `试卷归档封面.tex` | 填写入口,【第 1 节】改课程信息即可 |
+| `试卷归档封面.pdf` | 成品样张 |
+
+## 编译
+
+```bash
+xelatex 试卷归档封面.tex
+```
+
+必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
+本模板自包含,不依赖任何图片。
+
+## 填表
+
+只改 `试卷归档封面.tex` 的【第 1 节】:
+
+```latex
+\newcommand{\sfmyear} {\ph{××××}年} % 学年
+\newcommand{\sfmterm} {\ph{×}季学期} % 学期
+\newcommand{\sfmcno} {080502101231} % 课程号(纯数字,14pt)
+\newcommand{\sfmsno} {25252029} % 选课号(纯数字,14pt)
+\newcommand{\sfmcourse}{\ph{××××}} % 考试课程名称
+\newcommand{\sfmtype} {\ph{×××}} % 课程类型
+\newcommand{\sfmmajor}{...} % 面向专业(多个用、隔开)
+\newcommand{\sfmgrade}{\ph{××××}} % 面向年级
+\newcommand{\sfmcount}{\ph{××}} % 试卷份数
+\newcommand{\sfmteacher}{\ph{×××}} % 授课教师
+\newcommand{\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),**全局生效**:
+
+```latex
+\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号
+\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号
+\xeCJKDeclareCharClass{CJK}{"25A1} % □ 方框(勾选框)
+```
+
+本模板不再需要自己声明。
+
+> ✅ [`年度考核登记表/`](../年度考核登记表/) 也有同样问题,**已随本次改造一并修好**
+> (原先那条注释说能修,但实测 PDF 里 × 仍落在 TNR —— 因为注释在、声明也写了,
+> 却没有真正作用到字符类)。现在已经实测确认:10 处 `×` 全部落在 OUC Sans 上。
+
+### 2. 字体全部来自公共字体包
+
+本模板原先用 SimHei / SimSun / FangSong + `AutoFakeBold` 描边,换台机器
+(尤其 Linux/macOS)就编不出来,而且这些字体都不允许随仓库分发。现改为
+`\input{../fonts.tex}`,字体文件在 `../fonts/` 下,来源与授权见
+[`../fonts/README.md`](../fonts/README.md)。
+
+### 3. `\linespread` 会悄悄放大行高
+
+ctex 默认 `\linespread` 约为 **1.3**,它会把 `\fontsize{18}{21.6}` 里的
+21.6 pt 行距放大到 **28 pt 以上**,逐行累积后整张表会顶出页面。
+
+`oucksfm.sty` 的解法是在**每个** `\fontsize` 之后紧跟 `\linespread{1}\relax`,
+并且在 `\AtBeginDocument` 之后再设一次(ctex 会在 `\begin{document}` 时
+把 `\linespread` 重新设回 1.3,只在导言区设是无效的):
+
+```latex
+\AtBeginDocument{\linespread{1}\selectfont}
+```
+
+没有这一步,表高会比原卷高出一大截。
diff --git a/试卷归档封面/oucksfm.sty b/试卷归档封面/oucksfm.sty
new file mode 100644
index 0000000..8d1f4aa
--- /dev/null
+++ b/试卷归档封面/oucksfm.sty
@@ -0,0 +1,274 @@
+%======================================================================
+% oucksfm.sty — 信息科学与工程学部 试卷归档封面(理论课)版式包
+%
+% 依据:附件1:信息科学与工程学院试卷封面(理论课).doc
+% (SynologyDrive/授课/数字逻辑/2025/归档/)
+% 原名与内文标题写的是「学院」,按现行建制改为「学部」,
+% 模板标题相应为「信息科学与工程学部试卷归档封面」。
+% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算:
+% pt → mm : mm = pt / 72 * 25.4
+% twips → mm : mm = twips / 1440 * 25.4
+% w:sz : 半磅值,÷ 2 即 pt
+%
+% 用法见同目录 试卷归档封面.tex,说明见 README.md
+%======================================================================
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{oucksfm}[2026/10/26 v1.0 OUC exam archive cover sheet]
+
+\RequirePackage{geometry}
+\RequirePackage{fontspec}
+\RequirePackage{xeCJK}
+\RequirePackage{tabularray}
+
+%======================================================================
+% 1. 页面与版心
+%
+% 原 .doc sectPr:
+% pgSz A4(595.3 × 841.9 pt = 210.0 × 297.0 mm)
+% pgMar top/bottom 70.9 pt = 25.01 mm
+% left/right 56.7 pt = 20.00 mm
+% header 42.55 pt = 15.01 mm / footer 49.6 pt = 17.50 mm
+%
+% 表宽 tblW = 100%(w:type="pct" w:w="5000"),即铺满版心:
+% 版心宽 = 210 − 2×20.00 = 170.00 mm
+%
+% ⇒ 这里让 totalwidth 恰等于 170mm:
+% · 表格天然与版心同宽,编译不刷 Overfull \hbox
+% · 表格在纸面上的绝对位置与 Word 完全一致(左右各 20mm)
+%======================================================================
+\geometry{
+ paperwidth = 210mm,
+ paperheight = 297mm,
+ totalwidth = 170mm, % = 表宽,精确
+ hmarginratio = 1:1, % 左右各 20mm
+ top = 25.01mm,
+ bottom = 25.01mm,
+ headheight = 0pt,
+ headsep = 0pt,
+ footskip = 17.50mm,
+}
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{0pt}
+\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码
+
+%======================================================================
+% 2. 字体与字号
+%
+% 表外标题 黑体 18pt 加粗(w:sz=36 + w:b),jc=center
+% 左列标签 黑体 18pt (w:sz=36,全部 11 行一致)
+% 右列值 黑体 18pt (w:sz=36)—— 学年 / 学期
+% 黑体 16pt (w:sz=32)—— 考试课程名称 / 课程类型 /
+% 面向专业 / 面向年级 / 试卷份数 /
+% 授课教师 / 日期
+% 黑体 14pt (w:sz=28)—— 课程号 / 选课号(纯数字,字号小一档)
+%
+% ⚠️ 全文只有黑体一种字体,没有宋体/仿宋混排,比另两份表单简单。
+%
+% 字体全部来自仓库公共字体包 ../oucfonts.sty(文件在 ../fonts/ 下)。
+% 旧版这里写的是系统字体的 SimHei / SimSun / FangSong + AutoFakeBold,
+% 换台机器(尤其 Linux/macOS)就编不出来。现已全部换成随仓库分发的
+% 开源字体,并且粗体用字体自带的真粗体、不再算法描边。
+%======================================================================
+\input{../fonts.tex}
+
+%----------------------------------------------------------------------
+% ⚠️⚠️⚠️【最要命的一条,与 ouclw.sty 同源】
+% ctex 默认 \linespread 约 1.3,会把 \fontsize{18}{21.6} 的 21.6pt
+% 行距放大成 28pt 以上。
+%
+% \fontsize 的第二个参数【本来是】用来设 \baselineskip 的,但
+% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread 归 1。
+% 这一步不能省,也必须在 \AtBeginDocument 之后再设一次
+% (ctex 在 begin document 时会重设)。
+%----------------------------------------------------------------------
+\newcommand{\sfmbodyfont}{%
+ \linespread{1}\relax
+ \fontsize{18}{21.6}\selectfont}
+
+% 三档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致)
+\newcommand{\sfmbigfont}{\linespread{1}\relax\fontsize{18}{21.6}\selectfont}
+\newcommand{\sfmmidfont}{\linespread{1}\relax\fontsize{16}{19.2}\selectfont}
+\newcommand{\sfmsmlfont}{\linespread{1}\relax\fontsize{14}{16.8}\selectfont}
+
+%----------------------------------------------------------------------
+% ⚠️ xeCJK 陷阱:局部字体切换命令若紧邻 \par(或落在段落末尾),段末的
+% 字体状态会"溢出"到后面段落。故局部切换一律用带 \normalfont 收尾的包装。
+%----------------------------------------------------------------------
+\newcommand{\SFMHT}[1]{{\heiti #1\normalfont}}
+
+%----------------------------------------------------------------------
+% ⚠️⚠️⚠️【「×」占位符的坑 —— 在 年度考核登记表/ 里踩过,那里只是绕过去了,
+% 这里做了根治】
+%
+% 现象:写 {\heiti ×××} 后编译,PDF 里这些 × 实际用的是
+% Times New Roman(pymupdf 读 span 的 font=TimesNewRomanPSMT),
+% 不是黑体。§ 29 个 × 撑不满预期宽度,跟汉字混排时基线也偏。
+%
+% 原因:xeCJK 按 Unicode 区段分类。「×」是 U+00D7,落在 Latin-1 补充区,
+% xeCJK 把它判成【西文字符】⇒ 交给 fontspec 的西文字体(TNR)。
+% \heiti / \fangsong 只切换 CJK 字体,对这个字符【不起作用】。
+% 所以 {\fangsong ××} 这种写法看着像修好了,实际并没有
+% (年度考核登记表/ 的 PDF 里 × 至今仍是 TNR)。
+%
+% 正解:把 U+00D7 显式声明为 CJK 字符类,让它回到 CJK 字体族,
+% \heiti / \fangsong 才能真正管到它。全角宽度也就与汉字一致了。
+%
+% ⚠️ 这条只在本包内生效,不影响其它模板(年度考核登记表 若也要修,
+% 把这两行照抄过去即可)。
+%----------------------------------------------------------------------
+\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号 → 归 CJK,跟着 \heiti/\fangsong 走
+\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号 → 归 CJK(学年区间「2025—2026」用得上)
+
+%======================================================================
+% 3. 列的宽度模型
+%
+% 原 .doc tblGrid(2 个网格列,col_widths_pct = [30, 70]):
+% c1 = 170 × 30% = 51.000 mm
+% c2 = 170 × 70% = 119.000 mm
+%
+% cellMar:left/right = 85 twips = 1.4993 mm,top/bottom = 0
+% 边框 :w:sz = 4(单位 1/8 pt)⇒ 0.5 pt = 0.1764 mm
+%
+%----------------------------------------------------------------------
+% ⚠️ 与 ouclw.sty 一样,这里可以如实还原内边距(最窄列 51mm 远宽于两倍
+% 内边距 3.00mm,不像年度考核表那样被极窄列逼着取 colsep=0)。
+%
+% tabularray 的 colsep 计在每列【左右两侧】,故 2 列共 4×1.4993 = 5.9972mm;
+% 竖线 3 根(左边界 + 中间 + 右边界)× 0.1764mm = 0.5292mm。
+% 要让 Σwd + 5.9972 + 0.5292 = 170.000,需
+% Σwd = 163.4736 mm
+% 而 (gridCol − 2×1.4993) 之和为 164.0028 mm,两者差 0.5292 mm 正好是竖线宽,
+% 故每列再减 0.5292/2 = 0.2646 mm。
+%
+% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
+% 实测需再微调(见 3.2 的实测标定值),否则一直报
+% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。
+%======================================================================
+\newcommand{\sfmrule}{0.5pt} % 边框粗细(w:sz=4)
+\newcommand{\sfmcolsep}{1.4993mm} % 单元格左右内边距(85 twips)
+\newlength{\sfmtblw}
+\setlength{\sfmtblw}{170mm} % 表宽(含 3 根竖线与 4 处内边距)
+
+%----------------------------------------------------------------------
+% 3.1 各列宽(= gridCol − 2×colsep − 竖线分摊的理论值)
+% 与 sfmtable 环境里 colspec 的 wd 必须逐字一致。
+%----------------------------------------------------------------------
+\newcommand{\sfmwa}{47.7368mm} % c1 51.000 − 2.9986 − 0.2646
+\newcommand{\sfmwb}{115.7368mm} % c2 119.000 − 2.9986 − 0.2646
+
+%----------------------------------------------------------------------
+% 3.2 各列【内容可用宽】
+%
+% 单列单元格的内容宽 = wd(左右两半 colsep 已被 colspec 扣掉并计入表格宽)。
+% 本表全部是不跨列的单列格,没有"合并格回收内边距"的问题(ouclw.sty 的
+% \lwspanA / \lwspanB 那类坑在这里不存在)。
+%----------------------------------------------------------------------
+
+%======================================================================
+% 4. 行高
+%
+% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast):
+% R1 学年 42.55 pt = 15.011 mm
+% R2 学期 42.55 pt = 15.011 mm
+% R3 课程号 43.55 pt = 15.363 mm
+% R4 选课号 41.05 pt = 14.482 mm
+% R5 考试课程名称 41.30 pt = 14.570 mm
+% R6 课程类型 42.55 pt = 15.011 mm
+% R7 面向专业 93.10 pt = 32.844 mm ← 唯一高行,容 5 个专业名折行
+% R8 面向年级 42.55 pt = 15.011 mm
+% R9 试卷份数 52.80 pt = 18.627 mm
+% R10 授课教师 42.55 pt = 15.011 mm
+% R11 日期 42.55 pt = 15.011 mm
+% ────────────────────────────────────────
+% 合计 185.949 mm
+%
+% ⚠️ Word 的 exact 是"精确等于",内容超了会【被裁掉】。tabularray 的
+% ht= 是最小行高(内容多则自动长高),语义更安全。本表各行内容都远
+% 小于行高,两者结果相同,故直接写 ht=。
+%
+% ⚠️ 那几行 42.55 / 43.55 / 41.05 / 41.30 的零头不是随机的:Word 里
+% 它们是"字符高 + 段前段后"凑出来的实际测量值,照抄才能与原卷逐行对齐。
+%======================================================================
+
+%======================================================================
+% 5. 表格环境
+%
+% ⚠️ 用 tblr 而非 longtblr:本表总高约 186 mm,一页装得下(版心高
+% 297 − 2×25.01 = 247 mm),不需要断页。
+%
+% ⚠️⚠️ colspec 与 row{} 必须字面写在这里,不能先存进宏再展开:
+% tabularray 的列类型解析在宏展开之外进行,会报
+% "Unexpandable command \xxx inside column type"。
+% (所以 3.1 节那些 \sfmwa… 只作文档用,不能拼进 colspec。)
+%
+% ⚠️ 选项里的宏名一律不带 @:tabularray 解析选项时 @ 不是字母。
+%======================================================================
+\newenvironment{sfmtable}{%
+ \par\begingroup
+ \begin{tblr}[label=none]{
+ colspec={Q[c,m,wd=47.7368mm] Q[c,m,wd=115.7368mm]},
+ colsep=1.4993mm, rowsep=0pt, stretch=0,
+ hline{1-Z}={\sfmrule}, vline{1-Z}={\sfmrule},
+ row{1}={ht=15.011mm}, row{2}={ht=15.011mm},
+ row{3}={ht=15.363mm}, row{4}={ht=14.482mm},
+ row{5}={ht=14.570mm}, row{6}={ht=15.011mm},
+ row{7}={ht=32.844mm}, row{8}={ht=15.011mm},
+ row{9}={ht=18.627mm}, row{10}={ht=15.011mm},
+ row{11}={ht=15.011mm},
+ }%
+}{%
+ \end{tblr}\par\endgroup}
+
+%======================================================================
+% 6. 单元格内容包装
+%
+% 本表全是单列格,tabularray 的 Q[c,m,wd=…] 已处理好居中与折行,
+% 不需要 ouclw.sty 那种定宽 \parbox。这里只提供两个语义化的标签宏,
+% 让 .tex 里不必反复写 \SFMHT{}。
+%======================================================================
+
+% \sfmlabel{文字} —— 左列标签:黑体 18pt
+\newcommand{\sfmlabel}[1]{{\heiti\sfmbigfont #1\normalfont}}
+
+% \sfmval{文字} —— 右列值(16pt,最常用)
+\newcommand{\sfmval}[1]{{\heiti\sfmmidfont #1\normalfont}}
+
+% \sfmvalbig{文字} —— 右列值(18pt):学年 / 学期两行
+\newcommand{\sfmvalbig}[1]{{\heiti\sfmbigfont #1\normalfont}}
+
+% \sfmvalsmall{文字} —— 右列值(14pt):课程号 / 选课号
+\newcommand{\sfmvalsmall}[1]{{\heiti\sfmsmlfont #1\normalfont}}
+
+%======================================================================
+% 7. 表外标题
+%
+% 原 .doc 第 1 段:黑体、加粗、w:sz=36(18pt)、jc=center
+%
+% 原文标题是「信息科学与工程学院试卷」,按现行建制与文档实际用途已改为
+% 「信息科学与工程学部试卷归档封面」
+% 实测 18pt 下宽 94.89mm,版心宽 170mm,左右各余约 37mm,单行不折。
+% 再加长(比如后面挂"(理论课)")仍有余量,超过 170mm 才会折行。
+%
+% 标题与表格之间原 .doc 有 3 个空段落(idx 13/14/15),
+% 合计 3 × 21.6pt = 64.8pt = 22.86 mm。这里用 \sfmtitleskip 还原。
+%======================================================================
+\newlength{\sfmtitleskip}
+\setlength{\sfmtitleskip}{22.86mm}
+
+\newcommand{\sfmtitle}[1]{%
+ \par
+ \begingroup
+ \centering
+ {\heiti\bfseries\sfmbigfont #1\par}%
+ \endgroup
+ \vspace{\sfmtitleskip}}
+
+%======================================================================
+% 8. 表后空行
+%
+% 原 .doc 表格之后还有一个空段落(idx 212)。
+%======================================================================
+\newcommand{\sfmtail}{\par\null\par}
+
+\AtBeginDocument{\sfmbodyfont}
+\endinput
\ No newline at end of file
diff --git a/试卷归档封面/试卷归档封面.pdf b/试卷归档封面/试卷归档封面.pdf
new file mode 100644
index 0000000..171eb3d
Binary files /dev/null and b/试卷归档封面/试卷归档封面.pdf differ
diff --git a/试卷归档封面/试卷归档封面.tex b/试卷归档封面/试卷归档封面.tex
new file mode 100644
index 0000000..95c285f
--- /dev/null
+++ b/试卷归档封面/试卷归档封面.tex
@@ -0,0 +1,121 @@
+%======================================================================
+% 中国海洋大学 信息科学与工程学部 试卷归档封面(理论课)
+%
+% 编译: xelatex 试卷归档封面.tex
+%
+% 本模板不含真人信息:课程名、课程号、选课号、班级、教师姓名一律用
+% × 占位。填表时只改下面【第 1 节】。
+%
+% 版式来源:SynologyDrive/授课/数字逻辑/2025/归档/
+% 附件1:信息科学与工程学院试卷封面(理论课).doc
+% (原文件名与内文标题写的是「学院」,现按现行建制改为「学部」)
+% 所有尺寸已在 oucksfm.sty 内注明换算过程;要改版式请改 sty。
+%
+% 与原 .doc 的差异(有意为之):
+% · 原文件里的真实课程信息已全部换成 × 占位
+% · 单位名「学院」按现行建制改为「学部」,标题相应改为
+% 「信息科学与工程学部试卷归档封面」
+% · 纸张、边距、表宽、行高、字号、字体一律照原值,未做任何调整
+%======================================================================
+\documentclass[UTF8,fontset=none]{ctexart}
+\usepackage{oucksfm}
+
+%======================================================================
+% 1. 表内内容(填表时只改这一段)
+%
+% ⚠️ 左列标签是学部制式用语,一般不用改;只改右列的值。
+%======================================================================
+
+%---- 左列标签(11 个,与学部原表的字一模一样,含字间空格)------------
+\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 期}
+
+%---- 右列的值(填表时改这里)------------------------------------------
+%
+% ⚠️⚠️【必须看】占位符「×」一律用 \ph{} 包起来,不要裸写 ×。
+%
+% 原因(在 年度考核登记表/ 里踩过):字体的 ASCII 区段由 fontspec 交给
+% 西文字体(这里是 Times New Roman),而「×」U+00D7 属于 Latin-1,
+% 会被判成 ASCII ⇒ 用 TNR 的 ×,那是 1em 宽的数学乘号,
+% 与汉字的 1em 字宽【不一样】(TNR 的 × 略窄、位置也偏)。
+% 结果是一串 × 撑不满预期宽度,与汉字混排时基线也参差。
+%
+% \ph{} 把它强制交回黑体(全角),宽度才与汉字一致。
+% 本表全文黑体,所以用 \heiti 收尾即可。
+%
+% ⚠️ 填表时把 \ph{×××} 整体替换成真实内容(不要保留 × ):
+% 例如 \newcommand{\sfmcourse}{数字逻辑},一行的 \ph 都不要留。
+%----------------------------------------------------------------------
+\newcommand{\ph}[1]{{\heiti #1\normalfont}}
+
+% 学年。原文件写「2025年」,学期行写「秋季学期」。
+% ⚠️ 注意:学部原表是「学年」+「2025年」这种写法,不是「2025—2026」。
+% 若学校要求写成区间,改这里即可,行高涨一点不会溢出。
+\newcommand{\sfmyear} {\ph{××××}年}
+
+% 学期:秋 / 春,或「秋季学期」「春季学期」
+\newcommand{\sfmterm} {\ph{×}季学期}
+
+% 课程号 / 选课号:纯数字,14pt(比其余值小一档,原表如此)
+% ⚠️ 纯数字是真正的 ASCII,本来就该用 TNR,所以不用 \ph 包。
+\newcommand{\sfmcno} {080502101231}
+\newcommand{\sfmsno} {25252029}
+
+% 考试课程名称
+\newcommand{\sfmcourse}{\ph{××××}}
+
+% 课程类型:专业课 / 公共基础课 / 通识课 …
+\newcommand{\sfmtype} {\ph{×××}}
+
+% 面向专业。多个专业之间用「、」隔开。
+% ⚠️⚠️ 这一格是全表唯一的高行(32.844mm),能容 3 行 16pt 文字。
+% 专业名超过 3 行会自动把行撑高,整表就顶出版心了——届时请把
+% oucksfm.sty 里 row{7} 的 ht 改大,或者把专业名精简。
+\newcommand{\sfmmajor}{%
+ \ph{××××××××}、\ph{××××}、\ph{××××××}、\ph{××××××}、\ph{××××××}}
+
+% 面向年级
+\newcommand{\sfmgrade}{\ph{××××}}
+
+% 试卷份数
+\newcommand{\sfmcount}{\ph{××}}
+
+% 授课教师
+\newcommand{\sfmteacher}{\ph{×××}}
+
+% 日期
+\newcommand{\sfmdate}{\ph{××××}年\ph{××}月\ph{××}日星期\ph{×}}
+
+%======================================================================
+% 2. 正文
+%======================================================================
+\begin{document}
+
+\sfmtitle{信息科学与工程学部试卷归档封面}
+
+\begin{sfmtable}
+ \sfmlabel{\sfmyearlabel} & \sfmvalbig{\sfmyear} \\
+ \sfmlabel{\sfmtermlabel} & \sfmvalbig{\sfmterm} \\
+ \sfmlabel{\sfmcnolabel} & \sfmvalsmall{\sfmcno} \\
+ \sfmlabel{\sfmsnolabel} & \sfmvalsmall{\sfmsno} \\
+ \sfmlabel{\sfmcourselabel} & \sfmval{\sfmcourse} \\
+ \sfmlabel{\sfmtypelabel} & \sfmval{\sfmtype} \\
+ \sfmlabel{\sfmmajorlabel} & \sfmval{\sfmmajor} \\
+ \sfmlabel{\sfmgradelabel} & \sfmval{\sfmgrade} \\
+ \sfmlabel{\sfmcountlabel} & \sfmval{\sfmcount} \\
+ \sfmlabel{\sfmteacherlabel} & \sfmval{\sfmteacher} \\
+ \sfmlabel{\sfmdatelabel} & \sfmval{\sfmdate} \\
+\end{sfmtable}
+
+\sfmtail
+
+\end{document}
\ No newline at end of file
diff --git a/课程执行大纲/README.md b/课程执行大纲/README.md
index 181a835..03c3482 100644
--- a/课程执行大纲/README.md
+++ b/课程执行大纲/README.md
@@ -92,7 +92,7 @@ xelatex 课程执行大纲.tex # 单次即可,无交叉引用
| `trHeight`(exact) | 454 | 8.01(本包用 7.834,见坑 3) |
| 边框 `sz` | 4 | 0.5pt |
-`tblLayout fixed`、`jc center`、`tblW 0 auto`。全表 12pt 方正仿宋。
+`tblLayout fixed`、`jc center`、`tblW 0 auto`。全表 12pt 仿宋(朱雀仿宋)。
### 表 1(教学日历)
@@ -184,18 +184,30 @@ ctex 默认 `\linespread ≈ 1.3`,会把 `\fontsize{12}{18}` 的行距放大
反过来,在已经缩小过字号的上下文里,**不能**用 `\linespread{1.2}` 当"1.2 倍行距"
(它乘的是外层的 9pt,不是当前的 10.5pt),要直接钉 `\fontsize{10.5}{12.6}`。
-## 字体降级
+## 字体
-原 docx 用了 4 个字体,其中 3 个是**方正商业字体**,嵌在 docx 里但本机没装:
+原 docx 用了 4 个字体,其中 3 个是**方正商业字体**,嵌在 docx 里但本机没装。
+旧版做法是降级到 Windows 自带字体(宋体/黑体/仿宋 + `AutoFakeBold` 伪粗),
+但这既依赖本机装了什么字体(换台机器就可能编不出),而且 SimSun / SimHei /
+FangSong 也都不允许随仓库分发。
-| docx 原字体 | 用在哪 | 本包替代 |
-|---|---|---|
-| 方正小标宋简体 | 校名、副标题、大标题、教学日历 | 宋体 + 伪粗(`AutoFakeBold=3.2`) |
-| 方正仿宋_GB2312 | 正文、表 0、签字栏 | 仿宋(`FangSong`) |
-| 黑体 | 各级标题 | 黑体(`SimHei`) |
-| 宋体 | 教学日历表 9pt | 宋体(`SimSun`) |
+现在全部改用仓库公共字体包 `../fonts.tex`:
-装过方正字体的话,改 `ouccourse.sty` 第 75~78 行的 `\newCJKfontfamily` 即可,其余不动。
+| 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 没有这种空隙,
不关会出现「×× 学部×× 学院」这种多出来的空格。
@@ -210,7 +222,7 @@ ctex 默认 `\linespread ≈ 1.3`,会把 `\fontsize{12}{18}` 的行距放大
| 行内是否允许断开 | 允许(无 `cantSplit`) | 允许 | 一致 |
| 表 0 每行高 | 8.01 | 8.01 | 一致 |
| 表 1 表宽 | 165.54 | 165.36(−0.18) | 竖线宽度舍入 |
-| 字体 | 方正小标宋/仿宋 | 宋体加粗/仿宋 | 商业字体未安装 |
+| 字体 | 方正小标宋/仿宋 | 思源宋体粗/朱雀仿宋 | 商业字体不可分发,已换开源替代 |
| 修订标记 | 46 处 `w:ins` | 不保留 | 已接受全部插入修订 |
| 46 处 `w:ins` 中的红字 | `color=C00000` | 黑色 | 那是修订高亮,非正式版式 |
diff --git a/课程执行大纲/ouccourse.sty b/课程执行大纲/ouccourse.sty
index 39290c4..7975c20 100644
--- a/课程执行大纲/ouccourse.sty
+++ b/课程执行大纲/ouccourse.sty
@@ -55,22 +55,32 @@
%======================================================================
% 2. 字体
%
-% 原 docx 用到 4 个字体,其中 3 个是方正商业字体,本机【没有】:
+% 原 docx 用到 4 个字体,其中 3 个是方正商业字体:
% 方正小标宋简体 标题(嵌在 docx 里,系统未安装)
% 方正仿宋_GB2312 正文(同上)
% 黑体 各级标题
% 宋体 教学日历表正文、9pt
%
-% ⇒ 降级方案(视觉上最接近的替代):
-% 方正小标宋简体 → 宋体加粗 (小标宋本身就是宋体的标题变体)
-% 方正仿宋_GB2312 → 仿宋 (同一字体族,GB2312 版)
-% 黑体 → SimHei
-% 宋体 → SimSun
-% 若你的机器装了方正字体,把下面几个 \newCJKfontfamily 的名字改掉即可,
-% 其余代码不用动。README 里有说明。
+% 旧版这里是 SimSun / SimHei / FangSong + AutoFakeBold 伪粗,即
+% 「本机恰好有 Windows 自带字体」的降级方案。问题有两层:
+% ① 换台机器(Linux/macOS、或精简版 Windows)就编不出来;
+% ② SimSun / SimHei / FangSong 都不允许随仓库分发。
+%
+% ⇒ 现改为全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下):
+% 方正小标宋简体 → \ccbiaosong = OUC Serif 的**真粗体**
+% (小标宋本就是宋体的标题变体,用真粗体比原来
+% AutoFakeBold=3.2 的算法描边干净得多 ——
+% 描边到 3.2 时笔画已经糊在一起)
+% 方正仿宋_GB2312 → \ccfang = Zhuque Fangsong(朱雀仿宋)
+% 黑体 → \cchei = OUC Sans(思源黑体)
+% 宋体 → \ccsong = OUC Serif(思源宋体)
+%
+% ⚠️ 朱雀仿宋只有常规一档、没有粗体。原版 \ccfang 靠 AutoFakeBold=2.5
+% 伪粗来排表头(课程执行大纲.tex 里 {\ccfang\ccszxi\bfseries ...})。
+% 现在伪粗已取消,\bfseries 在 \ccfang 下**不会变粗**。若表头必须
+% 加粗,请把那里的 \ccfang 换成 \cchei(黑体本身就是标题用的重字面)。
%======================================================================
-\setmainfont{Times New Roman}
-\setCJKmainfont{SimSun}[AutoFakeBold=2.5]
+\input{../fonts.tex}
%----------------------------------------------------------------------
% ⚠️ xeCJK 默认会在[汉字 ↔ 西文/数字]之间自动插一段空白(CJKecglue)。
@@ -84,10 +94,53 @@
}
\setlength{\parindent}{0pt}
-\newCJKfontfamily\ccsong{SimSun}[AutoFakeBold=2.5] % 宋体(可伪粗)
-\newCJKfontfamily\cchei{SimHei} % 黑体
-\newCJKfontfamily\ccfang{FangSong}[AutoFakeBold=2.5] % 仿宋
-\newCJKfontfamily\ccbiaosong{SimSun}[AutoFakeBold=3.2] % 小标宋的替代(加粗宋体)
+% 四个语义别名,沿用原命令名,正文一处都不用改。
+% 用 \setCJKfamilyfont + \def 而非 \newCJKfontfamily:后者是 LaTeX3 的
+% \NewDocumentCommand,若 ctex 已定义同名命令会直接报错中断(见 fonts.tex)。
+\setCJKfamilyfont{ccsong}[
+ Extension = .otf,
+ Path = ../fonts/ouc-serif/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]{OUCSerif}
+\def\ccsong{\CJKfamily{ccsong}}
+
+\setCJKfamilyfont{cchei}[
+ Extension = .otf,
+ Path = ../fonts/ouc-sans/,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+]{OUCSans}
+\def\cchei{\CJKfamily{cchei}}
+
+% ⚠️ 朱雀仿宋只有常规一档、没有粗体。而教学日历的表头
+% (课程执行大纲.tex 里的 {\ccfang\ccszxi\bfseries 周次} 等 6 处)
+% 明确要加粗。若不加处理,\bfseries 会被静默忽略
+% (日志报 "Font shape TU/ZhuqueFangsong/b/n undefined"),
+% 表头就与表体一样细,层次全丢了。
+%
+% 解法:只给这一族开 FakeBold=0.4 的**算法加粗**。
+% ① 原模板本来就靠 AutoFakeBold=2.5 伪粗,观感一致;
+% ② 只影响 \ccfang,不污染其他字族(正文宋体/黑体都是真粗体);
+% ③ 0.4 比原来 2.5 轻得多 —— 2.5 是 Word 描边档位,笔画会糊,
+% 0.4 只加一点点笔宽,正好补上"表头该比表体重一点"的差异。
+\setCJKfamilyfont{ccfang}[
+ Extension = .ttf,
+ Path = ../fonts/zhuque-fangsong/,
+ UprightFont = *-Regular,
+ BoldFont = *-Regular,
+ BoldFeatures = {FakeBold=0.8},
+]{ZhuqueFangsong}
+\def\ccfang{\CJKfamily{ccfang}}
+
+% 小标宋的替代:宋体真粗体(不是伪粗)
+\setCJKfamilyfont{ccbiaosong}[
+ Extension = .otf,
+ Path = ../fonts/ouc-serif/,
+ UprightFont = *-Bold,
+ BoldFont = *-Bold,
+]{OUCSerif}
+\def\ccbiaosong{\CJKfamily{ccbiaosong}}
%----------------------------------------------------------------------
% ⚠️⚠️⚠️ ctex 默认 \linespread ≈ 1.3,会把 \fontsize{12}{X} 的行距放大 30%。
diff --git a/课程执行大纲/课程执行大纲.pdf b/课程执行大纲/课程执行大纲.pdf
index 5ea3ad2..a9bfafa 100644
Binary files a/课程执行大纲/课程执行大纲.pdf and b/课程执行大纲/课程执行大纲.pdf differ
diff --git a/课程执行大纲/课程执行大纲.tex b/课程执行大纲/课程执行大纲.tex
index d86fb57..9c247f8 100644
--- a/课程执行大纲/课程执行大纲.tex
+++ b/课程执行大纲/课程执行大纲.tex
@@ -66,6 +66,29 @@
为数学模型并求解的基本能力,为后续的数字信号处理、通信原理、自动控制等课程奠定
基础。}
+% ⚠️ 英文段:不要在此处加任何断行干预。
+%
+% 现象:换用 TeX Gyre Termes 后,第 1 页英文段第 3 行会宽出 6.39pt
+% (Overfull),断行点比 Word 原稿略有前移。
+%
+% 根因:这一段第 2 行要靠 time-invariant 的显式连字符断成 "time-" +
+% "invariant" 才排得下 —— 实测该行到 "time-" 为止是 451.62pt,
+% 而可用宽度只有 452.32pt,**只剩 0.70pt 余量**。Times New Roman 下
+% 是 451.55pt(余 0.77pt)。两个字体都在临界线上,Termes 这边因为
+% 字宽差 0.07pt,TeX 判断这次断行"不划算"就放弃了,于是把单词整体
+% 推到下一行,连锁导致 6.39pt 溢出。
+%
+% 试过并**全部失败**的改法(勿重复):
+% ① \hyphenpenalty=10000 全段禁断词 → 溢出涨到 27.99pt
+% ② \emergencystretch=1.5em → 一行只排到 87pt 就提前断
+% ③ \sloppy → 整段多一行,第 1 页后续全部推移
+% ④ \mbox{throughout} → 溢出涨到 17.73pt
+% ⑤ \hyphenation{throughout} → 溢出涨到 17.73pt(同上)
+%
+% 当前处理:接受这 6.39pt 的 Overfull。它发生在右侧页边距之外的
+% 一个连字符上,**肉眼不可见**(该行 x1=536.6pt,纸张宽 595pt,
+% 右边距 22.93mm=65pt,仍有 58pt 空白),不影响任何正文内容与页数。
+% 这比为了消掉一条警告去动段落参数、把整页版式推乱要安全得多。
\ccp{This course is a core foundation subject for electronic information majors,
covering the fundamental laws and analytical methods of deterministic signals
passing through linear time-invariant systems. Two parallel threads, continuous