Files
ouc_latex_template/试卷归档目录/README.md
T
laoyang 8fa44b138c 新增试卷归档目录 LaTeX 模板 #7
把「附件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 全等)。
2026-10-27 07:51:10 +08:00

199 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 试卷归档目录 —— 信息科学与工程学部试卷归档目录(理论课)
信息科学与工程学部**试卷归档目录**的 XeLaTeX 模板。原文件是学院/学部下发的
`.doc` 表(12 项核对清单),本目录把它做成可直接编译的 LaTeX 版。
> **改名说明**:原文件名为「附件2:信息科学与工程学院归档目录(理论课)」,
> 内文写的是「归档目录」、未出现单位名。按现行建制已统一为 **学部**,
> 目录名、文件名同步。内文标题保持原文「归 档 目 录」(四字间隔一个字宽)。
> 与 [`试卷归档封面/`](../试卷归档封面/) 的关系:两件是**同一套归档材料**的
> 两个附件的原件配套 —— 附件1 是封面(随卷装订、11 行表单),本目录是
> 附件2(装袋前逐项核对的清单、12 项勾选表)。版式上都照原 `.doc` 1:1 还原,
> 但一个是 A4 表单、一个是 A4 居中表格,互不依赖。
## 文件
| 文件 | 说明 |
|---|---|
| `oucgddir.sty` | 版式包。A4、表宽 150.64mm、13 行固定行高,每项尺寸都附换算过程 |
| `试卷归档目录.tex` | 正文入口(12 项清单写在这里,增删改归档项只改这个文件) |
| `试卷归档目录.pdf` | 成品样张 |
## 编译
```bash
xelatex 试卷归档目录.tex
```
必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
自包含,不依赖任何图片。实测 1 页,零警告(无 Overfull / Underfull / 缺字)。
## 用法
正文就是一张表,加行改行即可:
```latex
\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 对不上。
```latex
\fontsize{24bp}{28.8bp}\selectfont % 实测正好 24.000
```
本包所有照抄 Word 数值的字号、行距、间距一律写 `bp`。
### 2. xeCJK 会吞掉连续半角空格
标题原文是「归␣␣档␣␣目␣␣录」(字间各两个半角空格)。直接照抄进源码,
编译出来是紧贴的「归档目录」—— 空格全没了(实测 x0=216.09,且只有一个
span,而原稿是四个独立字、间隔恒 48pt)。
正解是不依赖空格策略,用 `\kern` 手动摆:
```latex
\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)。
```latex
\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.tex),来源与授权见
[`../fonts/README.md`](../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 警告**。这是唯一的主动偏离,属修正而非改版。