Files
ouc_latex_template/年度考核登记表/README.md
T
laoyang 8aa979739a 字体统一:建公共字体目录,全部改用开源可商用字体 (#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%
2026-10-27 00:43:14 +08:00

7.5 KiB
Raw Blame History

年度考核登记表 — 中国海洋大学 教职工年度考核登记表(LaTeX 版)

把学校下发的 Word 版《中国海洋大学教职工年度考核登记表》复刻为 LaTeX 模板, 版式与原 .docx 逐项对齐,表格里不含任何真人信息(姓名/职工号/出生年月/ 单位/岗位一律 × 占位)。

文件

文件 说明
年度考核登记表.tex 主文件。填表只改第 1 节(基本信息)与 \khsummary(年度总结)
ouckhtb.sty 版式包。页面/字体/列宽/行高/全部尺寸都写在这里,附换算注释

编译

xelatex 年度考核登记表.tex
xelatex 年度考核登记表.tex     # 跑两遍,第二遍取到正确页码

需要 XeLaTeX(用 fontspec + xeCJK),并安装: ctex、geometry、fontspec、xeCJK、tabularray。

字体不需要安装 —— 全部来自仓库公共字体包 ../fonts/(由 ../fonts.tex 加载), 详见 ../fonts/README.md。不再依赖系统里的宋体/黑体/仿宋。

实测环境:TeX Live 2022 + tabularray 2022A。用 LuaLaTeX 理论上也行,但未验证。

产出 2 页、A4、正反面打印正好。

改内容

基本信息

\khtbyear{2025}                      % 表头“×××× 年度”那一行

\newcommand{\khnum}{0000000}         % 职工号
\newcommand{\khname}{{\fangsong ××}} % 姓名
\newcommand{\khsex}{{\fangsong ×}}   % 性别
\newcommand{\khbirth}{{\fangsong ××××.××}}   % 出生年月
\newcommand{\khdept}{{\fangsong ××××××××}}  % 单位(学部 / 学院)
\newcommand{\khsubdept}{{\fangsong ××××××××}} % 系(研究所、实验室、科室)
\newcommand{\khparty}{{\fangsong ××××}}     % 政治面貌
\newcommand{\khtitle}{{\fangsong ×××}}      % 现专业技术职务
\newcommand{\khpost}{{\fangsong ×××}}       % 所聘岗位

{\fangsong ...} 不能去掉。 占位符 × 是 U+00D7,xeCJK 默认按 Unicode 区段把它判成西文,交给 fontspec 的西文字体(Termes/Times),而那儿的 × 宽度与汉字不一致,几个就能撑破整列。

更好的做法:../fonts.tex 里已经全局加了 \xeCJKDeclareCharClass{CJK}{"00D7},把 × 归入 CJK 字符类 —— 于是它自动按汉字全角宽度排,不必再包 \fangsong 也不会撑破。 这是本次字体改造顺带修掉的老 bug(原注释的修法从未真正生效过)。

年度总结

\newcommand{\khsummary}{%
  第一段……\par
  第二段……\par
  第三段……}

段间用 \par(不要用空行 —— 空行在 \newcommand 参数里会被当成分段但不易数)。 首行自动缩进 2 字,末行自动带「本人签名 / 年 月 日」,都写在 ouckhtb.sty 里。

版式数据来源

所有尺寸都从 .docx 内部的 OOXML 数值换算,不使用目测:

twips → mm :  mm = twips / 1440 × 25.4
twips → pt :  pt = twips / 20          (1 pt = 1/72 in)
w:sz       :  半磅值,÷ 2 即 pt
项 docx 值 LaTeX 值
纸张 11907 × 16840 twips A4(210 × 297 mm)
表宽 tblW 8976 twips 158.33 mm(11 列 + 边框)
11 个 gridCol 1087 283 1221 1047 284 1105 952 600 870 80 1447 见 ouckhtb.sty 第 3.1 节
正文字号 w:sz=28 仿宋 14 pt / 行距 15.6 pt
大标题 w:sz=44,w:spacing=-14 黑体 22 pt / 字距 −0.7 pt
行高 trHeight 412 460 939 1261 1252 1009 556 1258 1258 7.27 / 8.11 / 16.56 / 22.24 / 22.08 / 17.80 / 9.81 / 22.19 / 22.19 mm

页边距为什么不照抄 docx

docx 是左右各 30 mm 版心(150 mm),但表宽 158.33 mm 比它还宽 8.33 mm, Word 是靠 tblPr/jc=center 把这张表“压”进页边距里的。

本模板把页边距改成 (210 − 158.33)/2 = 25.835 mm,使 \textwidth 恰好等于表宽:

  • 表格天然居中,不需要 \leftskip / \centerline 之类的偏移;
  • 表格在纸面上的绝对位置与 Word 完全一致(左右各 25.835 mm);
  • 编译时不会刷 Overfull \hbox。

表外文字(标题、脚注)仍是水平居中,视觉上与 30 mm 版心没有差别。

排版时的四个坑(sty 里都有详细注释)

  1. 合并单元格不折行。 cell{r}{c}={c=n}{c} 的单元类型 {c} 是 LR 模式, 格子里的文字比所跨各列合计更宽时,它不折行,而是把列撑宽、整表超出版心。 实测「系(研究所、实验室、科室)」把表从 448 pt 撑到 559 pt。 → 所以合并格里的文字一律包 \khtbfit{跨度宽宏}{文字}。 单列的 Q[c,m,wd=…] 没有这个问题(超了只是溢出,列宽不变)。

  2. 合并格里的 \hsize 没被重设。 span=10 的格子里 \hsize 仍是整页版心宽, 长文本会按 450 pt 折行、冲出格子。→ 长内容必须用定宽 \parbox(\khtbcell)。

  3. 跨度声明只有 {c=n}{c} 一种写法。 ={c=n}、={n}{c}、={span=n}{c} 都不认,最后那个会报 The key 'tblr-cell-span/span' is unknown。

  4. colspec / row{} 里不能放宏。 tabularray 在宏展开之外解析列类型, 会报 Unexpandable command … inside column type。所以列宽只能字面写死。

另外两个容易忘的:

  • longtblr 默认会把各列按 \textwidth 等比拉伸(tblr 不会),必须写 stretch=0;
  • longtblr 会在续页处印「表 0: (Continued)」,必须用 \DefTblrTemplate 把 caption / capcont / conthead-text / contfoot-text 四个模板全清。

与原 docx 的已知差异

位置 docx 本模板 说明
表头「×××× 年度」 firstLine 缩进 2 字、未设居中 居中 更像原排版疏漏,按意图改居中。想还原就把 \khtbtitle 里的 \centering 换成 \hspace*{2\ccwd}
「师德考核结果」首列 师师德考核结果 师德考核结果 docx 原文首字重复(WPS 竖排遗留),已按正常写法更正
「单位年度考核建议档次」首列 单单位年度考核建议档次 单位年度考核建议档次 同上
单元格内边距 左右各 108 twips(1.905 mm) 0 c10 只有 1.41 mm,比两倍内边距还窄,统一内边距会算出负宽。代价是文字可贴竖线,但全部单元格本就水平居中,观感一致
未勾选框 Wingdings ¨(char 0x00A8) U+25A1 □ Wingdings 在 Linux/macOS 上不可靠。仓库里的仿宋、黑体、宋体都含 □;且 ../fonts.tex 已把 U+25A1 归入 CJK 类,不会再落到不含该字的西文字体上
电子签名图片 内嵌两张手写签名 JPEG 无 模板不含真人信息

校验方法(想改版式时照这个验)

不要靠肉眼看 PDF。用矢量坐标对:

xelatex 年度考核登记表.tex
pdftocairo -svg 年度考核登记表.pdf pg.svg    # 转成 SVG 取精确线条坐标
pdftotext -bbox 年度考核登记表.pdf -          # 取每个字的 xMin/yMin/xMax/yMax

正确结果应当满足:

  • 表格左边界 73.14 pt、右边界 520.91 pt(宽度 447.8 pt ≈ 157.96 mm);
  • 表格所有横线都是 10 段(8 个网格列位置被合并掉,只剩 10 段可见);
  • 页数为 2;
  • grep "Overfull\|too small" 年度考核登记表.log 无输出。

当前状态:零 Overfull、零 Underfull、2 页、表宽 157.96 mm(目标 158.33 mm, 差 0.23%,为消除 0.45 pt 的 Overfull 累积误差而取整所致,肉眼不可辨)。