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

9.1 KiB
Raw Blame History

试卷归档目录 —— 信息科学与工程学部试卷归档目录(理论课)

信息科学与工程学部试卷归档目录的 XeLaTeX 模板。原文件是学院/学部下发的 .doc 表(12 项核对清单),本目录把它做成可直接编译的 LaTeX 版。

改名说明:原文件名为「附件2:信息科学与工程学院归档目录(理论课)」, 内文写的是「归档目录」、未出现单位名。按现行建制已统一为 学部, 目录名、文件名同步。内文标题保持原文「归 档 目 录」(四字间隔一个字宽)。

与 试卷归档封面/ 的关系:两件是同一套归档材料的 两个附件的原件配套 —— 附件1 是封面(随卷装订、11 行表单),本目录是 附件2(装袋前逐项核对的清单、12 项勾选表)。版式上都照原 .doc 1: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 警告。这是唯一的主动偏离,属修正而非改版。