科技报告模板字体调整:西文改衬线、目录条目统一、代码换真等宽
用户反馈:「字体不太好看,标题一会黑体一会什么体的」。
用 pymupdf 提取 report.pdf 的渲染文本,实际用到的字体如下:
report.pdf
HarmonyOS_Sans_SC_Bold
OUCSerif-Regular
OUCKai-Regular
HarmonyOS_Sans
HarmonyOS_Sans_Bold
OUCSerif-Bold
\ttfamily
cls/font.cls:52 把 \setmainfont 设成了 HarmonyOS Sans:
cls/font.cls:52
\setmainfont
\setmainfont{HarmonyOS_Sans_Regular.ttf}[...]
这是从旧版(方正系列)继承下来的设置。旧版中文默认是方正书宋、西文是鸿蒙,两者本来也不搭; 后来中文换成了思源宋体(衬线),西文却还是鸿蒙(无衬线),反差比旧版更明显。
\setmainfont 是西文字体的总开关,同时也是:
\setCJKmainfont
西文正文改 Cochineal(fonts/cochineal/,Minion 风格,OFL 1.1)
fonts/cochineal/
fonts.tex
\setsansfont 保持鸿蒙 —— 标题用 \hm(CJK 族名 OUCHM)来切, 西文 sans 位仍是鸿蒙。标题的中西文都还是鸿蒙,与正文区分得开。
\setsansfont
\hm
\setmonofont 与 \setCJKmonofont 换成真等宽
\setmonofont
\setCJKmonofont
lmmono
目录条目字体统一 —— 加了 \ttfamily 那类隐性回退之后,还要显式把 目录条目的西文编号也指到正文西文字体,避免编号与标题两种字体。
用户明确要求的方向:标题鸿蒙、正文思源宋、内容块楷体、西文另选一款。 前三条现状已满足,故本次不改;重点是西文与目录这两处真正的问题。
5d59aa1
boxes.cls
fontupper=\fzkai
Cochineal-Roman
LMMono10-Regular
「标题一会儿黑体一会儿什么体」的真正来源不是 \setmainfont,而是 \hm 的定义:
% fonts.tex:343 \def\hm{\CJKfamily{OUCHM}} % 纯 xeCJK 中文字族,管不到数字和拉丁字母
而标题编号 1.、3.1 是阿拉伯数字 → 被判西文 → 走 \setmainfont。于是:
1.
3.1
这是一个很好用的 LaTex 模板
LaTex
修法:本模板内重定义 \hm 为 \hmlatin\CJKfamily{OUCHM},中西文一起切。
\hmlatin\CJKfamily{OUCHM}
中途走过弯路:先在 \ctexset 的每个 format 里补 \hmlatin。虽然标题好了,但封面、摘要、目录标题、文本框标题各漏一次(实测漏 4 处)。确认「在调用点逐个补必然漏」之后改回源头解决。
\ctexset
format
\hmlatin
不动 ../fonts.tex 的 \hm:幻灯片和简历也在用,它们没有标题混西文的问题,全局改会外溢。
../fonts.tex
\cftsecfont 等三条只管条目文字,页码走 \cft*pagefont。不显式清掉的话,目录里页码比标题还粗、一眼看过去页码最抢眼。两组共 6 条一起设 \normalfont。
\cftsecfont
\cft*pagefont
\normalfont
\verb|Illuminate\Foundation\Http\Kernel| 是 35 字符不可断串,内容块内宽 371pt 塞不下。
\verb|Illuminate\Foundation\Http\Kernel|
试过无效的:
\emergencystretch
\sloppy
有效但不采用的:
\seqsplit
lmmonoltcond
结论:保留。badness 1231 属轻微(10000 才严重),渲染只是行末留白略多。日志里看到这 3 个属预期,不是回归。
pymupdf 提取字体分布,两侧完全一致:
Cochineal-Roman 782 OUCSerif-Regular 143 LMMono10-Regular 98 OUCKai-Regular 33 HarmonyOS_Sans_SC_Bold 22 HarmonyOS_Sans_Bold 14 OUCSerif-Bold 8 FontAwesome 5 HarmonyOS_Sans_SC 3 ZhuqueFangsong 2 OUCSans-Regular 2 CMSY10 1 CMEX10 1
标题逐页核对(中西文双档均属鸿蒙):
p1 封面 HarmonyOS_Sans_SC_Bold「这是一个很好用的」+ HarmonyOS_Sans_Bold「LaTex」 p2 目录 HarmonyOS_Sans_SC_Bold「目录」 p5 摘要 HarmonyOS_Sans_SC_Bold + HarmonyOS_Sans_Bold「LaTex」 p6 正文 HarmonyOS_Sans_Bold「1.」+ HarmonyOS_Sans_SC_Bold「准备工作」 p10 正文 HarmonyOS_Sans_Bold「8.」+ HarmonyOS_Sans_SC_Bold「图标」
\fzzdx
\fzfs
fonttitle=\hm
HarmonyOS_Sans_SC
report.tex 第 52/58 行原文说「英文字体默认使用鸿蒙」,改后已不准确,重写为 Cochineal + Latin Modern Mono 的实际状况,并说明标题编号统一的原因。
report.tex
No dependencies set.
The note is not visible to the blocked user.
科技报告模板字体调整:西文改衬线、目录条目统一、代码换真等宽
问题现象
用户反馈:「字体不太好看,标题一会黑体一会什么体的」。
用 pymupdf 提取
report.pdf的渲染文本,实际用到的字体如下:HarmonyOS_Sans_SC_BoldOUCSerif-RegularOUCKai-RegularHarmonyOS_SansHarmonyOS_Sans_Bold+ 标题OUCSerif-Bold\ttfamily)HarmonyOS_Sans根因
cls/font.cls:52把\setmainfont设成了 HarmonyOS Sans:这是从旧版(方正系列)继承下来的设置。旧版中文默认是方正书宋、西文是鸿蒙,两者本来也不搭;
后来中文换成了思源宋体(衬线),西文却还是鸿蒙(无衬线),反差比旧版更明显。
\setmainfont是西文字体的总开关,同时也是:\ttfamily没单独指定时,等宽位的回退目标\setmainfont;而标题文字是中文,走
\setCJKmainfont。这就是同一条目录里字体分裂的原因。改动方案
西文正文改 Cochineal(
fonts/cochineal/,Minion 风格,OFL 1.1)fonts.tex已登记,简历模板在用\setsansfont保持鸿蒙 —— 标题用\hm(CJK 族名 OUCHM)来切,西文 sans 位仍是鸿蒙。标题的中西文都还是鸿蒙,与正文区分得开。
\setmonofont与\setCJKmonofont换成真等宽lmmono(Latin Modern Mono,TeX Live 自带),中文用思源黑体目录条目字体统一 —— 加了
\ttfamily那类隐性回退之后,还要显式把目录条目的西文编号也指到正文西文字体,避免编号与标题两种字体。
验收标准
备注
用户明确要求的方向:标题鸿蒙、正文思源宋、内容块楷体、西文另选一款。
前三条现状已满足,故本次不改;重点是西文与目录这两处真正的问题。
已实现并验证,提交
5d59aa1用户需求与落点对照
HarmonyOS_Sans_SC_Bold(中文)+HarmonyOS_Sans_Bold(西文)\setCJKmainfontOUCSerif-Regular/OUCSerif-Boldboxes.cls的fontupper=\fzkaiOUCKai-Regular\setmainfontCochineal-Roman(Minfo 风格衬线,OFL 1.1)\setmonofontLMMono10-Regular(真等宽)根因:
\hm只管中文「标题一会儿黑体一会儿什么体」的真正来源不是
\setmainfont,而是\hm的定义:而标题编号
1.、3.1是阿拉伯数字 → 被判西文 → 走\setmainfont。于是:这是一个很好用的 LaTex 模板:中文鸿蒙 +LaTex衬线修法:本模板内重定义
\hm为\hmlatin\CJKfamily{OUCHM},中西文一起切。中途走过弯路:先在
\ctexset的每个format里补\hmlatin。虽然标题好了,但封面、摘要、目录标题、文本框标题各漏一次(实测漏 4 处)。确认「在调用点逐个补必然漏」之后改回源头解决。不动
../fonts.tex的\hm:幻灯片和简历也在用,它们没有标题混西文的问题,全局改会外溢。目录页码单独处理
\cftsecfont等三条只管条目文字,页码走\cft*pagefont。不显式清掉的话,目录里页码比标题还粗、一眼看过去页码最抢眼。两组共 6 条一起设\normalfont。内容块 3 个 Underfull:保留,不修
\verb|Illuminate\Foundation\Http\Kernel|是 35 字符不可断串,内容块内宽 371pt 塞不下。试过无效的:
\emergencystretch2em / 10em —— 无效。不是额度不够,是这行没有足够可拉伸的 glue\sloppy—— 更差,badness 1231 → 3590有效但不采用的:
\seqsplit—— 归零,但任意字符处断行,代码路径被切两段lmmonoltcond—— 归零,但压缩可读性结论:保留。badness 1231 属轻微(10000 才严重),渲染只是行末留白略多。日志里看到这 3 个属预期,不是回归。
验证:两套 TeX Live 各两遍,逐字同数
pymupdf 提取字体分布,两侧完全一致:
标题逐页核对(中西文双档均属鸿蒙):
三处少量命中已逐个查清,都不是回归
\fzzdx/\fzfs的示例文字fonttitle=\hm,改后已是HarmonyOS_Sans+HarmonyOS_Sans_SC,中西文都属鸿蒙附带修正
report.tex第 52/58 行原文说「英文字体默认使用鸿蒙」,改后已不准确,重写为 Cochineal + Latin Modern Mono 的实际状况,并说明标题编号统一的原因。