laoyang 93b03c8a78 试卷字体统一为思源宋体 #20
用户要求:「试卷的字体,需要改一下,全部都用思源宋体就可以了。」

pymupdf 提取两份成品 PDF 定位到四类需要统一的字体:

  试卷题型示例(6 页)            参考答案与评分标准示例(3 页)
  OUCSerif-Regular 203 中文        OUCSerif-Regular 333 中文
  TeXGyreTermes-Regular 133 西文   TeXGyreTermes-Regular 197 西文
  TeXGyreTermes-Bold 85 题号分值   OUCSans-Regular 37 黑体小标题
  OUCSerif-Bold 81 中文加粗         CMR10/CMMI10/CMSY10 49 数学公式
  OUCKai-Regular 25 卷头与成绩表    TeXGyreTermes-Bold 21 数字

一、西文与数字:Termes → 思源宋体(oucexam.sty / ouckey.sty)

先在包里用 \newfontfamily 登记 \OUCLatinSerif / \OUCLatinSerifBold
(四个档位全给,斜体指回 Regular —— 思源宋体没有真斜体),再把
\tnr / \tnrb / \sunfont 都 \let 过去。

⚠️ 只做这一步**不够**,这点踩了一轮:模板里大量文字根本没走 \tnr,
而是走 \setmainfont(默认西文族)——\textbf{learning outcome} 的裸西文、
页脚的页码与总页数、任何 \selectfont 之后的裸 ASCII。
第一轮只 \let 时,PDF 里仍残留 22 个 TeXGyreTermes span:
页脚 6 个页码 + 6 个总页数 + 第 4 页的 A./B./C./D. 与 learning outcome 等。
⇒ 必须连 \setmainfont / \setsansfont 一起指到 OUCSerif。

二、卷头与成绩表题号:霞鹜文楷 → 思源宋体(oucexam.sty)

\kh 与 \scoretable 用 \kaiti。包里 \let\kaiti\songti 一次性收口,
不动 ../fonts.tex 的 \def\kaiti —— 别的模板还要用楷体。

三、答案卷黑体小标题:思源黑体 → 思源宋体(ouckey.sty)

\heiti 共 37 处(卷头大标题与各节小标题)。同样 \let\heiti\songti。

四、数学公式:保持不动

$x$ / $\dfrac{1}{45}\sum f_i x_i$ 等 49 处仍走 Computer Modern。
思源宋体没有 MATH 表(实测只有 GSUB/GPOS),不能作数学字体;
强行塞进正文字体会破坏斜体变量、正体数字、运算符间距。用户已确认。

五、装订线虚线:连字符排字 → 用线画(oucexam.sty)

原卷那 6 段竖虚线是 18bp Times 连字符排出来的。换成思源宋体后连字符
每个宽 0.346 em(Termes 0.333),每串会长 4~7bp,破坏"复刻原卷长度"。
⇒ 改为几何画的短横线段,长度锁死。实测原卷(720dpi 逐笔画测量):
  单个连字符笔画 长 4.40bp、粗 1.10bp、x 中心 51.60bp
  相邻笔画步距 6.00bp
新增 \ouc@dashseg{起点y}{笔画数},六段坐标与笔画数逐段照抄原卷
(含原卷被白底遮断成 13+3 两截的那一段)。
⚠️ \newcommand 必须定义在 \ouc@dobindstrip 外面,否则每次 shipout
重新定义,第二页起报 already defined。
⚠️ y 坐标不能写 \dimexpr#1bp+\i*6bp —— TikZ 坐标解析器不认小数 +
\dimexpr 组合,报 Illegal unit of measure。要先 \pgfmathsetmacro。

六、直引号归入 CJK(ouckey.sty)

答案卷正文用 ASCII 直引号 "" 表示中文引号(32 处)。U+0022 在
Basic Latin,xeCJK 判为西文 ⇒ 引号走 \setmainfont,与两侧汉字不同字体,
并挤压出 Overfull(第 88 行 +8.07pt)。
\xeCJKDeclareCharClass{CJK}{"0022} 归位后解决。
⚠️ 不在 fonts.tex 里改:那里全库共用,会让正文真正的英文引号(代码
   片段 "hello world")也变全角。

七、Overfull 的修法:改源码断行,不调参数(ouckey.sty 留有完整记录)

换字体后 \keyitem{3}{4} 那段 Overfull 2.61pt,实际压出版心
(最右 527.01bp,版心止于 524.41)。试过并确认**全部无效**的五种:
  · \emergencystretch 1.5em —— 本行没有弹性胶可拉,无从施展
  · \tolerance 3000 —— 不是不满意断点,是没有更早的合法断点
  · PunctStyle=kaiming —— 能消 Overfull,但标点悬挂探出版心 6.5bp
  · PunctStyle=quanjiao —— 同样探出 8bp
    (xeCJK 这几个 PunctStyle 做的是"标点悬挂"不是"标点压缩",
      指望它消 Overfull 必翻车)
  · \rightskip 0pt plus 6bp(含 \AtBeginDocument 版)—— 6bp 远小于
    需要的 150bp,TeX 仍选"撑破"这个解
正解:第 124 行句号「。」后加 \\。分项给分的答案本来就该一句一行,
读者靠句号扫分点 —— 既解决排版,又让内容结构更清楚。

验证(两套环境各跑,逐项同数)

  WSL / TeX Live 2025    试卷 rc=0 err=0 over=0 6页
                         答案卷 rc=0 err=0 over=0 3页
  Windows / TeX Live 2022 试卷 rc=0 err=0 over=0 6页
                         答案卷 rc=0 err=0 over=0 3页

pymupdf 提取字体分布:

  试卷题型示例      OUCSerif-Regular 291 + OUCSerif-Bold 70
                    → 非宋体文字字体:无
  参考答案示例      OUCSerif-Regular 235 + OUCSerif-Bold 53
                    + CMR10/CMMI10/CMSY10/CMMI7/CMEX10(数学,保留)
                    → 非宋体文字字体:无

几何核对(逐 span 比对,均与基线一致或更优):
  · 成绩表 17 栏逐字符坐标与基线**完全相同**(硬编码坐标,不受字体影响)
  · 装订线 96 笔全部绘出:x 49.40~53.60(宽 4.40bp)、步距 6.00bp,
    六段位置与原卷实测一致
  · 三页最右墨迹均为 524.41bp,与版心严丝合缝,无越界
  · 试卷 6 页最右最大 523.33bp(第 4 页 \mtpair 的 44% 栏宽设计,
    基线同位置同样数值,非本次引入)

涉及文件:
  试卷/oucexam.sty                 默认族、西文字族、\kaiti、装订线虚线
  试卷/ouckey.sty                  默认族、西文字族、\heiti、直引号、踩坑记录
  试卷/参考答案与评分标准示例.tex  第 124 行句号后加断行
2026-10-29 21:29:15 +08:00
2026-10-29 12:03:02 +08:00
2026-10-22 08:15:07 +00:00

ouc_latex_template

中国海洋大学各类文件 LaTeX 模板。本仓库是本项目唯一的模板维护库,各模板按文档类别分目录存放,互不依赖、可单独编译。

目录

目录 内容 编译入口
试卷/ 期末考试试卷、参考答案及评分标准两套模板 试卷题型示例.tex、参考答案与评分标准示例.tex
试卷归档封面/ 信息科学与工程学部试卷归档封面(理论课) 试卷归档封面.tex
试卷归档目录/ 信息科学与工程学部试卷归档目录(理论课,12 项核对清单) 试卷归档目录.tex
年度考核登记表/ 教职工年度考核登记表 年度考核登记表.tex
劳务发放说明表/ 劳务发放说明表 劳务发放说明表.tex
特殊事项说明表/ 报销用特殊事项说明表(事项描述 + 三级签字审批) 特殊事项说明表.tex
课程执行大纲/ 本科课程教学执行大纲 课程执行大纲.tex
课程教学日历/ 学校通用版课程教学日历(理论课程)(附件3,16 周日历表) 课程教学日历.tex
成绩构成说明/ 成绩构成说明(理论课/实验课比例分解表 + 教师签字栏) 成绩构成说明.tex
幻灯片/ 演示文稿(beamer 主题,海大配色) slides.tex
科技报告/ 科技报告、实验讲义、说明文档 report.tex
简历/ 个人简历(中文,A4 两栏式,含圆形头像与分区条目) 简历.tex

编译

全部模板都必须用 XeLaTeX(fontspec + xeCJK),pdflatex 编译不过:

cd 幻灯片
xelatex slides.tex
xelatex slides.tex        # 跑两遍,第二遍才能取到正确的目录、交叉引用与总页数

目录名含中文不影响编译(已实测 12 个模板目录在中文目录下零报错编译通过)。

说明

  • 字体单一来源:全库字体集中在根目录 fonts/,由 fonts.tex 统一加载。十二个模板通过 \input{../fonts.tex} 取字体,不自带字体、不依赖系统字体——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。
  • 全部开源可商用:无方正、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、无微软雅黑。用的是思源宋体/黑体、霞鹜文楷、朱雀仿宋、TeX Gyre Termes、Cochineal、鸿蒙 HarmonyOS Sans(各字体授权见 fonts/LICENSE,来源与字符集见 fonts/README.md)。
  • 每个子目录自包含:样式文件(.sty / .cls)、图片都在各目录内,编译时不需要额外的宏包搜索路径;只有字体是共享的上层目录。
  • 各目录的 README.md 写明该模板的用法、可改参数、版式数据来源与书写注意事项,改之前先看。
  • 示例内容全部虚构:为了让人一眼看出排版效果,模板里填的是一整套连贯的假想数据(虚构教师「张远航」、虚构课程《数字逻辑》2025 秋、虚构的论文 / 专利 / 项目 / 获奖),不是满篇 ×。这些内容不含任何真人信息、不含真题,纯粹是为了让版式跑起来有真实感,使用时整体替换成自己的内容即可。
    • 跨模板虚构设定是统一的:教学日历、成绩构成说明、试卷归档封面、试卷都对应《数字逻辑》2025 秋学期;简历里的论文 / 专利 / 项目 / 获奖属于同一位虚构人物。
    • 一眼可辨的假数据特征:DOI 统一 10.9999/…、专利号统一 ZL209999…、软著登记号 2024SR99999…、手机号 138 0000 0000、邮箱用 example.net。
    • 少数必须留空让人手填的位置(签字、日期、评语栏)仍然是空白或 ×,这类不能编——编了就分不清哪儿该改了。

字体

目录 字体 上游 授权
fonts/ouc-serif/ OUC Serif(宋体) 思源宋体 SC 的 GB2312 子集 SIL OFL 1.1
fonts/ouc-sans/ OUC Sans(黑体) 思源黑体 SC 的 GB2312 子集 SIL OFL 1.1
fonts/ouc-kai/ OUC Kai(楷体) 霞鹜文楷的 GB2312 子集 SIL OFL 1.1
fonts/zhuque-fangsong/ 朱雀仿宋(仿宋) 朱雀仿宋 SIL OFL 1.1
fonts/tex-gyre-termes/ TeX Gyre Termes(西文,全库默认) Times New Roman 度量兼容替代 GUST Font License
fonts/cochineal/ Cochineal(西文,仅 简历/ 用) Minion 风格,Michael Sharpe SIL OFL 1.1
fonts/harmonyos-sans/ HarmonyOS Sans(幻灯片/科技报告) 华为 华为官方允许免费商用

合计约 50 MB(改造前 141 MB,见 fonts/README.md 第五节)。

子集字体已按 OFL §3 改名(Source / LXGW 是上游的 Reserved Font Name,裁剪即构成修改版),并保留了 OFL 声明。 用本模板编译出的文档不受这些字体授权约束,版权归作者本人。

历史沿革

幻灯片/ 与 科技报告/ 此前分别维护在两个独立仓库(ouc-slide-latex-template、ouc-report-latex-template),2026-10 起并入本仓库统一维护,两个旧仓库不再更新。迁入时保留了原有目录结构、字体与图片资源,旧仓库的提交历史留在原仓库中。

S
Description
中国海洋大学各类文件latex模板
Readme Apache-2.0
111 MiB
Languages
TeX 97.6%
ObjectScript 1.3%
Shell 1.1%