461 lines
24 KiB
TeX
461 lines
24 KiB
TeX
%======================================================================
|
||||
|
|
% 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
|