模板内容填充:全库 × 占位换成完整虚构示例,README 表述同步 #11

把 11 个模板里满篇的 × 换成一套连贯的虚构数据,让样张能看出排版效果。

虚构设定(跨模板统一):
- 数字逻辑 / 2025 秋 / 张远航 / 计算机科学与技术学院,教学日历、成绩构成
  说明、试卷归档封面、试卷四份互相对得上
- 简历:张远航,1985.03,教授博导,论文/专利/项目/获奖全套虚构
- 年度考核:同一人的 2025 年度考核表,年度总结四段写满
- 执行大纲:刻意不套用上面那套(原件就是《信号与线性系统分析》的课,
  强行改课程名会让章节体系、学时分配、思政案例全对不上)

假数据都留肉眼可辨标记:DOI 统一 10.9999/、专利号 ZL209999…、
软著 2024SR99999…、手机 138 0000 0000、邮箱 example.net。
签字/日期/评语栏仍然留空——编了就分不清该改哪儿。

修掉一个既有 bug(填充时才暴露):
年度考核登记表「出生年月」的值从来不显示,连字符都不在 PDF 里。
根因是 tabularray 的 cell{r}{c}={c=n} 里那个 c 是数据行的单元序号、
不是视觉列号,表头三处 c=2 要求该行吃 15 个视觉列而表只有 11 列,
超出部分静默丢弃。迷惑点:写 12 格丢值,写 9 格反而正常。
正解是表头不写 cell{},改用行内 \SetCell[c=n]{c},每行照常写满 11 格。
同时 R0 行原件本就装不下(前六字段 115.76mm,剩 42.20mm 要放
19.68mm 标签 + 17.22mm 值,但列宽被切成 15.31/1.38/25.51),
把标签折两行「出生/年月」解决,列宽一个没改。

README 同步:根 README 与 8 个模板 README 里「一律用 × 占位」的说法
已不成立,统一改为「示例内容全部虚构」,并说明哪些位置仍必须留空。

验证:12 个模板零 error,4 处基线警告未新增;干净副本重编页数一致;
PDF 正文 × 清零;真实信息零泄漏。
This commit is contained in:
2026-10-27 12:50:02 +08:00
parent cc0dfb7257
commit 8984b93ee7
40 changed files with 551 additions and 357 deletions
+49 -14
View File
@@ -2,7 +2,13 @@
把学校下发的 Word 版《中国海洋大学教职工年度考核登记表》复刻为 LaTeX 模板,
版式与原 `.docx` 逐项对齐,**表格里不含任何真人信息**(姓名/职工号/出生年月/
单位/岗位一律 `×` 占位)。
单位/岗位全部是编的)。
> 样张填的是一份**完整的虚构考核表**:张远航(1985.03,信息科学与工程学部
> 计算机科学与技术学院,教授三级,中共党员),2025 年度,年度总结写了
> 思政 / 教学(176 学时)/ 科研(到账 320 万元)/ 人才培养四段。
> 之所以不写成满篇 `×`,是因为这张表**表格密、字数多**,光看叉号判断不出
> 行高会不会被内容撑开。虚构内容能直接看出「写这么多字正好排满 2 页」。
## 文件
@@ -33,19 +39,27 @@ xelatex 年度考核登记表.tex # 跑两遍,第二遍取到正确页码
### 基本信息
```latex
\khtbyear{2025} % 表头“×××× 年度”那一行
\khtbyear{2025} % 表头“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 ×××}} % 所聘岗位
\newcommand{\khname}{{\fangsong 张远航}} % 姓名
\newcommand{\khsex}{{\fangsong 男}} % 性别
\newcommand{\khbirth}{{\fangsong 1985.03}} % 出生年月
\newcommand{\khdept}{{\fangsong 信息科学与工程学部}} % 单位(学部 / 学院)
\newcommand{\khsubdept}{{\fangsong 计算机科学与技术学院}} % 系(研究所、实验室、科室)
\newcommand{\khparty}{{\fangsong 中共党员}} % 政治面貌
\newcommand{\khtitle}{{\fangsong 教授}} % 现专业技术职务
\newcommand{\khpost}{{\fangsong 教授三级}} % 所聘岗位
```
> 上列值是**样张实际用的虚构内容**。职工号 `0000000` 故意留着没编 ——
> 职工号位数各校各单位不等,编一个反而会误导「照这个位数填」。
>
> ⚠️ 「出生年月」的**标签**不是写在 `\khbirth` 里,而是单独的
> `\khbirthlabel`(默认 `出生\par 年月`,折两行)。原因见下文第 0 条:
> 那一格只有 15.31mm,放不下 4 个 14pt 的字(要 19.68mm)。
> 想让标签恢复成一行「出生年月」,值就会重新被挤掉。
> **`{\fangsong ...}` 不能去掉。** 占位符 `×` 是 U+00D7,xeCJK 默认按 Unicode
> 区段把它判成**西文**,交给 fontspec 的西文字体(Termes/Times),而那儿的
> `×` 宽度与汉字不一致,几个就能撑破整列。
@@ -99,9 +113,28 @@ Word 是靠 `tblPr/jc=center` 把这张表“压”进页边距里的。
表外文字(标题、脚注)仍是水平居中,视觉上与 30 mm 版心没有差别。
## 排版时的四个坑(sty 里都有详细注释)
## 排版时的坑(sty 里都有详细注释)
1. **合并单元格不折行。** `cell{r}{c}={c=n}{c}` 的单元类型 `{c}` 是 LR 模式,
0. 🔴 **表头 `cell{r}{c}={c=n}` 会静默丢内容 —— 已全部改成行内 `\SetCell`。**
这是本模板最难查的一个 bug:某个格子的值**整格不显示**,日志零 error 零
warning,光看日志和 PDF 页码完全发现不了。
- 现象:「出生年月」的值一直是空白。用 `××××.××` 占位时也是空白,
所以原版一直没人发现;换成真实内容才暴露。
- 根因:`cell{r}{c}` 里那个 `c` 是**数据行的单元序号**,不是视觉列号。
表头那三处 `c=2` 加起来要求该行吃掉 15 个视觉列,而表只有 11 列,
超出部分被静默丢弃 —— 丢的正好是最后一个值。
- 迷惑点:同一行写 12 格 → 丢值;写 10 格 / 9 格 → **反而显示**
(空缺给了它余量)。所以「格子数对不对」在这里完全不能当判断依据。
- 正解:表头不写 `cell{}`,合并直接标在被合并的那格上:
`\SetCell[c=2]{c} 职工号 & & 0000000 & ...`,每行照常写满 11 格。
- 附带修的:这个表 R0 行本来就装不下 —— 前六个字段已占 115.76mm,
剩 42.20mm 要装「出生年月」标签(19.68mm)+ 值(17.22mm),
但列宽被 `c9=15.31 / c10=1.38 / c11=25.51` 切死,标签占不住 c9
只能整体右移,值就被挤出去。处理是把标签折成两行「出生 / 年月」
(每行 9.84mm 放得下),值回到 c10-c11。**列宽一个都没改。**
1. **合并单元格不折行。** 合并格的单元类型 `{c}` 是 LR 模式,
格子里的文字比所跨各列合计更宽时,它**不折行,而是把列撑宽、整表超出版心**。
实测「系(研究所、实验室、科室)」把表从 448 pt 撑到 559 pt。
→ 所以合并格里的文字一律包 `\khtbfit{跨度宽宏}{文字}`。
@@ -110,8 +143,10 @@ Word 是靠 `tblPr/jc=center` 把这张表“压”进页边距里的。
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`。
3. **跨度声明写法:`cell{r}{c}={c=n}{c}` 与行内 `\SetCell[c=n]{c}` 都要用
`{c=n}{c}` 这一种。** `={c=n}`、`={n}{c}`、`={span=n}{c}` 都不认,最后那个
会报 `The key 'tblr-cell-span/span' is unknown`。
⚠️ 但如第 0 条所述,**跨列请优先用行内 `\SetCell`**,表头 `cell{}` 有丢内容的风险。
4. **`colspec` / `row{}` 里不能放宏。** tabularray 在宏展开之外解析列类型,
会报 `Unexpandable command … inside column type`。所以列宽只能字面写死。
+20 -13
View File
@@ -255,25 +255,32 @@
row{1}={ht=7.27mm}, row{2}={ht=8.11mm}, row{3}={ht=16.56mm},
row{4}={ht=22.24mm}, row{5}={ht=22.08mm}, row{6}={ht=17.80mm},
row{7}={ht=9.81mm}, row{8}={ht=22.19mm}, row{9}={ht=22.19mm},
%---- R0 职工号|值|姓名|值|性别|值|出生年月|值
cell{1}{1}={c=2}{c}, cell{1}{5}={c=2}{c}, cell{1}{10}={c=2}{c},
%---- R1 单位|单位名|系(研究所、实验室、科室)|系名
cell{2}{1}={c=2}{c}, cell{2}{3}={c=3}{c},
cell{2}{6}={c=2}{c}, cell{2}{8}={c=4}{c},
%---- R2 政治面貌|值|现专业技术职务|值|所聘岗位|值
cell{3}{1}={c=2}{c}, cell{3}{4}={c=2}{c},
cell{3}{6}={c=2}{c}, cell{3}{8}={c=3}{c},
%---- R3~R8 竖排标签|内容栏
cell{4}{2}={c=10}{c}, cell{5}{2}={c=10}{c}, cell{6}{2}={c=10}{c},
cell{7}{2}={c=10}{c}, cell{8}{2}={c=10}{c}, cell{9}{2}={c=10}{c},
}%
}{%
\end{longtblr}\par\endgroup}
%======================================================================
% 6. 单元格内容包装(见 3 节结论 c 与 d)
% 6. 单元格内容包装
%
% 统一入口,.tex 里只用下面三个宏,不要直接把长文字写进 & 之间。
% ⚠️⚠️【跨列合并一律在数据行里用行内 \SetCell,不要用表头的 cell{r}{c}】
%
% 这里踩了整整一轮坑,结论留下免得重来。
%
% 原先表头写的是:
% cell{1}{1}={c=2}{c}, cell{1}{5}={c=2}{c}, cell{1}{10}={c=2}{c},
% 数据行按 11 列老老实实写满 12 格,结果 **「出生年月」的值整格消失**,
% 日志零 error 零 warning,光看日志根本发现不了。
%
% 根因:tabularray 的 cell{r}{c}={c=n} 里那个 c 是【数据行的单元序号】,
% 不是视觉列号。三处 c=2 加起来让该行要吃掉 15 个视觉列,而表只有 11 列,
% 超出的部分被静默丢弃 —— 被丢的正好是最后一个值。
% 实测:同一行写 12 格 → 丢值;写 10 格/9 格 → 反而显示(因为空缺让它
% 有余量)。所以「格子数对不对」在这里完全不能当判断依据。
%
% 正解:表头不写 cell{},合并直接标在被合并的那个格子上:
% \SetCell[c=2]{c} 职工号 & & 0000000 & ...
% 每行照常写满 11 格,跨度由行内标记自己声明,不再有隐式吞格。
% 改写后实测:零 error,11 列全值齐在。
%======================================================================
% \khtbfit{跨度宽宏}{内容} —— 定宽、水平居中、可折行
% 例:\khtbfit{\khtbspanC}{系(研究所、实验室、科室)}
Binary file not shown.
+61 -29
View File
@@ -23,21 +23,31 @@
% ⚠️ 占位符“×”必须包 \fangsong:它会被 fontspec 当成 ASCII 交给
% Times New Roman,而 TNR 的 × 是 1em 宽的数学符号(14pt 一格),
% 9 个就是 126pt,撑破所在列。用仿宋(全角)宽度才与汉字一致。
\newcommand{\khname}{{\fangsong ××}} % 姓名(2 字宽)
\newcommand{\khsex}{{\fangsong ×}} % 性别
\newcommand{\khbirth}{{\fangsong ××××.××}} % 出生年月
\newcommand{\khdept}{{\fangsong ××××××××}} % 单位(学部/学院)
\newcommand{\khsubdept}{{\fangsong ××××××××}} % 系(研究所、实验室、科室)
\newcommand{\khparty}{{\fangsong ××××}} % 政治面貌
\newcommand{\khtitle}{{\fangsong ×××}} % 现专业技术职务
\newcommand{\khpost}{{\fangsong ×××}} % 所聘岗位
\newcommand{\khname}{{\fangsong 张远航}} % 姓名(2 字宽)
\newcommand{\khsex}{{\fangsong 男}} % 性别
\newcommand{\khbirth}{{\fangsong 1985.03}} % 出生年月
\newcommand{\khdept}{{\fangsong 信息科学与工程学部}} % 单位(学部/学院)
\newcommand{\khsubdept}{{\fangsong 计算机科学与技术学院}} % 系(研究所、实验室、科室)
\newcommand{\khparty}{{\fangsong 中共党员}} % 政治面貌
\newcommand{\khtitle}{{\fangsong 教授}} % 现专业技术职务
\newcommand{\khpost}{{\fangsong 教授三级}} % 所聘岗位
% 【出生年月】标签的文字。默认折成两行 —— 原因见正文 R0 那行的长注释:
% 一格 15.31mm 放不下 4 个 14pt 的字(要 19.68mm),折两行才不溢出。
\newcommand{\khbirthlabel}{出生\par 年月}
% 年度总结正文。多段之间用 \par 分隔。
\newcommand{\khsummary}{%
本人在思想上始终积极要求进步,……(此处填写年度思想政治表现)。\par
在教学工作中,本年度承担××××等课程的教学任务,……(教学工作情况)。\par
在科研方面,……(科研与项目情况)。\par
在人才培养方面,……(人才培养与团队建设情况)。}
本人坚持以立德树人为根本任务,认真参加学校与学部组织的各项政治学习,
自觉把思政要求融入课堂教学,全年无师德失范情形。\par
教学工作方面,本年度主讲《数字逻辑》《机器学习与海洋应用》两门本科生
课程与《海洋大数据分析》研究生课程,合计 176 学时;指导本科毕业设计
6 人、硕士研究生 5 人;主持校级教研项目 1 项,参编教材 1 部。\par
科研工作方面,主持国家重点研发计划青年科学家项目 1 项、横向课题 1 项,
到账经费 320 万元;以第一或通讯作者发表学术论文 5 篇,其中 SCI 收录 4 篇;
授权发明专利 2 项,登记软件著作权 1 项。\par
人才培养与团队建设方面,协助学院组建海洋信息处理青年团队,指导青年
教师 2 人获校级项目资助;参与学部学科建设与本科培养方案修订工作。}
%======================================================================
% 2. 表外标题
@@ -61,42 +71,64 @@
%======================================================================
\begin{khtbtable}
% ⚠️ 每行都按 11 列写满(10 个 & + 结尾 \\)。
% 跨列合并在格子里用行内 \SetCell[c=n]{c} 声明,**不要**用表头的
% cell{r}{c}。原因见 ouckhtb.sty 第 6 节的长注释 —— 那里踩过坑:
% 用表头 cell{} 会让某个值整格消失,而且零报错。
%---- R0 职工号 / 姓名 / 性别 / 出生年月 -------------------------------
职工号 & & \khnum
& 姓名 & \khtbfit{\khtbspanH}{\khname} & &
& 性别 & \khsex
& 出生年月 & \khtbfit{\khtbspanG}{\khbirth} & \\
% ⚠️ 修了一个既有 bug:这一行「出生年月」的值**原来从来不显示**,
% 原版 PDF 里那一格就是空白(用 ××××.×× 时同样丢,只是没人注意)。
%
% 原因不是合并写错,是原件这行本身就装不下:
% 职工号(c1-2) 24.09 + 值(c3) 21.52 + 姓名(c4) 18.41
% + 值(c5-6) 24.43 + 性别(c7) 16.76 + 值(c8) 10.55 = 115.76mm
% 全表 157.96mm,只剩 42.20mm(c9+c10+c11)要装「出生年月」标签 + 值。
% 而标签 4 字 14pt 就要 19.68mm,值「1985.03」14pt 要 17.22mm,
% 19.68 + 17.22 = 36.90mm —— 看似够,但列宽是被 c9=15.31 / c10=1.38
% / c11=25.51 切死的,标签占不住 c9(15.31 < 19.68),只能整体右移到
% c10-11,于是值就被挤到表外静默丢弃。
%
% 处理:标签放 c9 并折成两行「出生 / 年月」(每行 2 字 9.84mm,放得下),
% 值放 c10-11(26.89mm,17.22mm 的「1985.03」放得下)。
% **列宽一个都没改**,只是把「标签必须一行」这个原件约束让掉了 ——
% 换来的是值能显示。想还原原件那种「标签一行、值不要」,把上文
% \khbirthlabel 的定义改回一行「出生年月」即可(值会重新消失)。
\SetCell[c=2]{c} 职工号 & & \khnum & 姓名 &
\SetCell[c=2]{c} \khtbfit{\khtbspanH}{\khname} & & 性别 & \khsex
& \khbirthlabel &
\SetCell[c=2]{c} \khtbfit{\khtbspanG}{\khbirth} & \\
%---- R1 单位 / 系(研究所、实验室、科室) ----------------------------
\khtbfit{\khtbspanA}{单\hspace{1em}位} & &
\khtbfit{\khtbspanB}{\khdept} & & &
\khtbfit{\khtbspanC}{\khtbxi} & &
& \khtbfit{\khtbspanD}{\khsubdept} & & & \\
\SetCell[c=2]{c} \khtbfit{\khtbspanA}{单\hspace{1em}位} & &
\SetCell[c=3]{c} \khtbfit{\khtbspanB}{\khdept} & & &
\SetCell[c=2]{c} \khtbfit{\khtbspanC}{\khtbxi} & &
\SetCell[c=4]{c} \khtbfit{\khtbspanD}{\khsubdept} & & & \\
%---- R2 政治面貌 / 现专业技术职务 / 所聘岗位 -------------------------
\khtbfit{\khtbspanA}{政治面貌} & & \khparty
& \khtbfit{\khtbspanE}{现专业技术职务} & & \khtitle
& & \khtbfit{\khtbspanF}{所聘岗位} & & & \khpost \\
\SetCell[c=2]{c} \khtbfit{\khtbspanA}{政治面貌} & & \khparty
& \SetCell[c=2]{c} \khtbfit{\khtbspanE}{现专业技术职务} & & \khtitle
& & \SetCell[c=3]{c} \khtbfit{\khtbspanF}{所聘岗位} & & & \khpost \\
%---- R3 年度总结(竖排标签 + 正文栏) -------------------------------
% 正文与签名写进一个固定宽的 \parbox,否则会按版心宽折行冲出格子。
\khtbvert{年度总结}
& \khtbcell{\khtbsummary{\khsummary}\khtbsummarysign}
& \SetCell[c=10]{c} \khtbcell{\khtbsummary{\khsummary}\khtbsummarysign}
& & & & & & & & & \\
%---- R4 系(所、实验室、科室)考评意见 -------------------------------
\khtbfit{\khtbwa}{系(所、实验室、科室)考评意见}
& \khtbcellb{\khtbsign{负责人签名:}\khtbdate}
& \SetCell[c=10]{c} \khtbcellb{\khtbsign{负责人签名:}\khtbdate}
& & & & & & & & & \\
%---- R5 师德考核结果 ------------------------------------------------
\khtbfit{\khtbwa}{师德考核结果}
& \khtbcell{\khtbchoices{优秀,合格,基本合格,不合格}\khtbseal}
& \SetCell[c=10]{c} \khtbcell{\khtbchoices{优秀,合格,基本合格,不合格}\khtbseal}
& & & & & & & & & \\
%---- R6 单位年度考核建议档次 ----------------------------------------
\khtbfit{\khtbwa}{单位年度考核建议档次}
& \khtbcell{\khtbsmallnote
& \SetCell[c=10]{c} \khtbcell{\khtbsmallnote
(对考核档次为基本合格、不合格、不确定档次的人员需说明原因)\par
\khtbbodyfont
\khtbchoices{优秀,合格,基本合格,不合格,不确定档次}\khtbseal}
@@ -104,13 +136,13 @@
%---- R7 年度考核结果 ------------------------------------------------
\khtbfit{\khtbwa}{年度考核结果}
& \khtbcell{\khtbchoices{优秀,合格,基本合格,不合格,不确定档次}\khtbseal}
& \SetCell[c=10]{c} \khtbcell{\khtbchoices{优秀,合格,基本合格,不合格,不确定档次}\khtbseal}
& & & & & & & & & \\
%---- R8 本人意见 ----------------------------------------------------
% docx 里首列是 3 个段落(空 / “本人” / “意见”),故两词各占一行。
\khtbstack{本人,意见}
& \khtbcell{本人知晓并同意考核结果为\khtbunderline{6em}。\par
& \SetCell[c=10]{c} \khtbcell{本人知晓并同意考核结果为\khtbunderline{6em}。\par
\vspace*{0.4em}%
\khtbsign{本人签名:}\khtbdate}
& & & & & & & & & \\