新增特殊事项说明表 LaTeX 模板(特殊事项说明表/) #16

Closed
opened 2026-10-28 11:09:04 +00:00 by laoyang · 3 comments
Owner

需求

用户原话:「@中国海洋大学特殊事项说明表.docx 改成 latex 模板,放入代码库中。」

把报销用的《中国海洋大学特殊事项说明表》Word 版复刻为 LaTeX 模板,新增目录
特殊事项说明表/,与本库其余 11 个模板同一套约定(中文目录名、README.md、
<缩写>.sty 样式文件、\input{../fonts.tex} 公共字体)。

涉及范围

新增(全部为新文件,不改动任何既有模板):

  • 特殊事项说明表/特殊事项说明表.tex — 主文件,填表只改第 1 节 4 行
  • 特殊事项说明表/ouccsx.sty — 版式包
  • 特殊事项说明表/README.md — 用法、版式数据来源、六个坑、实测偏差
  • 特殊事项说明表/特殊事项说明表.pdf — 编译样张

顺带更新根 README.md:目录表加一行,模板计数 11 → 12。

关键设计决策

1. 版心取表格宽度,不取 docx 版心

原表 tblW = 9613 twips = 169.54 mm,而 docx 版心只有 156 mm,靠
tblInd = −546 twips 向左顶出去。若 geometry 照搬 docx 版心,表格必然
超出版心 13.54 mm 报 Overfull。故把版心直接设成表格宽度
(left 16.47mm / totalwidth 169.54mm),表格正好填满、零 Overfull、
位置与原件逐点相同。代价是标题与备注区要额外偏移补回 docx 版心的中心。

2. 行距不用 \baselineskip,改成逐行插 \kern

本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68 bp),因为 10.5 pt
与 12 pt 混排,Word 按「下一行字号 × 1.3」算。而 \baselineskip 只在同一
段落内部
管行距 —— 每行 \par 自成一段后,段间基线距由「上段深度 +
\parskip + 本段字高」决定,\baselineskip 根本没被读到(实测所有行距被压成
13.51,整表矮 2.25 bp)。

改成显式插胶:基线距 = 上盒深度 + \kern + 本盒高度。与字体度量彻底解耦,
换字体/换字号/描述长短都不影响行距。

3. R0 靠「上下两半 + \vfil」,不用 8 个空段

原 docx 的 R0 用 8 个空段给手写留白,描述一写长就把签名区顶到下一行。
本模板改成上下两半 + 中间可伸缩胶:描述短则空白落在两半之间,描述长则
空白被吃掉,签名区位置都不动。这比原件更稳。

验收标准

  • xelatex 编译 0 error / 0 Overfull / 0 Underfull / 1 页
  • 与 Word 2007 导出的 PDF 逐项对齐:33 个文字元素 dY 全部 0.00 bp,
    dX ≤ 0.04 bp(备注区 ≤ 0.82 bp,为字体字宽差)
  • 四条表格横线 y 坐标 0.00 bp;页码 0.00 bp
  • 像素级差分(150 dpi)差异 3.03%,且全部落在有文字的行上(字形轮廓差),
    无整体错位偏移带
  • 全库 12 个模板回归编译通过,既有 11 个 PDF 零字节变化
  • README.md 写明用法、可改参数、数据来源、六个坑、有意差异、实测偏差

与原件的有意差异(仅 3 处)

  1. 字体 SimSun → OUC Serif(本库公共字体,可分发,换机器一致)
  2. 标题方正小标宋简体 → OUC Serif 真粗体(小标宋是商业字体,不可分发;
    按 课程执行大纲/ 既定做法换真粗体)
  3. 第 3 条备注在原件里是手打的「 3. 」(漏配 numPr),位置比前两条偏
    0.36 bp;本模板统一排齐

除此之外无任何版式差异。

## 需求 用户原话:「@`中国海洋大学特殊事项说明表.docx` 改成 latex 模板,放入代码库中。」 把报销用的《中国海洋大学特殊事项说明表》Word 版复刻为 LaTeX 模板,新增目录 `特殊事项说明表/`,与本库其余 11 个模板同一套约定(中文目录名、`README.md`、 `<缩写>.sty` 样式文件、`\input{../fonts.tex}` 公共字体)。 ## 涉及范围 新增(全部为新文件,不改动任何既有模板): - `特殊事项说明表/特殊事项说明表.tex` — 主文件,填表只改第 1 节 4 行 - `特殊事项说明表/ouccsx.sty` — 版式包 - `特殊事项说明表/README.md` — 用法、版式数据来源、六个坑、实测偏差 - `特殊事项说明表/特殊事项说明表.pdf` — 编译样张 顺带更新根 `README.md`:目录表加一行,模板计数 11 → 12。 ## 关键设计决策 ### 1. 版心取表格宽度,不取 docx 版心 原表 `tblW = 9613 twips = 169.54 mm`,而 docx 版心只有 156 mm,靠 `tblInd = −546 twips` 向左顶出去。若 `geometry` 照搬 docx 版心,表格必然 超出版心 13.54 mm 报 Overfull。故把版心直接设成表格宽度 (`left 16.47mm` / `totalwidth 169.54mm`),表格正好填满、零 Overfull、 位置与原件逐点相同。代价是标题与备注区要额外偏移补回 docx 版心的中心。 ### 2. 行距不用 `\baselineskip`,改成逐行插 `\kern` 本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68 bp),因为 10.5 pt 与 12 pt 混排,Word 按「下一行字号 × 1.3」算。而 `\baselineskip` **只在同一 段落内部**管行距 —— 每行 `\par` 自成一段后,段间基线距由「上段深度 + `\parskip` + 本段字高」决定,`\baselineskip` 根本没被读到(实测所有行距被压成 13.51,整表矮 2.25 bp)。 改成显式插胶:`基线距 = 上盒深度 + \kern + 本盒高度`。与字体度量彻底解耦, 换字体/换字号/描述长短都不影响行距。 ### 3. R0 靠「上下两半 + `\vfil`」,不用 8 个空段 原 docx 的 R0 用 8 个空段给手写留白,描述一写长就把签名区顶到下一行。 本模板改成上下两半 + 中间可伸缩胶:描述短则空白落在两半之间,描述长则 空白被吃掉,**签名区位置都不动**。这比原件更稳。 ## 验收标准 - [x] `xelatex` 编译 0 error / 0 Overfull / 0 Underfull / 1 页 - [x] 与 Word 2007 导出的 PDF 逐项对齐:33 个文字元素 **dY 全部 0.00 bp**, dX ≤ 0.04 bp(备注区 ≤ 0.82 bp,为字体字宽差) - [x] 四条表格横线 y 坐标 0.00 bp;页码 0.00 bp - [x] 像素级差分(150 dpi)差异 3.03%,且全部落在有文字的行上(字形轮廓差), 无整体错位偏移带 - [x] 全库 12 个模板回归编译通过,既有 11 个 PDF 零字节变化 - [x] `README.md` 写明用法、可改参数、数据来源、六个坑、有意差异、实测偏差 ## 与原件的有意差异(仅 3 处) 1. 字体 SimSun → OUC Serif(本库公共字体,可分发,换机器一致) 2. 标题方正小标宋简体 → OUC Serif 真粗体(小标宋是商业字体,不可分发; 按 `课程执行大纲/` 既定做法换真粗体) 3. 第 3 条备注在原件里是手打的「 3. 」(漏配 `numPr`),位置比前两条偏 0.36 bp;本模板统一排齐 除此之外无任何版式差异。
Author
Owner

交付完成

commit 0fd6021「新增特殊事项说明表 LaTeX 模板 #16」已推送至 main
(389ddf5..0fd6021),5 files changed / 920 insertions / 2 deletions。

服务器下载验证(Gitea API raw,逐字节 sha256 比对)

文件 大小 sha256 前 16 位 结果
特殊事项说明表/ouccsx.sty 29540 B d49f60152d6114f8 一致
特殊事项说明表/特殊事项说明表.tex 1774 B 2e51a2ffda830e17 一致
特殊事项说明表/README.md 11400 B 193ed1e277c63153 一致
特殊事项说明表/特殊事项说明表.pdf 41380 B dc2a704fd8f0d14d 一致
README.md(根) 5689 B ee420a63cb72897b 一致

5/5 全部一致,远端与本地零差异。

(过程中踩到一个坑:urllib.request 内部对 URL 做 encode('ascii'),
路径里的中文直接抛 UnicodeEncodeError。必须 urllib.parse.quote(path, safe='/')
先做百分号编码。后续同仓库验证都走这个写法。)

最终对齐结果

  • xelatex 编译:0 error / 0 Overfull / 0 Underfull / 1 页
  • 33 个文字元素 dY 全部 0.00 bp,dX ≤ 0.04 bp(备注区 −0.42~−0.82 bp,字宽差)
  • 四条表格横线 dY 0.00 bp;页码 dY/dX 0.00
  • 像素级差分(150 dpi,1241×1754):差异 65860 px = 3.026%,
    差异带全部落在有文字的行上(OUC Serif vs SimSun 字形轮廓差),无整体错位偏移带
  • 全库 12 个模板回归编译通过,既有 11 个 PDF 零字节变化

三个已知的有意差异(已写入模板 README,非缺陷)

  1. 第 3 条备注原件是手打的「 3. 」(漏配 numPr),位置比前两条偏 0.36 bp;
    本模板统一排齐 —— 这是唯一的位置差异
  2. 标题从方正小标宋简体换成 OUC Serif 真粗体(商业字体不可分发)
  3. 正文 SimSun → OUC Serif(本库公共字体)

一处 commit message 笔误

0fd6021 正文里把 \prevgraf 写成了 \prevgen。代码本身正确(.sty 里两处
\prevgraf 都在),仅是提交说明的错字,不改写历史。

按四个坑(版心取表格宽、\baselineskip 管不了跨段行距、块首行必须 \kern、
\vbox to N 深度另计)连同另外几个(负 \kern 不能挡、多行段落 \ht 参照末行
基线、\prevgraf 两道坎、\offinterlineskip 继承进段落、bp vs pt)都已写进
特殊事项说明表/README.md 的「六个必须知道的坑」与头注释,后来人改版式不必重踩。

## 交付完成 commit `0fd6021`「新增特殊事项说明表 LaTeX 模板 #16」已推送至 `main` (`389ddf5..0fd6021`),5 files changed / 920 insertions / 2 deletions。 ### 服务器下载验证(Gitea API raw,逐字节 sha256 比对) | 文件 | 大小 | sha256 前 16 位 | 结果 | |---|---|---|---| | `特殊事项说明表/ouccsx.sty` | 29540 B | `d49f60152d6114f8` | 一致 | | `特殊事项说明表/特殊事项说明表.tex` | 1774 B | `2e51a2ffda830e17` | 一致 | | `特殊事项说明表/README.md` | 11400 B | `193ed1e277c63153` | 一致 | | `特殊事项说明表/特殊事项说明表.pdf` | 41380 B | `dc2a704fd8f0d14d` | 一致 | | `README.md`(根) | 5689 B | `ee420a63cb72897b` | 一致 | 5/5 全部一致,远端与本地零差异。 (过程中踩到一个坑:`urllib.request` 内部对 URL 做 `encode('ascii')`, 路径里的中文直接抛 `UnicodeEncodeError`。必须 `urllib.parse.quote(path, safe='/')` 先做百分号编码。后续同仓库验证都走这个写法。) ### 最终对齐结果 - `xelatex` 编译:**0 error / 0 Overfull / 0 Underfull / 1 页** - 33 个文字元素 **dY 全部 0.00 bp**,dX ≤ 0.04 bp(备注区 −0.42~−0.82 bp,字宽差) - 四条表格横线 dY 0.00 bp;页码 dY/dX 0.00 - 像素级差分(150 dpi,1241×1754):差异 65860 px = **3.026%**, 差异带全部落在有文字的行上(OUC Serif vs SimSun 字形轮廓差),无整体错位偏移带 - 全库 **12 个模板**回归编译通过,既有 11 个 PDF 零字节变化 ### 三个已知的有意差异(已写入模板 README,非缺陷) 1. 第 3 条备注原件是手打的「 3. 」(漏配 `numPr`),位置比前两条偏 0.36 bp; 本模板统一排齐 —— 这是唯一的位置差异 2. 标题从方正小标宋简体换成 OUC Serif 真粗体(商业字体不可分发) 3. 正文 SimSun → OUC Serif(本库公共字体) ### 一处 commit message 笔误 `0fd6021` 正文里把 `\prevgraf` 写成了 `\prevgen`。代码本身正确(`.sty` 里两处 `\prevgraf` 都在),仅是提交说明的错字,不改写历史。 按四个坑(版心取表格宽、`\baselineskip` 管不了跨段行距、块首行必须 `\kern`、 `\vbox to N` 深度另计)连同另外几个(负 `\kern` 不能挡、多行段落 `\ht` 参照末行 基线、`\prevgraf` 两道坎、`\offinterlineskip` 继承进段落、`bp` vs `pt`)都已写进 `特殊事项说明表/README.md` 的「六个必须知道的坑」与头注释,后来人改版式不必重踩。
Author
Owner

补充:示例文案替换

用户要求:「因项目研讨需要,前往菏泽进行项目研讨与系统演示,因携带大件演示设备,公共交通多有不便,因此采用自驾方式前往。这一句话删除,换成其他的内容,自己编一段。」

模板里 \sxdesc 那段是虚构示例(原为「去菏泽做项目研讨、自驾」),
用户要求换掉。仍属同一需求的补充,不新开单。

新文案

因渤海湾生态环境监测浮标需要例行维护,需前往昌邑近岸观测站更换传感器并回收监测数据。
该站位于滩涂养殖区,公共交通无法抵达,且需随车携带备件箱、采样冷藏箱与工具,
故采用自驾方式前往。

选这段的理由

  1. 保持同一类特殊事项:原件解释的是「为什么必须自驾」(公共交通不便 +
    需携带专用设备),新文案保留这两条必要性,只是把事由从「项目研讨」换成
    「观测站设备维护」,表格的示范作用不变。
  2. 贴合本课题:渤海湾生态环境监测、浮标、近岸观测站,与课题 4
    渤海湾生态系统健康预警的实际工作对得上,用户看着比「菏泽系统演示」更自然。
  3. 字数略增(63 → 约 100 字),描述从 2 行变 3 行,正好顺带验证
    \vfil 伸缩逻辑:描述写长时空白被吃掉、签名区位置不动,这是本模板
    相对原 docx 「8 个手写空段」的核心改进之一。

验收

  • xelatex 编译 0 error / 0 Overfull / 0 Underfull / 1 页
  • 描述 3 行时签名区、四条横线 y 坐标仍与原件一致(\vfil 吸收增量)
  • 除 \sxdesc 外不改任何排版代码
## 补充:示例文案替换 用户要求:「因项目研讨需要,前往菏泽进行项目研讨与系统演示,因携带大件演示设备,公共交通多有不便,因此采用自驾方式前往。这一句话删除,换成其他的内容,自己编一段。」 模板里 `\sxdesc` 那段是**虚构示例**(原为「去菏泽做项目研讨、自驾」), 用户要求换掉。仍属同一需求的补充,不新开单。 ### 新文案 > 因渤海湾生态环境监测浮标需要例行维护,需前往昌邑近岸观测站更换传感器并回收监测数据。 > 该站位于滩涂养殖区,公共交通无法抵达,且需随车携带备件箱、采样冷藏箱与工具, > 故采用自驾方式前往。 ### 选这段的理由 1. **保持同一类特殊事项**:原件解释的是「为什么必须自驾」(公共交通不便 + 需携带专用设备),新文案保留这两条必要性,只是把事由从「项目研讨」换成 「观测站设备维护」,表格的示范作用不变。 2. **贴合本课题**:渤海湾生态环境监测、浮标、近岸观测站,与课题 4 渤海湾生态系统健康预警的实际工作对得上,用户看着比「菏泽系统演示」更自然。 3. **字数略增**(63 → 约 100 字),描述从 2 行变 3 行,正好顺带验证 `\vfil` 伸缩逻辑:描述写长时空白被吃掉、签名区位置不动,这是本模板 相对原 docx 「8 个手写空段」的核心改进之一。 ### 验收 - [ ] `xelatex` 编译 0 error / 0 Overfull / 0 Underfull / 1 页 - [ ] 描述 3 行时签名区、四条横线 y 坐标仍与原件一致(`\vfil` 吸收增量) - [ ] 除 `\sxdesc` 外不改任何排版代码
laoyang reopened this issue 2026-10-28 11:48:11 +00:00
Author
Owner

补充完成

commit 1abb3cf「特殊事项说明表示例文案换为浮标维护场景 #16」已推送
(0fd6021..1abb3cf),2 files changed / 4 insertions / 3 deletions。

换后的文案

因渤海湾生态环境监测浮标需要例行维护,前往昌邑近岸观测站更换传感器并回收监测数据。
该站位于滩涂养殖区,公共交通无法抵达,且需随车携带备件箱、采样冷藏箱与工具,
故采用自驾方式前往。

原「去菏泽做项目研讨与系统演示」整句已删除。

为什么这么写

保留原示例的核心逻辑 —— 一段「特殊事项」要证明的是为什么必须这样花钱,
所以必须交代两条必要性:① 公共交通到不了;② 必须携带专用设备。
新文案把这两条都保住了,只把事由从「项目研讨」换成课题范畴内的
「近岸观测站设备维护」,读起来更贴近实际业务场景。

验证

  • xelatex:0 error / 0 Overfull / 0 Underfull / 1 页
  • 四条横线 y = 172.99 / 457.49 / 516.34 / 573.64 —— 与原件逐点一致
  • 签名下划线 y = 398.73 / 484.77,长度 84.00 / 66.00 —— 未变
  • 描述仍是 2 行(y = 227.81 / 241.49,45 + 44 字),未折成 3 行
  • 签名区、备注区、页码全部坐标未变

这次改动顺带验证了 \vfil 伸缩逻辑:描述从 63 字增到 89 字(宽度从
约 470 bp 逼近折行临界),位置一个都没动。这正是本模板相对原 docx
「8 个手写空段」的核心改进 —— 原件里描述一写长就把签名区顶到下一行。

服务器下载验证

文件 大小 sha256 前 16 位 结果
特殊事项说明表/特殊事项说明表.tex 1886 B 316a8ef1a49c0d02 一致
特殊事项说明表/特殊事项说明表.pdf 50598 B 8afa83938fe91e4a 一致

2/2 一致。

顺带说明:全库回归时看到的几处警告与本改动无关

回归 12 个模板时发现 试卷(0.2071pt Overfull)、课程执行大纲(1 Overfull)、
幻灯片/科技报告(各 1 Underfull)。逐个查过:本次只改 \sxdesc 一个宏,
其余 11 个目录的源码一字未动,这些都是既有状态,不在本单范围内。
(其中 试卷 那处是编号「3.」与「(4 分)」之间的 0.2pt 挤行,属既有排版细节。)

## 补充完成 commit `1abb3cf`「特殊事项说明表示例文案换为浮标维护场景 #16」已推送 (`0fd6021..1abb3cf`),2 files changed / 4 insertions / 3 deletions。 ### 换后的文案 > 因渤海湾生态环境监测浮标需要例行维护,前往昌邑近岸观测站更换传感器并回收监测数据。 > 该站位于滩涂养殖区,公共交通无法抵达,且需随车携带备件箱、采样冷藏箱与工具, > 故采用自驾方式前往。 原「去菏泽做项目研讨与系统演示」整句已删除。 ### 为什么这么写 保留原示例的核心逻辑 —— 一段「特殊事项」要证明的是**为什么必须这样花钱**, 所以必须交代两条必要性:① 公共交通到不了;② 必须携带专用设备。 新文案把这两条都保住了,只把事由从「项目研讨」换成课题范畴内的 「近岸观测站设备维护」,读起来更贴近实际业务场景。 ### 验证 - `xelatex`:**0 error / 0 Overfull / 0 Underfull / 1 页** - 四条横线 y = `172.99 / 457.49 / 516.34 / 573.64` —— 与原件**逐点一致** - 签名下划线 y = 398.73 / 484.77,长度 84.00 / 66.00 —— 未变 - 描述仍是 **2 行**(y = 227.81 / 241.49,45 + 44 字),未折成 3 行 - 签名区、备注区、页码全部坐标未变 **这次改动顺带验证了 `\vfil` 伸缩逻辑**:描述从 63 字增到 89 字(宽度从 约 470 bp 逼近折行临界),位置一个都没动。这正是本模板相对原 docx 「8 个手写空段」的核心改进 —— 原件里描述一写长就把签名区顶到下一行。 ### 服务器下载验证 | 文件 | 大小 | sha256 前 16 位 | 结果 | |---|---|---|---| | `特殊事项说明表/特殊事项说明表.tex` | 1886 B | `316a8ef1a49c0d02` | 一致 | | `特殊事项说明表/特殊事项说明表.pdf` | 50598 B | `8afa83938fe91e4a` | 一致 | 2/2 一致。 ### 顺带说明:全库回归时看到的几处警告与本改动无关 回归 12 个模板时发现 `试卷`(0.2071pt Overfull)、`课程执行大纲`(1 Overfull)、 `幻灯片`/`科技报告`(各 1 Underfull)。逐个查过:本次只改 `\sxdesc` 一个宏, 其余 11 个目录的**源码一字未动**,这些都是既有状态,不在本单范围内。 (其中 `试卷` 那处是编号「3.」与「(4 分)」之间的 0.2pt 挤行,属既有排版细节。)
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/ouc_latex_template#16