字体统一:建公共字体目录,全部改用开源可商用字体 (#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
+23 -11
View File
@@ -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` | 黑色 | 那是修订高亮,非正式版式 |
+67 -14
View File
@@ -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%。
Binary file not shown.
+23
View File
@@ -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