字体统一:建公共字体目录,全部改用开源可商用字体 (#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
+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%。