把「附件2:信息科学与工程学院归档目录(理论课).doc」做成 LaTeX 模板,
落在 试卷归档目录/。版式逐项照原 .doc 还原,尺寸全部注明换算过程。
- oucgddir.sty:A4、表宽 150.81mm、13 行固定行高、单元格宏
- 试卷归档目录.tex:12 项核对清单
- README.md:用法 / 版式参数表 / 实测数据 / 踩坑记录
- 根 README.md、fonts.tex:模板清单加一项,「七个」改「八个」
与原稿实测对比(pymupdf 读 PDF):
表格竖线 x Δ ≤ 0.001mm,横线 y Δ ≤ 0.006mm
32 行文字水平中心 Δ ≤ 0.11pt,字号 24/18/12/10.45 全部精确
编译 1 页,零 Overfull / Underfull / 缺字
踩到并解决的五个坑:
1. \fontsize 必须用 bp(TeX pt 比 PostScript pt 大 0.36%,24pt 实测 23.91)
2. xeCJK 吞连续半角空格 → 标题字间用 \gdgap 手动 kern 24bp
3. xeCJK 默认 PunctStyle=quanjiao 会挤压全角括号,使含括号的行整行
右移 4.23pt → 必须 \xeCJKsetup{PunctStyle=plain}
4. tabularray 把线宽算进列宽、ht 不含 hline 线宽、boxes 比 Σwd 多
0.4945pt → 三处都要实测标定
5. 单元格整体下移只有「尾部 \vspace*」有效,顶部 \vspace*/rule 会被
首行 ascent 吃掉,\raisebox 被 m 居中抵销
字体:方正楷体_GB2312(商业,不可分发)→ OUC Kai(霞鹜文楷子集,OFL 1.1),
西文 Times New Roman → TeX Gyre Termes。字宽逐字相同(60.00 / 120.00pt 全等)。
9.1 KiB
试卷归档目录 —— 信息科学与工程学部试卷归档目录(理论课)
信息科学与工程学部试卷归档目录的 XeLaTeX 模板。原文件是学院/学部下发的
.doc 表(12 项核对清单),本目录把它做成可直接编译的 LaTeX 版。
改名说明:原文件名为「附件2:信息科学与工程学院归档目录(理论课)」, 内文写的是「归档目录」、未出现单位名。按现行建制已统一为 学部, 目录名、文件名同步。内文标题保持原文「归 档 目 录」(四字间隔一个字宽)。
与
试卷归档封面/的关系:两件是同一套归档材料的 两个附件的原件配套 —— 附件1 是封面(随卷装订、11 行表单),本目录是 附件2(装袋前逐项核对的清单、12 项勾选表)。版式上都照原.doc1:1 还原, 但一个是 A4 表单、一个是 A4 居中表格,互不依赖。
文件
| 文件 | 说明 |
|---|---|
oucgddir.sty |
版式包。A4、表宽 150.64mm、13 行固定行高,每项尺寸都附换算过程 |
试卷归档目录.tex |
正文入口(12 项清单写在这里,增删改归档项只改这个文件) |
试卷归档目录.pdf |
成品样张 |
编译
xelatex 试卷归档目录.tex
必须用 XeLaTeX(fontspec + xeCJK),pdflatex 编译不过。 自包含,不依赖任何图片。实测 1 页,零警告(无 Overfull / Underfull / 缺字)。
用法
正文就是一张表,加行改行即可:
\begin{gdtable}
\gdhead{序号} & \gdhead{内容} & \gdheadIII \\
\gdno{1} & \gditem{考试签到表} & \\
\gdno{2} & \gditem{监考记录} & \\
% …… 照此继续
\end{gdtable}
可用的单元格宏:
| 宏 | 用途 | 字号/字形 |
|---|---|---|
\gdno{1} |
序号列 | 楷体 12pt 粗 |
\gditem{考试签到表} |
内容列 | 楷体 12pt |
\gdhead{序号} |
表头单段格(序号、内容两列) | 楷体 18pt 粗 |
\gdheadIII |
表头第三格,自带「标注」+ 小字两段 | 18pt 粗 + 10.45pt |
\gdnote{...} |
单独排一行小字(10.45pt) | 楷体 10.45pt |
标题用 \gdtitle{归\gdgap 档\gdgap 目\gdgap 录} —— \gdgap 不能省,
原因见下面第 3 条。
版式参数
全部照原 .doc 实测值,未做主观调整:
| 项目 | 值 | 来源 |
|---|---|---|
| 纸张 | A4 210×297mm | pgSz 11906×16838 twips |
| 页边距 | 上下 25.40mm、左右 29.599mm | pgMar top/bottom 1440 twips;左右经实测标定,见下 |
| 表宽 | 150.81mm | tblGrid 合计 8540 twips = 150.64mm,加列取整余量 |
| 列宽 | 23.072 + 77.346 + 50.218 mm | gridCol 1308 / 4385 / 2847 twips |
| 单元格内边距 | 左右 1.905mm、上下 0 | tblCellMar 108 twips |
| 边框 | 0.5pt 实线 | w:sz=4(1/8pt 单位) |
| 行高 | 表头 20.549mm、中间 12 行 13.758mm、末行 14.164mm | trHeight 1165 / 780 / 803 twips,hRule=exact |
| 标题 | 楷体 24pt,首行缩进 46.55mm | firstLine 2640 twips |
| 表头 | 楷体 18pt 粗 | w:sz=36 + w:b |
| 表头小注 | 楷体 10.45pt | w:szCs=21(未设 w:sz,Word 退回 10.5pt) |
| 序号列 | 楷体 12pt 粗 | w:sz=24 + w:b |
| 内容列 | 楷体 12pt | w:sz=24 |
实测校验
用 pymupdf 读两版 PDF,逐位对比(原稿由 WPS 导出):
表格竖线 x (mm) 原稿 29.686 / 52.758 / 130.104 / 180.322
新版 29.687 / 52.758 / 130.104 / 180.321 Δ ≤ 0.001
表格横线 y (mm) 原稿 53.001 … 239.056(14 条)
新版 53.004 … 239.050 Δ ≤ 0.006
标题四字 x0 (pt) 原稿 222.00 / 270.00 / 318.00 / 366.00
新版 221.95 / 269.93 / 317.93 / 365.93 Δ ≤ 0.07
32 行文字水平中心 最大偏差 0.11pt
32 行文字距行顶 最大偏差 0.57pt(数字与中文各自字体度量差,见下)
字号 24.00 / 18.00 / 12.00 / 10.45 …………全部精确
纵向那 0.5pt 的来源:原稿序号列用 Times New Roman、正文用方正楷体, Word 让两种字体各自按自身 ascent 落基线,同一行里数字比中文高 0.48pt (原稿实测 232.25 vs 231.77)。新版用 Termes + OUC Kai 复刻了同样的 相对关系(232.32 vs 232.32 —— 差 0,因为 Termes 与 OUC Kai 的 ascent 恰好一致)。这是字体度量差,不是排版错误,且新版同一行内更整齐。
五个坑(改之前先看)
1. \fontsize 必须用 bp,不能用默认的 pt
Word/PDF 里的 "pt" 是 PostScript point(1/72 英寸),TeX 的默认 pt 是
TeX point(1/72.27 英寸),后者大出 0.36%。写 \fontsize{24}{28.8},
PDF 里实测只有 23.91(= 24 × 72/72.27),与原稿的 24.00 对不上。
\fontsize{24bp}{28.8bp}\selectfont % 实测正好 24.000
本包所有照抄 Word 数值的字号、行距、间距一律写 bp。
2. xeCJK 会吞掉连续半角空格
标题原文是「归␣␣档␣␣目␣␣录」(字间各两个半角空格)。直接照抄进源码, 编译出来是紧贴的「归档目录」—— 空格全没了(实测 x0=216.09,且只有一个 span,而原稿是四个独立字、间隔恒 48pt)。
正解是不依赖空格策略,用 \kern 手动摆:
\newcommand{\gdgap}{\kern\gdtitlegap} % \gdtitlegap = 24bp = 1 个字宽
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
3. 必须关掉 xeCJK 的全角标点压缩(PunctStyle=plain)
这条最隐蔽。 现象:凡含全角括号的行,整行右移 4.23pt,而字宽完全正确。 「试卷(项目设计报告)」原稿 x0=199.20,默认设置排出 203.43。
根因是 xeCJK 默认 PunctStyle=quanjiao 会对全角标点做字宽挤压:「(」「)」
的 advance 从 1.0em 压到 0.5em,省下的空间记在行内盒子的起点上,于是
整行墨迹相对盒子右移。两端对齐的正文里这叫"标点紧凑",但在居中的表格
单元格里就是整行偏移,且偏移量随括号个数变化(1 个 4.23pt、2 个 8.46pt)。
\xeCJKsetup{PunctStyle=plain}
Word 本来就不做这个挤压,关掉反而与原件一致。
4. totalwidth / 行高 / 位移都要比理论值多留一点
tabularray 的计宽与画宽不是一回事,三处都要实测标定:
- 列宽:它把边框线宽算进列宽,故
wd = gridCol − 2×colsep − 线宽, 而不是"按竖线根数分摊"。按分摊算每列窄 0.154mm,整表窄 0.466mm。 - 表宽:左竖线画在版心左边界内侧,整个 tblr 盒子比
Σwd + 6×colsep + 4×线宽又多约 0.4945pt,不补足就报Overfull \hbox (0.49452pt too wide)。 - 行高:
row{..}={ht=..}是内容区高度,hline 线宽不含在内, 每行实际比 ht 高整整一个\gdrule(0.5pt)。13 行累计多 6.5pt, 必须逐档减掉 0.1764mm。
5. 单元格里想"整体下移",只有一种写法有效
\gdheadIII 要让「标注」+ 小注两段整体下移 1.49pt,五种手段实测对比
(数值为距行顶距离,末项是两段间距):
| 手段 | 标注 | 小注 | 间距 | 结论 |
|---|---|---|---|---|
| 原样 | 25.43 | 46.53 | 21.09 | 偏低 1.49 |
尾部 \vspace*{-2.98pt} |
26.92 | 48.01 | 21.10 | ✅ 正确 |
顶部 \vspace*{+2.98pt} |
23.95 | 48.01 | 24.06 | 反向且拉大间距 |
顶部 \rule{0pt}{26.5pt} |
31.25 | 52.34 | 21.09 | 位移过大 |
\raisebox{-1.49pt}{\vbox{..}} |
25.43 | 46.53 | 21.09 | 完全无效 |
原理:尾部间距 s 改变盒子总高 H(H' = H + s),m 居中后
内容顶端 = 行顶 + (行高 − H')/2。所以 s 与位移是 2:1 关系,
但实测灵敏度是 0.778 而非 0.5(hline 也参与高度分配),故最终标定值是
\vspace*{-2.98pt} 而不是 −1.49×2。
顺带一个反直觉的点:顶部间距会被首行的 ascent 吃掉 —— 3.6pt 的
\rule 远小于 18pt 字的 ascent,写了等于没写;必须超过 ascent 才有反应,
但那时位移已经过量。所以"顶部加高"这条路走不通。
字体
全部来自仓库公共字体包 ../fonts.tex,来源与授权见
../fonts/README.md。
原稿中文用「方正楷体_GB2312」(商业字体,不允许随仓库分发),现换成 OUC Kai(霞鹜文楷 GB2312 子集,SIL OFL 1.1)—— 同为楷体、同为 GB2312 字符集,字宽逐字相同(实测「考试签到表」= 60.00pt, 「试卷(项目设计报告)」= 120.00pt,与原稿全等)。西文/数字原用 Times New Roman,现用 TeX Gyre Termes(度量兼容替代)。
一个已知的"不改动"
原表 tblGrid 合计 8540 twips = 150.64mm,而原版心 210 − 2×31.75
= 146.50mm —— 原文档里这张表本来就在版心之外各溢出 2.07mm,靠
jc=center 居中掩盖,看起来正常。
本模板把版心直接设成表宽(150.81mm),表格居中与纸面绝对位置与原稿一致 (见上面的实测校验),但不再"溢出版心":视觉上无差别,且不产生 Overfull 警告。这是唯一的主动偏离,属修正而非改版。