Files
ouc_latex_template/试卷归档目录/oucgddir.sty
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

461 lines
24 KiB
TeX
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.
%======================================================================
% oucgddir.sty — 信息科学与工程学部 试卷归档目录(理论课)版式包
%
% 依据:附件2:信息科学与工程学院归档目录(理论课).doc
% (SynologyDrive/授课/数字逻辑/2025/归档/)
% 原名与内文写的是「学院」,按现行建制改为「学部」,
% 模板标题相应为「信息科学与工程学部试卷归档目录」。
%
% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算:
% pt → mm : mm = pt / 72 * 25.4
% twips → mm : mm = twips / 1440 * 25.4
% w:sz : 半磅值,÷ 2 即 pt
%
% 用法见同目录 试卷归档目录.tex,说明见 README.md
%======================================================================
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{oucgddir}[2026/10/27 v1.0 OUC exam archive checklist]
\RequirePackage{geometry}
\RequirePackage{fontspec}
\RequirePackage{xeCJK}
\RequirePackage{tabularray}
%======================================================================
% 1. 页面与版心
%
% 原 .doc sectPr:
% pgSz w:w=11906 h:h=16838 → A4(210.01 × 297.00 mm)
% pgMar top/bottom = 1440 twips = 25.40 mm
% left/right = 1800 twips = 31.75 mm
% header 851 / footer 992 twips
%
% 但这张表本身【比版心宽】—— 这是原文档就存在的问题,不是这里引入的:
% 版心宽 = 210 − 2×31.75 = 146.50 mm
% 表宽 = tblGrid 合计 8540 twips = 150.64 mm
% ⇒ 表格比版心宽 4.14 mm,左右各溢出 2.07 mm。
% 原 Word 里 tblPr 是 jc=center + tblW=auto,所以表格是居中摆的,
% 左边界落在 29.60mm(= 31.75 − 2.07),实测 PDF 表格线 x 范围
% 29.60 ~ 180.41 mm,与此吻合。
%
% ⇒ 本包的处理:把 totalwidth 直接设成表宽 150.636mm,左右各留
% (210 − 150.636)/2 = 29.682 mm。这样
% · 表格与版心同宽,整表居中,编译不刷 Overfull \hbox
% · 表格线在纸面上的绝对位置与原 .doc 完全一致(误差 < 0.1mm)
% · 标题的居中基准也落在纸张中心,与原稿一致
% 即:不改动任何可见版式,只把"溢出版心"换成"版心就是表宽"。
%
% ⚠️⚠️【实测修正:totalwidth 要 150.8105mm,左边距 29.599mm】
%
% (a) 表宽的真实值不是 150.636mm。
% tabularray 把左竖线画在版心左边界【内侧】,线中心 = 边界 + 半线宽,
% 而右竖线外缘还要再占半个线宽,故整个 tblr 盒子的实宽比
% Σwd + 6×colsep + 4×线宽 多出约 0.4945pt。实测:
% Overfull \hbox (0.49452pt too wide)
% 须把 totalwidth 补足到 150.636 + 0.1745 = 150.8105 mm。
%
% (b) 左边距要 29.599mm 而非 29.682mm。
% 实测新版竖线 x 比原稿整体右偏 0.083mm(29.771 vs 29.686),
% 列宽与行距都已逐项精确,纯属整表平移,故左边距减 0.083mm。
% 此时 right 自动 = 210 − 29.599 − 150.8105 = 29.5905mm。
%
% 校正后实测:竖线 x = 29.686 / 52.758 / 130.104 / 180.322 mm,
% 与原稿 29.686 / 52.758 / 130.104 / 180.322 逐位相同。
%======================================================================
\geometry{
paperwidth = 210mm,
paperheight = 297mm,
left = 29.599mm, % 实测标定(见上)
totalwidth = 150.8105mm, % = 表真实宽(含 tabularray 取整余量)
top = 25.40mm,
bottom = 25.40mm,
headheight = 0pt,
headsep = 0pt,
footskip = 17.50mm,
}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt}
\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码
%======================================================================
% 2. 字体与字号
%
% 原 .doc 全文只用「方正楷体_GB2312」一种中文字体,西文/数字用
% Times New Roman:
% 表外标题 楷体 24pt (w:sz=48)
% 表头三格 楷体 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)
%
% ⚠️ 原字体是方正楷体 —— 商业字体,不允许随仓库分发。这里换成
% OUC Kai(霞鹜文楷 GB2312 子集,SIL OFL 1.1),字形风格一致
% (同为楷体、同为 GB2312 字符集),观感几乎无法区分。
% 字体全部来自仓库公共字体包 ../fonts.tex。
%
% ⚠️ 西文/数字:原文档用 Times New Roman。这里用 TeX Gyre Termes,
% 它是 Times 的度量兼容替代(字符宽度逐字相同),数字宽度零漂移。
%======================================================================
\input{../fonts.tex}
%----------------------------------------------------------------------
% ⚠️⚠️⚠️【最隐蔽的一条:必须关掉 xeCJK 的全角标点压缩】
%
% 现象:凡含全角括号「(」的行,整行右移 4.23pt,而字宽完全正确。
% 「试卷(项目设计报告)」原稿 x0=199.20,按默认设置排出 203.43。
%
% 根因:xeCJK 默认 PunctStyle=quanjiao,会对全角标点做**字宽挤压**:
% · 「(」「)」的 advance 从 1.0em 压到 0.5em
% · 挤压省下的空间被记在**行内盒子的起点**上(负的 \kern),
% 于是整行墨迹相对盒子右移
% · Word 不做这件事,全角括号就是整 1.0em
% 这在两端对齐的正文里看起来是"标点更紧凑",但在**居中**的表格
% 单元格里就会让整行偏移,且偏移量随括号个数变化(1 个括号 4.23pt,
% 2 个括号 8.46pt …),肉眼可见地不居中。
%
% 正解:\xeCJKsetup{PunctStyle=plain} —— 关闭挤压,全角标点按原字宽排。
% 代价:正文里中文标点的视觉密度略增(与 Word 完全一致,本就是目标)。
%
% ⚠️ 这条必须在 \begin{document} 之前设,且是**全局**的 ——
% 只对本模板生效,不影响仓库里其他模板(它们各自没这个包)。
%----------------------------------------------------------------------
\xeCJKsetup{PunctStyle=plain}
%----------------------------------------------------------------------
% ⚠️⚠️⚠️【最要命的一条,与 oucksfm.sty / ouclw.sty 同源】
% ctex 默认 \linespread 约 1.3,会把 \fontsize{12}{14.4} 的 14.4pt
% 行距放大成 18.7pt 以上,整张表会被撑高。
%
% \fontsize 的第二个参数【本来是】用来设 \baselineskip 的,但
% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread 归 1。
% 这一步不能省,也必须在 \AtBeginDocument 之后再设一次
% (ctex 在 begin document 时会重设)。
%----------------------------------------------------------------------
\newcommand{\gdbasefont}{%
\linespread{1}\relax
\fontsize{12bp}{14.4bp}\selectfont}
%----------------------------------------------------------------------
% ⚠️⚠️【字号必须用 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 对不上。
%
% 正解:显式写 bp 单位 —— \fontsize{24bp}{28.8bp},实测正好 24.000。
% 本包所有字号、行距、间距只要涉及"照抄 Word 数值"的,一律用 bp。
%----------------------------------------------------------------------
% 各档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致)
\newcommand{\gdtitlefont}{\linespread{1}\relax\fontsize{24bp}{28.8bp}\selectfont}
\newcommand{\gdheadfont} {\linespread{1}\relax\fontsize{18bp}{21.6bp}\selectfont}
\newcommand{\gdnotefont} {\linespread{1}\relax\fontsize{10.45bp}{12.54bp}\selectfont}
\newcommand{\gdcellfont} {\linespread{1}\relax\fontsize{12bp}{14.4bp}\selectfont}
%----------------------------------------------------------------------
% ⚠️ xeCJK 陷阱:局部字体切换命令若紧邻 \par(或落在段落末尾),段末的
% 字体状态会"溢出"到后面段落。故局部切换一律用带 \normalfont 收尾的包装。
%----------------------------------------------------------------------
%======================================================================
% 3. 列的宽度模型
%
% 原 .doc tblGrid 三个网格列(twips → mm):
% c1 序号 = 1308 twips = 23.0717 mm
% c2 内容 = 4385 twips = 77.3465 mm
% c3 标注 = 2847 twips = 50.2179 mm
% ─────────────────────────────────────
% 合计 8540 twips = 150.6361 mm
%
% cellMar:left/right = 108 twips = 1.9050 mm,top/bottom = 0
% 边框 :w:sz = 4(单位 1/8 pt)⇒ 0.5 pt = 0.1764 mm
%
% tabularray 的 colsep 计在每列【左右两侧】,故 3 列共 6×1.905 = 11.430mm;
% 竖线 4 根(左边界 + 2 条内线 + 右边界)× 0.1764 = 0.7056mm。
% 要让 Σwd + 11.430 + 0.7056 = 150.636,需
% Σwd = 138.5005 mm
% 而 (gridCol − 2×1.905) 之和为 150.636 − 11.430 = 139.2061 mm,
% 两者差 0.7056 mm 正好是竖线总宽,故每列再减
% 竖线分摊 = 0.7056 / 3 = 0.2352 mm
%
% ⚠️ 上式是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
% 实测需再微调(见 3.1 的实测标定值),否则报
% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。
%
% ⚠️⚠️【实测标定:tabularray 把边框线宽算进列宽里】
% 实测每列"相邻竖线中心线间距" = wd + 2×colsep + \gdrule,
% 即比理论值 wd + 2×colsep 多出一个 0.1764mm 的线宽。
% 故正确的 wd 是
% wd = gridCol − 2×colsep − \gdrule
% 而不是 gridCol − 2×colsep − 竖线分摊。
% (按旧式"分摊"算出的 wd 偏小 0.154mm/列,整表窄 0.466mm,
% 实测原稿三列 23.072/77.346/50.218 而旧版 22.916/77.192/50.062。)
%======================================================================
\newcommand{\gdrule}{0.5pt} % 边框粗细(w:sz=4)
\newcommand{\gdcolsep}{1.905mm} % 单元格左右内边距(108 twips)
\newlength{\gdtblw}
\setlength{\gdtblw}{150.636mm} % 表宽(含 4 根竖线与 6 处内边距)
%----------------------------------------------------------------------
% 3.1 各列宽(= gridCol − 2×colsep − 竖线分摊)
% 与 gdtable 环境里 colspec 的 wd 必须逐字一致。
%----------------------------------------------------------------------
\newcommand{\gdwa}{19.0853mm} % c1 23.0717 − 3.8100 − 0.1764(线宽)
\newcommand{\gdwb}{73.3601mm} % c2 77.3465 − 3.8100 − 0.1764
\newcommand{\gdwc}{46.2315mm} % c3 50.2179 − 3.8100 − 0.1764
%----------------------------------------------------------------------
% 3.2 行高(扣掉边框线宽)
%
% ⚠️⚠️ tabularray 的 row{...}={ht=...} 是**内容区**高度,hline 的线宽
% 不包含在内 —— 实测每行都比 ht 高出整整一个 \gdrule(0.5pt):
% 原稿行距 39.00pt,按 ht=13.7583mm(=39.00pt) 排出来是 39.50pt
% 13 行累计多出 6.5pt,整表总高 533.88 vs 原稿 527.40
% ⇒ ht 需减去线宽 0.5pt = 0.1764mm:
% 表头 20.5493 − 0.1764 = 20.3729 mm
% 中间行 13.7583 − 0.1764 = 13.5819 mm
% 末 行 14.1640 − 0.1764 = 13.9876 mm
%----------------------------------------------------------------------
%======================================================================
% 4. 行高
%
% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast):
% R1 表头 1165 twips = 20.5493 mm
% R2 ~ R13 780 twips = 13.7583 mm ← 12 行,逐行完全相同
% 最后一行 803 twips = 14.1640 mm ← 比其余 12 行高 0.406mm
% ────────────────────────────────────────
% 合计 20.5493 + 12×13.7583 + ... 见下
%
% ⚠️ 第 13 行(序号 12「试卷(项目设计报告)」)是 803 而非 780,
% 多出来的 23 twips 是 Word 里"字高 + 段前段后"凑出来的测量值,
% 照抄才能与原表逐行对齐。
%
% ⚠️ Word 的 exact 是"精确等于",内容超了会【被裁掉】。tabularray 的
% ht= 是最小行高(内容多则自动长高),语义更安全。本表各行内容都远
% 小于行高,两者结果相同,故直接写 ht=。
%======================================================================
%======================================================================
% 5. 表格环境
%
% ⚠️ 用 tblr 而非 longtblr:本表总高约 191mm,一页装得下(版心高
% 297 − 2×25.40 = 246.2 mm),不需要断页。
%
% ⚠️⚠️ colspec 与 row{} 必须字面写在这里,不能先存进宏再展开:
% tabularray 的列类型解析在宏展开之外进行,会报
% "Unexpandable command \xxx inside column type"。
% (所以 3.1 节那些 \gdwa… 只作文档用,不能拼进 colspec。)
%
% ⚠️ 选项里的宏名一律不带 @:tabularray 解析选项时 @ 不是字母。
%======================================================================
\newenvironment{gdtable}{%
\par\begingroup
\begin{tblr}[label=none]{
colspec={Q[c,m,wd=19.0853mm] Q[c,m,wd=73.3601mm] Q[c,m,wd=46.2315mm]},
colsep=1.905mm, rowsep=0pt, stretch=0,
hline{1-Z}={\gdrule}, vline{1-Z}={\gdrule},
row{1}={ht=20.3729mm},
row{2-Z}={ht=13.5819mm},
row{13}={ht=13.9876mm},
}%
}{%
\end{tblr}\par\endgroup}
%======================================================================
% 6. 单元格内容包装
%
% 本表全是单列格,tabularray 的 Q[c,m,wd=…] 已处理好居中与折行,
% 不需要 ouclw.sty 那种定宽 \parbox。这里只提供语义化的包装宏,
% 让 .tex 里不必反复写字体命令。
%======================================================================
% \gdno{数字} —— 序号列:楷体 12pt 加粗
\newcommand{\gdno}[1]{{\kaiti\bfseries\gdcellfont #1\normalfont}}
% \gditem{文字} —— 内容列:楷体 12pt
\newcommand{\gditem}[1]{{\kaiti\gdcellfont #1\normalfont}}
% 表头文字:楷体 18pt 加粗(只排字,不带任何垂直位移)
\newcommand{\gdheadraw}[1]{{\kaiti\bfseries\gdheadfont #1\normalfont}}
% 表头单元格(单段结构,用于「序号」「内容」两格)
%
% ⚠️ 尾部 \vspace*{1.58pt} 把这两个字【上移】0.99pt。
% 原稿基线距行顶 34.73pt,不处理时是 36.51pt(低了 1.78pt)。
%
% 方向推导:尾部间距 s 改变盒子总高 H(H' = H + s),m 居中后
% 内容顶端 = 行顶 + (行高 − H')/2。故 s > 0 ⇒ 顶端上移 s/2;
% s < 0 ⇒ 顶端下移 |s|/2。
% ⚠️ 实测 s 与位移不是严格 s/2 关系(因为行高是固定 ht,但单元格
% 还有 hline 参与分配),标定结果:
% s = 0 → 36.51(低 1.78)
% s = 3.56 → 33.74(高 0.99)
% 即 Δs=3.56 带来 Δ位移=2.77,灵敏度 0.778pt/pt。
% 要从 33.74 下移回 34.73,需 Δs = −1.99 × 0.778⁻¹… 反解得 1.58。
% 实测 s = 1.58 → 34.73,与原稿一致。
%
% 「标注」格是两段结构、自带自己的位移,故用 \gdheadraw 而非本宏。
\newcommand{\gdhead}[1]{\gdheadraw{#1}\par\vspace*{1.58pt}}
% 表头第三格的小字注释:楷体 10.45pt,不加粗
\newcommand{\gdnote}[1]{{\kaiti\gdnotefont #1\normalfont}}
%----------------------------------------------------------------------
% 表头第三格的两行结构
%
% 原 .doc 该格是【两个独立段落】:
% 段 1 「标注」 楷体 18pt 加粗,jc=center
% 段 2 「(确认存档后在此栏打√)」 楷体 10.45pt,不加粗,jc=center
%
% 实测两段的 y0 分别为 161.64 与 189.27 pt(相差 27.63pt),
% 说明它们是顺序排列的两行,不是同一行里的不同字号。
% 因此这里也用两个 \par 分开的段落,而不是塞进同一行。
%
% ⚠️ 第二段的字宽 379.08~500.65pt = 121.57pt = 42.89mm,
% 而该列内容可用宽只有 46.08mm(见 §3.1),余 3.19mm,
% 刚好排得下不折行 —— 与原稿一致。若换成别的字体/字号导致
% 折行,请把 §3.1 的 c3 略微加宽(同时减小 c2)。
%
% ⚠️⚠️【两段的垂直间距:原稿 21.12pt】
% 原稿两段基线相距 198.29 − 177.17 = 21.12pt。
% 而 18pt 楷体的行距(\baselineskip = 21.6pt)已把第二段的
% 起点推到了第一段基线 + 21.6pt 处,故两段之间的 \vspace 应当是
% **负值**才能得到 21.12pt:
%
% 间距 = 第一段行距 21.6 + \vspace → \vspace = −0.48pt
%
% 但实测 \vspace*{-0.48pt} 只排出 13.93pt,与 21.12 差 7.19pt。
% 原因是 \gdhead{...} 内部的 \gdheadfont 把 \baselineskip 重设成
% 21.6bp 之后,\par 结束时段落用的是**收尾组外**的 12bp/14.4bp,
% 故实际参与的是 14.4pt,不是 21.6pt:
% 间距 = 14.4 + \vspace → \vspace = +6.72pt
% 实测 6.72pt 正好排出 21.12pt。
%
% ⚠️ 三个 \par 段落会改变单元格盒子的总高,tabularray 的 m(垂直居中)
% 会据此重新计算基线位置 —— 故改这个值会连带影响「标注」二字的高度。
%
% ⚠️⚠️【整格下移 1.49pt:只能用"尾部负间距"】
% 两段间距调对(21.09 vs 原稿 21.12 ✓)后,整个格子比原稿高 1.49pt。
% 五种手段实测对比(距行顶距离,单位 pt,最后一项是两段间距):
% A 原样 25.43 / 46.53 / 21.09
% B 尾部 \vspace*{-2.98pt} 26.92 / 48.01 / 21.10 ← 正确
% C 顶部 \vspace*{+2.98pt} 23.95 / 48.01 / 24.06 ← 反向且拉大间距
% D 顶部 \rule{0pt}{26.5pt} 31.25 / 52.34 / 21.09 ← 位移过大
% E \raisebox{-1.49pt}{\vbox{...}} 25.43 / 46.53 / 21.09 ← 完全无效
%
% 为什么 B 有效:\vspace* 放在最后一段之后会缩短盒子的**总高**,
% m 居中按 (行高 − 总高)/2 定位,总高减 2.98 ⇒ 内容整体下移 1.49。
% 两者是 2 倍关系,别写成 1.49。
%
% 为什么 C/D 不行:顶部间距会被首行的 ascent 吃掉(3.6pt 远小于
% 18pt 字的 ascent),所以小 h 无效、大 h 又过量,没有可用区间。
% 为什么 E 不行:raisebox 在 tabularray 的单元格里被 m 居中的
% 重新计算抵消掉了。
%----------------------------------------------------------------------
\newcommand{\gdheadIII}{%
\gdheadraw{标注}\par
\vspace{6.72pt}%
\gdnote{(确认存档后在此栏打√)}\par
\vspace*{-2.98pt}}%
%======================================================================
% 7. 表外标题
%
% 原 .doc 第 2 段(idx 1):
% 楷体 24pt,jc 未设(左对齐),首行缩进 firstLine=2640 twips
% = 46.55 mm,且 firstLineChars=550(即 5.5 字宽)。
% 文字是「归 档 目 录」,字间各留两个半角空格。
%
% 实测 PDF:四个字 x0 = 222.00 / 270.00 / 318.00 / 366.00 pt,
% 相邻间距恒为 48.00 pt,每字宽 24.00 pt
% ⇒ 字间空隙 = 48.00 − 24.00 = 24.00 pt = 1 个字宽 = 2 个半角空格 ✓
%
% ⚠️⚠️【不能直接把「归 档 目 录」写进源码】
% xeCJK 默认开启 CJKecglue,且会把连续半角空格吞成一个,
% 写「归 档 目 录」编译出来是「归档目录」紧贴(空格全没了,
% 实测 x0=216.09 且只有一个 span)。
%
% 正解:用实测的间距自己摆 —— 每字之间插入 \gdtitlegap
% = 24.00pt = 8.467mm 的固定空白。这样得到的字符位置与原稿逐字相同,
% 且不依赖 xeCJK 的空格策略。
% 实现见下面的 \gdtitle:参数是【逗号分隔的字】,逐字排并插 gap。
%======================================================================
\newlength{\gdtitleindent}
%----------------------------------------------------------------------
% ⚠️⚠️【这个缩进不是 46.55mm,是 48.635mm】
%
% 原 .doc 的 firstLine = 2640 twips = 46.55mm,但它是从**版心左边界
% 31.75mm**(pgMar left=1800 twips)起算的:
% 31.75 + 46.55 = 78.30mm = 221.98pt ← 实测原稿标题 x0 = 222.00pt ✓
%
% 而本包把版心改成了表宽 150.636mm,左边界 29.682mm。若这里照抄
% 46.55mm,标题会落到 29.682 + 46.55 = 76.23mm = 216.02pt,
% 比原稿左移 5.91pt(2.08mm)—— 实测确实如此。
%
% ⇒ 补回这 2.151mm:48.701 = 46.55 + (31.75 − 29.599)
% 实测得到的标题 x0 = 222.00pt,与原稿逐字一致(四字间距 48.00pt)。
%----------------------------------------------------------------------
\setlength{\gdtitleindent}{48.701mm}
\newlength{\gdtitlegap}
\setlength{\gdtitlegap}{24bp} % 字间空隙 = 1 个字宽(实测 48−24)
% \gdgap —— 标题里的字间空隙,直接在 .tex 里逐字之间插入:
% \gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
% 比"逗号分隔、宏里循环"直观得多,也不用 \makeatletter。
\newcommand{\gdgap}{\kern\gdtitlegap}
\newcommand{\gdtitle}[1]{%
\par\noindent
\hspace*{\gdtitleindent}%
{\kaiti\gdtitlefont #1\normalfont\par}}
%======================================================================
% 8. 标题与表格之间的空距
%
% 原 .doc 结构(body 子元素):
% idx 0 空段
% idx 1 标题「归 档 目 录」
% idx 2 空段
% idx 3 表格
% idx 4 空段
% idx 5 空段
%
% 实测:标题基线块 y0=97.78pt(34.50mm),表格顶线 y=150.00pt(52.92mm)。
% 标题字高 24pt、单倍行距 28.8pt = 10.16mm,故标题占 34.50 ~ 44.66mm;
% 标题段之后到表格顶线还差 52.92 − 44.66 = 8.26mm,
% 这一截由「空段(idx 2)」贡献。
%
% ⚠️⚠️【实测标定:9.943mm,不是 8.26mm】
% 理论值 8.26mm 是从"标题字块底 44.66mm"起算的,但 LaTeX 的
% \vspace 是从**基线 + 深度**之后起算,二者差一个 descent。
% 按 8.26mm 排出来表格顶线在 52.61mm,比原稿 53.00mm 高 0.39mm;
% 补足到 9.943mm 后实测 53.00mm,与原稿完全一致。
%======================================================================
\newlength{\gdheadskip}
\setlength{\gdheadskip}{9.943mm}
%======================================================================
% 9. 文档首部留白
%
% idx 0 是一个空段,占 1 行 = 28.8pt? 否 —— 它是 12pt 正文段落的空行,
% 单倍行距 = 14.4pt = 5.08mm。加上版心上边距 25.40mm,
% 标题块 y0 应为 25.40 + 5.08 = 30.48mm;
% 实测 34.50mm,差 4.02mm,是 Word 段前间距。故这里直接写到实测值。
%
% ⚠️⚠️【实测标定:2.7255mm,不是 4.02mm】
% 按 4.02mm 排出来,标题基线在 122.16pt,而原稿是 118.49pt,
% 低了 3.67pt = 1.2945mm。原因:4.02mm 是从"标题字块顶端"反推的,
% 而这里的 \vspace* 是从版心上边界往下量到**基线之上的高度**,
% 两者起算法不同,差了一个 ascent 的零头。
% ⇒ 4.02 − 1.2945 = 2.7255mm,实测标题基线 118.49pt,与原稿一致。
%
% 连带影响:表格整体也在同一基线之后,故此处一并归位;
% 表格顶线随之从 54.30mm 上移到 53.01mm(原稿 53.00mm)。
%======================================================================
\newlength{\gdtopskip}
\setlength{\gdtopskip}{2.7255mm}
\AtBeginDocument{\gdbasefont}
\endinput