LaTeX Font Warning: Font shape `TU/OUCSerif(0)/m/it' undefined
(Font) using `TU/OUCSerif(0)/m/n' instead on input line 56.
LaTeX Font Warning: Font shape `TU/OUCSerif(0)/b/it' undefined
有个坑记一下:各档位的字体在不同目录,不能共用主选项的 Path/Extension,必须在该档位的 *Features 里单独写一套。否则 fontspec 会拿 ../fonts/ouc-serif/ 去拼 OUCKai-Regular.ttf,报 The font "OUCKai-Regular" cannot be found。
验证
编译后 TU/OUCSerif(0)/m/it、/b/it 两条 undefined 警告消失
解压 PDF 流确认斜体真的落在 OUCKai-Regular、粗斜落在 ZhuqueFangsong-Regular(不是被替换成常规体)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
现象 / 诉求
当前 7 个模板的字体处理分成两套互不相干的做法:
幻灯片/(fonts/49MB,鸿蒙 Sans 18 个字重)、科技报告/(font/92MB,鸿蒙 32MB + 方正 60MB),用Path=指相对路径加载。试卷/、试卷归档封面/、年度考核登记表/、劳务发放说明表/、课程执行大纲/,全部\documentclass[UTF8,fontset=none]{ctexart}+ 硬编码SimSun/SimHei/KaiTi/FangSong/Times New Roman。由此产生三个问题:
科技报告/font/下 5 个方正字体(书宋/小标宋/楷体/仿宋/中等线)共 60MB 是方正商业字体,以 Apache 2.0 随仓库分发属于授权越界;五个方案 B 模板依赖的 SimSun/SimHei/FangSong 与 Times New Roman 同样是商业字体(微软 / 中易 / Monotype),不能随模板分发。目标:模板库内只用可免费商用的字体,全部随仓库分发,所有人编译结果一致。
需求拆解
1. 建公共字体目录
在仓库根建
fonts/(与 7 个模板目录平级,不在任何模板目录内部),作为唯一字体来源。各模板通过相对路径../fonts/引用。字体集合取最小可用集——只保留实际排版需要的字重,不做全家桶。判定标准:每引入一个字重,必须在某个模板的源码里能找到实际调用点。
2. 清退全部商业字体
科技报告/font/试卷/替代字体一律选 SIL OFL / GUST / Apache 等明确允许再分发的许可证,并在
fonts/下附 LICENSE 与来源说明。3. 统一改接 + 全量重编译
七个模板全部改成只从
../fonts/取字体,不再出现任何系统字体名。改完逐个编译并逐页检查:
验收标准
grep全仓库源码,不再出现SimSun/SimHei/KaiTi/FangSong/Times New Roman/方正等商业字体名。.sty/.cls中所有字体声明都指向../fonts/。fonts/下每个字体文件都有对应许可证说明,全部允许免费商用与再分发。fonts/。收尾核对中新发现并已修复:中文斜体(
\textit)失效在做最后的「全库字体是否还有不合适的地方」核对时,发现了一处回归,不在原需求描述里,但属于同一件事(字体接入),一并修掉。
现象
科技报告编译报 4 条:report.tex里「斜体的字体是……就像这样:\textit{这里是中文斜体}」这句,中文斜体实际被静默替换成常规体——印出来根本看不出是斜体。\textbf{\textit{粗体斜体}}同理,粗斜体退化成只有粗体。根因
中文没有真正的斜体字形,中文排版惯例是「楷体代斜、仿宋代粗斜」。改造前的
科技报告/cls/font.cls本来就是这么配的:我改造时只写了
UprightFont+BoldFont两档,把ItalicFont/BoldItalicFont丢了,于是斜体无处可落,xeCJK 就按 undefined 处理。修复
在
fonts.tex的\setCJKmainfont上补回这两档,语义与原版一致(楷体 → OUC Kai,仿宋 → Zhuque Fangsong):有个坑记一下:各档位的字体在不同目录,不能共用主选项的
Path/Extension,必须在该档位的*Features里单独写一套。否则 fontspec 会拿../fonts/ouc-serif/去拼OUCKai-Regular.ttf,报The font "OUCKai-Regular" cannot be found。验证
TU/OUCSerif(0)/m/it、/b/it两条 undefined 警告消失OUCKai-Regular、粗斜落在ZhuqueFangsong-Regular(不是被替换成常规体)TU/OUCSerif(0)/m/sc警告是小型大写字母(\textsc),中文字体本就没有该字形,改造前也有,不属于本次范围顺带修掉的演示文字
科技报告/report.tex的「字体」一节是印在 PDF 上的说明正文,原来还写着「字体在 font 文件夹中」「方正小标宋」「方正楷体」等旧描述,与实际不符,已改为思源宋体/霞鹜文楷/朱雀仿宋/思源黑体,并注明「全部开源可商用,不使用正方正、微软雅黑等商业字体」。完成
提交
8aa9797,已推送 main。最终结构
幻灯片/fonts/(18 个文件 49MB)与科技报告/font/(92MB,含 5 款方正)已删除。字体总体积 141MB → 49MB。
七个模板的接入方式
全部
\input{../fonts.tex},各自只保留"哪一族当默认"的选择,字体文件路径一律指向../fonts/。试卷/oucexam.sty、试卷/ouckey.sty、课程执行大纲/ouccourse.sty、试卷归档封面/oucksfm.sty、年度考核登记表/ouckhtb.sty、劳务发放说明表/ouclw.sty、幻灯片/theme/beamerfontthemeOUCSlide.sty、科技报告/cls/font.cls—— 全部改完,\sunfont/\fzss/\ccfang这类旧命令名保留,调用点零改动。全量重编结果
两条 Overfull、两条 Underfull、两条
Font shape pcr undefined、两条Font shape sc undefined全部经改造前版本对照确认是原有问题(改造后反而是减少的,科技报告 Underfull 从 2 条降到 1 条)。
与改造前的逐行 A/B 对照
导出 HEAD 版本单独编译作为基准,逐页逐行取
(页码, 文本, x, y)比对:through-/through、process-/processing),词本身未变字符集覆盖
扫描全库正文(剔除注释)857 个非 ASCII 字符:
顺带修的
\textit失效(漏配ItalicFont/BoldItalicFont)—— 已补,实测落在OUCKai-Regular科技报告/report.tex的字体演示正文还在写「方正小标宋」等旧名 —— 已改为思源宋体/霞鹜文楷/朱雀仿宋/思源黑体试卷/_bak/备份目录(含旧setmainfont{SimSun})—— 已删验收页面:
.workbuddy/字体总览/index.html