字体统一:建公共字体目录,全部改用开源可商用字体 (#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
+120
View File
@@ -0,0 +1,120 @@
# 试卷归档封面 —— 信息科学与工程学部试卷归档封面(理论课)
信息科学与工程学部**试卷归档封面**的 XeLaTeX 模板。原文件是学院/学部下发的
`.doc` 表格,本目录把它做成可直接编译的 LaTeX 版。
> **改名说明**:原文件名为「附件1:信息科学与工程学院试卷封面(理论课)」,
> 内文标题写的是「信息科学与工程学院试卷」。按现行建制与文档实际用途,
> 已统一改为 **学部 + 归档封面**:目录名、文件名、内文标题三处同步。
> 与 [`试卷/`](../试卷/) 的区别:`试卷/` 是**试卷正文 + 参考答案**(学校专用
> 195×270mm 试卷纸、装订栏、成绩表);本目录是**随卷归档的封面单页**
> (A4、11 行两列表单)。两者用途不同,不是同一份文件的两个版本。
## 文件
| 文件 | 说明 |
|---|---|
| `oucksfm.sty` | 版式包。A4、表宽 170mm、11 行固定行高,所有尺寸已注明换算过程 |
| `试卷归档封面.tex` | 填写入口,【第 1 节】改课程信息即可 |
| `试卷归档封面.pdf` | 成品样张 |
## 编译
```bash
xelatex 试卷归档封面.tex
```
必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
本模板自包含,不依赖任何图片。
## 填表
只改 `试卷归档封面.tex` 的【第 1 节】:
```latex
\newcommand{\sfmyear} {\ph{××××}年} % 学年
\newcommand{\sfmterm} {\ph{×}季学期} % 学期
\newcommand{\sfmcno} {080502101231} % 课程号(纯数字,14pt)
\newcommand{\sfmsno} {25252029} % 选课号(纯数字,14pt)
\newcommand{\sfmcourse}{\ph{××××}} % 考试课程名称
\newcommand{\sfmtype} {\ph{×××}} % 课程类型
\newcommand{\sfmmajor}{...} % 面向专业(多个用、隔开)
\newcommand{\sfmgrade}{\ph{××××}} % 面向年级
\newcommand{\sfmcount}{\ph{××}} % 试卷份数
\newcommand{\sfmteacher}{\ph{×××}} % 授课教师
\newcommand{\sfmdate}{...} % 日期
```
填真实内容后把 `\ph{...}` 整个换掉,不要留下 `×`。
## 版式参数
全部照原 `.doc` 实测值,未做主观调整:
| 项目 | 值 | 来源 |
|---|---|---|
| 纸张 | A4 210×297mm | `pgSz` |
| 页边距 | 左右 20mm、上下 25.01mm | `pgMar` 56.7 / 70.9 pt |
| 表宽 | 170mm(= 版心宽) | `tblW` 100% |
| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位)|
| 单元格内边距 | 左右 1.4993mm、上下 0 | `tblCellMar` 85 twips |
| 列宽 | 51mm + 119mm(30% : 70%) | `col_widths_pct` |
| 标题 | 黑体 18pt 加粗居中 | `w:sz=36` + `w:b` |
| 左列标签 | 黑体 18pt | `w:sz=36` |
| 右列值 | 18pt(学年/学期)/16pt(多数)/14pt(课程号、选课号) | `w:sz=36/32/28` |
| 行高 | 11 行固定高,合计 185.95mm | 各行 `trHeight` + `hRule=exact` |
实测校验(pymupdf 读 PDF):
```
表格 左=20.0mm 右=189.91mm 宽=169.9mm ← 应为 170mm ✓
行高 15.19/15.18/15.54/14.66/14.75/15.18/33.02/15.19/18.80/15.19/15.19 mm
表格总高 187.89mm ← 含线宽与取整,与 185.95+线宽 吻合
标题 宽 94.89mm,单行不折(版心 170mm,余量充足)
```
## 三个坑(改之前先看)
### 1. `×` 占位符曾跑到 Times New Roman(已在公共字体包根治)
xeCJK 按 Unicode 区段分类,`×`(U+00D7)落在 Latin-1,会被判成**西文**,
交给 fontspec 的西文字体(Termes / Times)。`\heiti` / `\fangsong` 只切
CJK 字体族,**管不到它** —— 包一层是没用的。TNR 的 × 宽度与汉字不一致,
混排时基线也偏。
现在这行已上移到仓库公共字体包 [`../fonts.tex`](../fonts.tex),**全局生效**:
```latex
\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号
\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号
\xeCJKDeclareCharClass{CJK}{"25A1} % □ 方框(勾选框)
```
本模板不再需要自己声明。
> ✅ [`年度考核登记表/`](../年度考核登记表/) 也有同样问题,**已随本次改造一并修好**
> (原先那条注释说能修,但实测 PDF 里 × 仍落在 TNR —— 因为注释在、声明也写了,
> 却没有真正作用到字符类)。现在已经实测确认:10 处 `×` 全部落在 OUC Sans 上。
### 2. 字体全部来自公共字体包
本模板原先用 SimHei / SimSun / FangSong + `AutoFakeBold` 描边,换台机器
(尤其 Linux/macOS)就编不出来,而且这些字体都不允许随仓库分发。现改为
`\input{../fonts.tex}`,字体文件在 `../fonts/` 下,来源与授权见
[`../fonts/README.md`](../fonts/README.md)。
### 3. `\linespread` 会悄悄放大行高
ctex 默认 `\linespread` 约为 **1.3**,它会把 `\fontsize{18}{21.6}` 里的
21.6 pt 行距放大到 **28 pt 以上**,逐行累积后整张表会顶出页面。
`oucksfm.sty` 的解法是在**每个** `\fontsize` 之后紧跟 `\linespread{1}\relax`,
并且在 `\AtBeginDocument` 之后再设一次(ctex 会在 `\begin{document}` 时
把 `\linespread` 重新设回 1.3,只在导言区设是无效的):
```latex
\AtBeginDocument{\linespread{1}\selectfont}
```
没有这一步,表高会比原卷高出一大截。
+274
View File
@@ -0,0 +1,274 @@
%======================================================================
% oucksfm.sty — 信息科学与工程学部 试卷归档封面(理论课)版式包
%
% 依据:附件1:信息科学与工程学院试卷封面(理论课).doc
% (SynologyDrive/授课/数字逻辑/2025/归档/)
% 原名与内文标题写的是「学院」,按现行建制改为「学部」,
% 模板标题相应为「信息科学与工程学部试卷归档封面」。
% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算:
% pt → mm : mm = pt / 72 * 25.4
% twips → mm : mm = twips / 1440 * 25.4
% w:sz : 半磅值,÷ 2 即 pt
%
% 用法见同目录 试卷归档封面.tex,说明见 README.md
%======================================================================
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{oucksfm}[2026/10/26 v1.0 OUC exam archive cover sheet]
\RequirePackage{geometry}
\RequirePackage{fontspec}
\RequirePackage{xeCJK}
\RequirePackage{tabularray}
%======================================================================
% 1. 页面与版心
%
% 原 .doc sectPr:
% pgSz A4(595.3 × 841.9 pt = 210.0 × 297.0 mm)
% pgMar top/bottom 70.9 pt = 25.01 mm
% left/right 56.7 pt = 20.00 mm
% header 42.55 pt = 15.01 mm / footer 49.6 pt = 17.50 mm
%
% 表宽 tblW = 100%(w:type="pct" w:w="5000"),即铺满版心:
% 版心宽 = 210 − 2×20.00 = 170.00 mm
%
% ⇒ 这里让 totalwidth 恰等于 170mm:
% · 表格天然与版心同宽,编译不刷 Overfull \hbox
% · 表格在纸面上的绝对位置与 Word 完全一致(左右各 20mm)
%======================================================================
\geometry{
paperwidth = 210mm,
paperheight = 297mm,
totalwidth = 170mm, % = 表宽,精确
hmarginratio = 1:1, % 左右各 20mm
top = 25.01mm,
bottom = 25.01mm,
headheight = 0pt,
headsep = 0pt,
footskip = 17.50mm,
}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt}
\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码
%======================================================================
% 2. 字体与字号
%
% 表外标题 黑体 18pt 加粗(w:sz=36 + w:b),jc=center
% 左列标签 黑体 18pt (w:sz=36,全部 11 行一致)
% 右列值 黑体 18pt (w:sz=36)—— 学年 / 学期
% 黑体 16pt (w:sz=32)—— 考试课程名称 / 课程类型 /
% 面向专业 / 面向年级 / 试卷份数 /
% 授课教师 / 日期
% 黑体 14pt (w:sz=28)—— 课程号 / 选课号(纯数字,字号小一档)
%
% ⚠️ 全文只有黑体一种字体,没有宋体/仿宋混排,比另两份表单简单。
%
% 字体全部来自仓库公共字体包 ../oucfonts.sty(文件在 ../fonts/ 下)。
% 旧版这里写的是系统字体的 SimHei / SimSun / FangSong + AutoFakeBold,
% 换台机器(尤其 Linux/macOS)就编不出来。现已全部换成随仓库分发的
% 开源字体,并且粗体用字体自带的真粗体、不再算法描边。
%======================================================================
\input{../fonts.tex}
%----------------------------------------------------------------------
% ⚠️⚠️⚠️【最要命的一条,与 ouclw.sty 同源】
% ctex 默认 \linespread 约 1.3,会把 \fontsize{18}{21.6} 的 21.6pt
% 行距放大成 28pt 以上。
%
% \fontsize 的第二个参数【本来是】用来设 \baselineskip 的,但
% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread 归 1。
% 这一步不能省,也必须在 \AtBeginDocument 之后再设一次
% (ctex 在 begin document 时会重设)。
%----------------------------------------------------------------------
\newcommand{\sfmbodyfont}{%
\linespread{1}\relax
\fontsize{18}{21.6}\selectfont}
% 三档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致)
\newcommand{\sfmbigfont}{\linespread{1}\relax\fontsize{18}{21.6}\selectfont}
\newcommand{\sfmmidfont}{\linespread{1}\relax\fontsize{16}{19.2}\selectfont}
\newcommand{\sfmsmlfont}{\linespread{1}\relax\fontsize{14}{16.8}\selectfont}
%----------------------------------------------------------------------
% ⚠️ xeCJK 陷阱:局部字体切换命令若紧邻 \par(或落在段落末尾),段末的
% 字体状态会"溢出"到后面段落。故局部切换一律用带 \normalfont 收尾的包装。
%----------------------------------------------------------------------
\newcommand{\SFMHT}[1]{{\heiti #1\normalfont}}
%----------------------------------------------------------------------
% ⚠️⚠️⚠️【「×」占位符的坑 —— 在 年度考核登记表/ 里踩过,那里只是绕过去了,
% 这里做了根治】
%
% 现象:写 {\heiti ×××} 后编译,PDF 里这些 × 实际用的是
% Times New Roman(pymupdf 读 span 的 font=TimesNewRomanPSMT),
% 不是黑体。§ 29 个 × 撑不满预期宽度,跟汉字混排时基线也偏。
%
% 原因:xeCJK 按 Unicode 区段分类。「×」是 U+00D7,落在 Latin-1 补充区,
% xeCJK 把它判成【西文字符】⇒ 交给 fontspec 的西文字体(TNR)。
% \heiti / \fangsong 只切换 CJK 字体,对这个字符【不起作用】。
% 所以 {\fangsong ××} 这种写法看着像修好了,实际并没有
% (年度考核登记表/ 的 PDF 里 × 至今仍是 TNR)。
%
% 正解:把 U+00D7 显式声明为 CJK 字符类,让它回到 CJK 字体族,
% \heiti / \fangsong 才能真正管到它。全角宽度也就与汉字一致了。
%
% ⚠️ 这条只在本包内生效,不影响其它模板(年度考核登记表 若也要修,
% 把这两行照抄过去即可)。
%----------------------------------------------------------------------
\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号 → 归 CJK,跟着 \heiti/\fangsong 走
\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号 → 归 CJK(学年区间「2025—2026」用得上)
%======================================================================
% 3. 列的宽度模型
%
% 原 .doc tblGrid(2 个网格列,col_widths_pct = [30, 70]):
% c1 = 170 × 30% = 51.000 mm
% c2 = 170 × 70% = 119.000 mm
%
% cellMar:left/right = 85 twips = 1.4993 mm,top/bottom = 0
% 边框 :w:sz = 4(单位 1/8 pt)⇒ 0.5 pt = 0.1764 mm
%
%----------------------------------------------------------------------
% ⚠️ 与 ouclw.sty 一样,这里可以如实还原内边距(最窄列 51mm 远宽于两倍
% 内边距 3.00mm,不像年度考核表那样被极窄列逼着取 colsep=0)。
%
% tabularray 的 colsep 计在每列【左右两侧】,故 2 列共 4×1.4993 = 5.9972mm;
% 竖线 3 根(左边界 + 中间 + 右边界)× 0.1764mm = 0.5292mm。
% 要让 Σwd + 5.9972 + 0.5292 = 170.000,需
% Σwd = 163.4736 mm
% 而 (gridCol − 2×1.4993) 之和为 164.0028 mm,两者差 0.5292 mm 正好是竖线宽,
% 故每列再减 0.5292/2 = 0.2646 mm。
%
% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
% 实测需再微调(见 3.2 的实测标定值),否则一直报
% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。
%======================================================================
\newcommand{\sfmrule}{0.5pt} % 边框粗细(w:sz=4)
\newcommand{\sfmcolsep}{1.4993mm} % 单元格左右内边距(85 twips)
\newlength{\sfmtblw}
\setlength{\sfmtblw}{170mm} % 表宽(含 3 根竖线与 4 处内边距)
%----------------------------------------------------------------------
% 3.1 各列宽(= gridCol − 2×colsep − 竖线分摊的理论值)
% 与 sfmtable 环境里 colspec 的 wd 必须逐字一致。
%----------------------------------------------------------------------
\newcommand{\sfmwa}{47.7368mm} % c1 51.000 − 2.9986 − 0.2646
\newcommand{\sfmwb}{115.7368mm} % c2 119.000 − 2.9986 − 0.2646
%----------------------------------------------------------------------
% 3.2 各列【内容可用宽】
%
% 单列单元格的内容宽 = wd(左右两半 colsep 已被 colspec 扣掉并计入表格宽)。
% 本表全部是不跨列的单列格,没有"合并格回收内边距"的问题(ouclw.sty 的
% \lwspanA / \lwspanB 那类坑在这里不存在)。
%----------------------------------------------------------------------
%======================================================================
% 4. 行高
%
% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast):
% R1 学年 42.55 pt = 15.011 mm
% R2 学期 42.55 pt = 15.011 mm
% R3 课程号 43.55 pt = 15.363 mm
% R4 选课号 41.05 pt = 14.482 mm
% R5 考试课程名称 41.30 pt = 14.570 mm
% R6 课程类型 42.55 pt = 15.011 mm
% R7 面向专业 93.10 pt = 32.844 mm ← 唯一高行,容 5 个专业名折行
% R8 面向年级 42.55 pt = 15.011 mm
% R9 试卷份数 52.80 pt = 18.627 mm
% R10 授课教师 42.55 pt = 15.011 mm
% R11 日期 42.55 pt = 15.011 mm
% ────────────────────────────────────────
% 合计 185.949 mm
%
% ⚠️ Word 的 exact 是"精确等于",内容超了会【被裁掉】。tabularray 的
% ht= 是最小行高(内容多则自动长高),语义更安全。本表各行内容都远
% 小于行高,两者结果相同,故直接写 ht=。
%
% ⚠️ 那几行 42.55 / 43.55 / 41.05 / 41.30 的零头不是随机的:Word 里
% 它们是"字符高 + 段前段后"凑出来的实际测量值,照抄才能与原卷逐行对齐。
%======================================================================
%======================================================================
% 5. 表格环境
%
% ⚠️ 用 tblr 而非 longtblr:本表总高约 186 mm,一页装得下(版心高
% 297 − 2×25.01 = 247 mm),不需要断页。
%
% ⚠️⚠️ colspec 与 row{} 必须字面写在这里,不能先存进宏再展开:
% tabularray 的列类型解析在宏展开之外进行,会报
% "Unexpandable command \xxx inside column type"。
% (所以 3.1 节那些 \sfmwa… 只作文档用,不能拼进 colspec。)
%
% ⚠️ 选项里的宏名一律不带 @:tabularray 解析选项时 @ 不是字母。
%======================================================================
\newenvironment{sfmtable}{%
\par\begingroup
\begin{tblr}[label=none]{
colspec={Q[c,m,wd=47.7368mm] Q[c,m,wd=115.7368mm]},
colsep=1.4993mm, rowsep=0pt, stretch=0,
hline{1-Z}={\sfmrule}, vline{1-Z}={\sfmrule},
row{1}={ht=15.011mm}, row{2}={ht=15.011mm},
row{3}={ht=15.363mm}, row{4}={ht=14.482mm},
row{5}={ht=14.570mm}, row{6}={ht=15.011mm},
row{7}={ht=32.844mm}, row{8}={ht=15.011mm},
row{9}={ht=18.627mm}, row{10}={ht=15.011mm},
row{11}={ht=15.011mm},
}%
}{%
\end{tblr}\par\endgroup}
%======================================================================
% 6. 单元格内容包装
%
% 本表全是单列格,tabularray 的 Q[c,m,wd=…] 已处理好居中与折行,
% 不需要 ouclw.sty 那种定宽 \parbox。这里只提供两个语义化的标签宏,
% 让 .tex 里不必反复写 \SFMHT{}。
%======================================================================
% \sfmlabel{文字} —— 左列标签:黑体 18pt
\newcommand{\sfmlabel}[1]{{\heiti\sfmbigfont #1\normalfont}}
% \sfmval{文字} —— 右列值(16pt,最常用)
\newcommand{\sfmval}[1]{{\heiti\sfmmidfont #1\normalfont}}
% \sfmvalbig{文字} —— 右列值(18pt):学年 / 学期两行
\newcommand{\sfmvalbig}[1]{{\heiti\sfmbigfont #1\normalfont}}
% \sfmvalsmall{文字} —— 右列值(14pt):课程号 / 选课号
\newcommand{\sfmvalsmall}[1]{{\heiti\sfmsmlfont #1\normalfont}}
%======================================================================
% 7. 表外标题
%
% 原 .doc 第 1 段:黑体、加粗、w:sz=36(18pt)、jc=center
%
% 原文标题是「信息科学与工程学院试卷」,按现行建制与文档实际用途已改为
% 「信息科学与工程学部试卷归档封面」
% 实测 18pt 下宽 94.89mm,版心宽 170mm,左右各余约 37mm,单行不折。
% 再加长(比如后面挂"(理论课)")仍有余量,超过 170mm 才会折行。
%
% 标题与表格之间原 .doc 有 3 个空段落(idx 13/14/15),
% 合计 3 × 21.6pt = 64.8pt = 22.86 mm。这里用 \sfmtitleskip 还原。
%======================================================================
\newlength{\sfmtitleskip}
\setlength{\sfmtitleskip}{22.86mm}
\newcommand{\sfmtitle}[1]{%
\par
\begingroup
\centering
{\heiti\bfseries\sfmbigfont #1\par}%
\endgroup
\vspace{\sfmtitleskip}}
%======================================================================
% 8. 表后空行
%
% 原 .doc 表格之后还有一个空段落(idx 212)。
%======================================================================
\newcommand{\sfmtail}{\par\null\par}
\AtBeginDocument{\sfmbodyfont}
\endinput
Binary file not shown.
+121
View File
@@ -0,0 +1,121 @@
%======================================================================
% 中国海洋大学 信息科学与工程学部 试卷归档封面(理论课)
%
% 编译: xelatex 试卷归档封面.tex
%
% 本模板不含真人信息:课程名、课程号、选课号、班级、教师姓名一律用
% × 占位。填表时只改下面【第 1 节】。
%
% 版式来源:SynologyDrive/授课/数字逻辑/2025/归档/
% 附件1:信息科学与工程学院试卷封面(理论课).doc
% (原文件名与内文标题写的是「学院」,现按现行建制改为「学部」)
% 所有尺寸已在 oucksfm.sty 内注明换算过程;要改版式请改 sty。
%
% 与原 .doc 的差异(有意为之):
% · 原文件里的真实课程信息已全部换成 × 占位
% · 单位名「学院」按现行建制改为「学部」,标题相应改为
% 「信息科学与工程学部试卷归档封面」
% · 纸张、边距、表宽、行高、字号、字体一律照原值,未做任何调整
%======================================================================
\documentclass[UTF8,fontset=none]{ctexart}
\usepackage{oucksfm}
%======================================================================
% 1. 表内内容(填表时只改这一段)
%
% ⚠️ 左列标签是学部制式用语,一般不用改;只改右列的值。
%======================================================================
%---- 左列标签(11 个,与学部原表的字一模一样,含字间空格)------------
\newcommand{\sfmyearlabel} {学\quad 年} % 原文件用两个半角空格
\newcommand{\sfmtermlabel} {学\quad 期}
\newcommand{\sfmcnolabel} {课程号}
\newcommand{\sfmsnolabel} {选课号}
\newcommand{\sfmcourselabel}{考试课程名称}
\newcommand{\sfmtypelabel} {课程类型}
\newcommand{\sfmmajorlabel} {面向专业}
\newcommand{\sfmgradelabel} {面向年级}
\newcommand{\sfmcountlabel} {试卷份数}
\newcommand{\sfmteacherlabel}{授课教师}
\newcommand{\sfmdatelabel} {日\quad 期}
%---- 右列的值(填表时改这里)------------------------------------------
%
% ⚠️⚠️【必须看】占位符「×」一律用 \ph{} 包起来,不要裸写 ×。
%
% 原因(在 年度考核登记表/ 里踩过):字体的 ASCII 区段由 fontspec 交给
% 西文字体(这里是 Times New Roman),而「×」U+00D7 属于 Latin-1,
% 会被判成 ASCII ⇒ 用 TNR 的 ×,那是 1em 宽的数学乘号,
% 与汉字的 1em 字宽【不一样】(TNR 的 × 略窄、位置也偏)。
% 结果是一串 × 撑不满预期宽度,与汉字混排时基线也参差。
%
% \ph{} 把它强制交回黑体(全角),宽度才与汉字一致。
% 本表全文黑体,所以用 \heiti 收尾即可。
%
% ⚠️ 填表时把 \ph{×××} 整体替换成真实内容(不要保留 × ):
% 例如 \newcommand{\sfmcourse}{数字逻辑},一行的 \ph 都不要留。
%----------------------------------------------------------------------
\newcommand{\ph}[1]{{\heiti #1\normalfont}}
% 学年。原文件写「2025年」,学期行写「秋季学期」。
% ⚠️ 注意:学部原表是「学年」+「2025年」这种写法,不是「2025—2026」。
% 若学校要求写成区间,改这里即可,行高涨一点不会溢出。
\newcommand{\sfmyear} {\ph{××××}年}
% 学期:秋 / 春,或「秋季学期」「春季学期」
\newcommand{\sfmterm} {\ph{×}季学期}
% 课程号 / 选课号:纯数字,14pt(比其余值小一档,原表如此)
% ⚠️ 纯数字是真正的 ASCII,本来就该用 TNR,所以不用 \ph 包。
\newcommand{\sfmcno} {080502101231}
\newcommand{\sfmsno} {25252029}
% 考试课程名称
\newcommand{\sfmcourse}{\ph{××××}}
% 课程类型:专业课 / 公共基础课 / 通识课 …
\newcommand{\sfmtype} {\ph{×××}}
% 面向专业。多个专业之间用「、」隔开。
% ⚠️⚠️ 这一格是全表唯一的高行(32.844mm),能容 3 行 16pt 文字。
% 专业名超过 3 行会自动把行撑高,整表就顶出版心了——届时请把
% oucksfm.sty 里 row{7} 的 ht 改大,或者把专业名精简。
\newcommand{\sfmmajor}{%
\ph{××××××××}、\ph{××××}、\ph{××××××}、\ph{××××××}、\ph{××××××}}
% 面向年级
\newcommand{\sfmgrade}{\ph{××××}}
% 试卷份数
\newcommand{\sfmcount}{\ph{××}}
% 授课教师
\newcommand{\sfmteacher}{\ph{×××}}
% 日期
\newcommand{\sfmdate}{\ph{××××}年\ph{××}月\ph{××}日星期\ph{×}}
%======================================================================
% 2. 正文
%======================================================================
\begin{document}
\sfmtitle{信息科学与工程学部试卷归档封面}
\begin{sfmtable}
\sfmlabel{\sfmyearlabel} & \sfmvalbig{\sfmyear} \\
\sfmlabel{\sfmtermlabel} & \sfmvalbig{\sfmterm} \\
\sfmlabel{\sfmcnolabel} & \sfmvalsmall{\sfmcno} \\
\sfmlabel{\sfmsnolabel} & \sfmvalsmall{\sfmsno} \\
\sfmlabel{\sfmcourselabel} & \sfmval{\sfmcourse} \\
\sfmlabel{\sfmtypelabel} & \sfmval{\sfmtype} \\
\sfmlabel{\sfmmajorlabel} & \sfmval{\sfmmajor} \\
\sfmlabel{\sfmgradelabel} & \sfmval{\sfmgrade} \\
\sfmlabel{\sfmcountlabel} & \sfmval{\sfmcount} \\
\sfmlabel{\sfmteacherlabel} & \sfmval{\sfmteacher} \\
\sfmlabel{\sfmdatelabel} & \sfmval{\sfmdate} \\
\end{sfmtable}
\sfmtail
\end{document}