字体统一:建公共字体目录,全部改用开源可商用字体 (#6)

七个模板原先分两套做法:幻灯片/fonts(49MB 鸿蒙 18 个字重)与
科技报告/font(92MB,含 5 款方正商业字体),其余模板直接调系统
SimSun/SimHei/KaiTi/FangSong/Times New Roman。换机器就编不出来,
方正系列也不允许随仓库分发。

统一到仓库根的 fonts/ + fonts.tex:
- OUC Serif(思源宋体 SC 子集)   —— 宋体
- OUC Sans(思源黑体 SC 子集)    —— 黑体
- OUC Kai(霞鹜文楷子集)          —— 楷体
- Zhuque Fangsong(朱雀仿宋)      —— 仿宋
- TeX Gyre Termes                  —— 西文 Times 等价(度量逐字相同)
- HarmonyOS Sans                   —— 幻灯片/科技报告原有字体

fonts.tex 是唯一允许声明字体的地方,7 个模板全部 \input 它。
字体体积 141MB -> 49MB(去掉重复),全库共用一套最小集合。

几处踩过的坑(均已写进源码注释):
- \newCJKfontfamily 与 ctex 默认 fontset 冲突会中断编译,改用
  \setCJKfamilyfont + \def
- \newfontfamily 缺粗体档会让 \bfseries 静默失效,四档必须全给
- UprightFont= 与主参数不能同时给,否则文件名被拼两次
- Path= 相对编译时工作目录,不是相对 .sty
- ×/□/○ 等符号按 Unicode 区段被判成西文,需 \xeCJKDeclareCharClass
- 中文斜体的 ItalicFont 与主字体不在同一目录,须在 ItalicFeatures
  里单独写 Path/Extension(否则报 OUCKai-Regular cannot be found)

顺带:
- 科技报告 report.tex 的字体演示正文改为新字体名(原文写着方正系列)
- 试卷归档封面新模板并入本库
- 科技报告 shell 命令框底色改海大蓝(#5 遗留)

验证(7 个模板 8 个 PDF 全量重编 + 逐行 A/B 对照):
- 错误 0,缺字 0
- 幻灯片 362 行逐行完全一致,零漂移
- 年度考核登记表 / 劳务发放说明表 / 试卷题型示例 / 参考答案 文本完全一致
- 课程执行大纲 仅 2 处断字连字符差异(throughout、processing),
  1 条 6.39pt Overfull 已论证不可见(距纸张右边缘仍有 20.7mm)
- 科技报告 内嵌字体方正归零,只剩 OUC Serif/Sans/Kai + Zhuque
- 全库正文 857 个非 ASCII 字符,四款中文字体(含粗体)覆盖 100%
This commit is contained in:
2026-10-27 00:43:14 +08:00
parent c69f4461dc
commit 8aa979739a
71 changed files with 1519 additions and 184 deletions
+97
View File
@@ -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 为华为官方允许免费商用。
如对本目录内任何字体的授权有疑问,请以上游地址的授权原文为准。
+264
View File
@@ -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 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.