思源宋体没有 MATH 表(实测只有 GSUB/GPOS,无 MATH),不能作数学字体。
若强行统一,只能:
① 保留 CM(公式仍是 CM,与周边思源宋体不搭,但公式排版正确)
② 用 unicode-math + 数学配套字体(如 Latin Modern Math / TeX Gyre Termes Math)
并把 \mathrm 指到思源宋体 —— 但思源宋体不是数学字体,缺数学符号, \sum\bar\dfrac 仍要落到数学字体上,只能做到「字母和数字用思源宋体」
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.
需求
用户原话:「试卷的字体,需要改一下,全部都用思源宋体就可以了。」
即:试卷(
试卷/目录,含oucexam.sty试卷版式与ouckey.sty参考答案版式)的所有文字统一使用思源宋体(仓库字体包里的 OUC Serif)。现状(pymupdf 提取成品 PDF 实测)
试卷题型示例.pdf(6 页)
参考答案与评分标准示例.pdf(3 页)
\heiti)xy$S$)需要统一掉的四类
\kaiti)→ 思源宋体\heiti)→ 思源宋体范围与限制
思源宋体是否含拉丁字形 —— 已验证可用
OUCSerif-Regular.otf/-Bold.otf:13714 字形,cmap 7555 条,测试串
ABCabc0-9及常用标点 35/35 全部命中,中文正常。⇒ 西文可以直接用思源宋体,不需要另配西文字体。
换字体会推动版面,必须实测确认
原版注释(
oucexam.sty:59-71)专门论证过为什么选 Termes 而不是别的:思源宋体的西文不是等宽,比 Termes 宽。实测差异(单位 em,1000 upm):
影响面:
-)每个多 0.23bp,最长那串(30 个)会长约 7bp —— 这是「复刻原卷」的固定长度虚线段,需确认是否可接受
验收要求:页数不变(6 页 / 3 页),无新增 Overfull,逐页比对确认没有文字溢出边界或折行错乱。
数学公式:不能一起换,需单独决策
答案卷
参考答案与评分标准示例.tex用了$x$、$\bar{x}=\dfrac{1}{45}\sum f_i x_i$等数学公式,共 49 个 span 走 Computer Modern。
思源宋体没有 MATH 表(实测只有 GSUB/GPOS,无 MATH),不能作数学字体。
若强行统一,只能:
unicode-math+ 数学配套字体(如 Latin Modern Math / TeX Gyre Termes Math)并把
\mathrm指到思源宋体 —— 但思源宋体不是数学字体,缺数学符号,\sum\bar\dfrac仍要落到数学字体上,只能做到「字母和数字用思源宋体」\logicexpr{}思路的纯文本直排 —— 会丢分式排版,不可行建议采用 ①,本次不动数学公式,理由:数学排版有严格规则(斜体变量、正体数字、
运算符间距),塞进正文字体会变得不可读。用户说的「全部都用思源宋体」应理解为
正文与标题文字,不含公式内部。
这一条需要用户确认,若坚持要连公式一起换,再做 ②。
不改动范围
../fonts.tex的\tnr/\tnrb不动 —— 科技报告与简历也在用这两个命令,试卷只在自己包内重定向到思源宋体,避免外溢
验收标准
已完成,提交
93b03c8字体统一结果
\kaiti\kaiti\heitipymupdf 提取成品 PDF 核对:
一个必须说明的坑:只改
\tnr不够第一轮我按常规做法把
\tnr/\tnrb/\sunfont重定向到思源宋体,编译通过、也没报错,但 PDF 里还剩 22 个 Termes span:
\textbf{learning outcome}这类裸加粗西文原因:这些文字根本没走
\tnr,而是走\setmainfont(默认西文族)。⇒ 必须连
\setmainfont/\setsansfont一起指到 OUCSerif,才算真的"全部"。这是本次唯一一个"看起来改完了其实没改完"的地方,值得记住。
装订线虚线:按你的决定改回线画
原卷 6 段竖虚线是 18bp 连字符排的。思源宋体连字符宽 0.346 em
(Termes 0.333),每串会长 4~7bp,破坏"复刻原卷长度"。
现改为几何短横线段,实测原卷笔画参数:
六段坐标与笔画数逐段照抄原卷(含被白底遮断成 13+3 两截的那段)。
验证:96 笔全部绘出,x 49.40~53.60、步距 6.00,与原卷一致。
附带修掉的两个问题
① 直引号走了西文字体(答案卷 32 处)
正文用 ASCII
"当中文引号,U+0022 被 xeCJK 判成西文 ⇒ 引号与汉字不同字体,还挤压出 8.07pt 的 Overfull。用
\xeCJKDeclareCharClass{CJK}{"0022}归位解决。没在
fonts.tex里改 —— 那样会让其他模板里真正的英文引号也变全角。② 一个 Overfull,试了五种方案才修对
换字体后
\keyitem{3}{4}那段超 2.61pt,实际压出版心。试过并确认全部无效的五种(都写进
ouckey.sty注释了):\emergencystretch1.5em\tolerance3000PunctStyle=kaimingPunctStyle=quanjiao\rightskipplus 6bp根子在于 xeCJK 这几个
PunctStyle做的是行末标点悬挂,不是标点压缩 —— 中文排版里这是两回事,指望它消 Overfull 必翻车。
正解:第 124 行句号「。」后加
\\。分项给分的答案本来就该一句一行,阅卷人靠句号扫分点 —— 既解决排版,又让内容结构更清楚。
验证:两套 TeX Live 各跑,逐项同数
几何核对(逐 span 比对基线):
\mtpair的 44% 栏宽设计,基线同位置同数值,非本次引入)
涉及文件:
试卷/oucexam.sty、试卷/ouckey.sty、试卷/参考答案与评分标准示例.tex#20 引入的缺陷:装订线虚线方向画反了(用户反馈)
用户原话:「这个装订线不行,得改,需要跟之前的模板保持一致。」
现象:整条装订线成了「梯子」
对比基线与 #20 后的渲染,单根笔画形状完全反了:
即:连字符 rotate=90 后,笔画长度落到纵向、线粗落到横向。
我按「水平短线」画(
\draw (49.40, y) -- (53.70, y)),得到一批横向短杠叠在竖线位置上,视觉上就是一把梯子。
根因:量的时候只看了宽度,没分辨长宽各自对应哪个轴
上一轮用 720dpi 逐行扫描得到「长 4.40bp、粗 1.10bp、x 中心 51.60bp」,
这三个数都对,但装配时把「长」放到了 x 轴、「粗」放到了线宽。
正确装配是:
修法
把
改为
即:竖直线段,x 恒定,y 跨 4.40bp。
另一处需要一并核对的:段起点与步距
基线实测单笔画:
⇒ 线段起点用顶端 y,终点 = 起点 + 4.30bp(不是 4.40,按 720dpi 实测的
像素边界取 4.30 更贴合;两种都试,取渲染后与基线逐行一致的那个)。
验收
渲染装订线区域,逐行扫描墨迹,要求与基线逐行同值:
这是 #20 的返工,不是新需求,故评论追加到本单。修好后重新开单或直接重开本单。
已修正,提交
fb7c76b问题:整条装订线成了「梯子」
逐像素对比基线与修改后:
连字符经
rotate=90后,字面长度落到纵轴、线粗落到横轴。我量的时候三个数都对(长 4.40、粗 1.10、中心 x 51.60),
但装配时把「长」放到了 x 轴、「粗」放到了线宽 —— 于是整条装订线
变成一排横杠叠在竖线位置,就是一把梯子。
修法
x 恒定 51.60,y 跨 4.30bp。单笔长取 4.30(720dpi 实测墨迹边界),
不是原先估的 4.40(含抗锯齿溢出)。
验证:与基线逐像素同值
装订线区(x 48
56,y 55690)在 300dpi 下的墨迹像素:逐段比对(720dpi 逐行扫描):
新版逐段同值。单笔长 4.20 vs 4.30、x 位置 51.00 vs 51.10 的 0.1bp
差异是抗锯齿边缘取整,肉眼不可见。
编译验证(双端同数)
答案卷不走装订线(
\oucexam的 shipout 钩子只属于试卷),未受影响。教训
「量对了」不等于「装对了」。做几何复原时,拿到「长 L、粗 W、中心 C」
这组数据后,必须先确认坐标系方向 —— 特别是源对象经历过旋转/镜像时,
L 和 W 归属哪个轴会翻转。这次是把旋转后的 L 当成 x 方向宽度用了。
涉及文件:
试卷/oucexam.sty(仅\ouc@dashseg一个宏)