新增《中国海洋大学会议预算表》LaTeX 模板 #24

Closed
opened 2026-10-30 08:20:32 +00:00 by laoyang · 1 comment
Owner

新增《中国海洋大学会议预算表》LaTeX 模板(基于微信收到的 .doc)

用户诉求

用户原话:「@"会议预算表.doc" 转成latex模式」

源文件

D:\Yongquan\xwechat_files\wxid_w49hh5v4f8tk22_9ca3\msg\file\2026-10\会议预算表.doc

  • 51712 字节,真正的 OLE2 老式 .doc(D0CF11E0 签名),不是伪装 docx
  • python-docx 读不了,先用 LibreOffice 转 docx 再解析

源文档结构

6 个段落 + 1 个表格:

P0  附件1                           (左上角小字)
P1  中国海洋大学会议预算表            22pt 居中
P2  填表日期:  年  月  日    金额单位:  元
表0  28 行 × 7 列                 (主体)
P3~P5  说明 1/2/3                  9pt

表 0 逐行结构(含合并)

基础网格 7 列,宽 [424, 2054, 790, 1262, 2056, 209, 2793] twips
= [7.48, 36.23, 13.93, 22.26, 36.26, 3.69, 49.26] mm,合计 169.12mm

行 内容 合并
R0 会议名称 | 空 左跨2、右跨5
R1 会议时间 | 空 | 会议地点 | 空 各跨2 / 2 / 2 / 1
R2 会议类型 | 三选一 左跨2、右跨5
R3 参会人数 | 总数__人(代表__;工作__;外宾__) 左跨2、右跨5
R4 会议支出项目卡号 | 空 左跨2、右跨5
R5 会议内容 | 空 左跨2、右跨5
R6 会议收入预算 跨全 7 列(分节标题)
R7 收入项目 | 项目经费卡号 | 金额 | 备注 2/2/2/1
R8 会务费收入 | | | 每人___元 2/2/2/1
R9~R12 科研经费 / 财政拨款会议专项经费 / 学校预算经费 / 其他 同上
R13 合计 同上
R14 会议支出预算 跨全 7 列(分节标题)
R15 支出项目 | 预算金额 | 实际支出金额(由财务处填写) 3/2/2
R16~R19 专家咨询费 / 城市间交通费 / 住宿费 / 伙食费 3/2/2
R20 其他费用(竖排合并 5 行)| 交通费 | | 1+2 / 2 / 2
R21~R24 (续上)会议资料印刷费 / 会议室使用费 / 工作人员补助 / 其他 1+2 / 2 / 2
R25 合计 3/2/2
R26 经费(项目)负责人意见:| 所在单位负责人意见:\n校级领导意见: 3/4
R27 (签字)| (签字)(盖章) 3/4

版式参数(实测)

页面    210.01 × 297.00 mm(A4)
边距    top 38.01 / bottom 35.01 / left 28.01 / right 26.00 mm
表格    tblW 9588 dxa = 169.12mm,fixed 布局
单元格内边距 上下 0 twips(贴边)
行高    R26 567 exact = 10mm
字号    正文 9pt(47 处)、标题 22pt(1 处)

⚠️ 表格 169.12mm 而版心只有 210-28.01-26.00 = 156mm,超宽 13.12mm。
原 docx 靠 fixed 布局硬撑,会压进右侧页边距。
本模板按比例收到版心宽度内(缩放系数 156/169.12 = 0.9225),
并在 README 记录这一处调整。

实现方案

目录 会议预算表/,与 课程大纲/、课程执行大纲/ 同风格:

  • oucmeeting.sty —— 版式包
  • 会议预算表.tex —— 示例(空表,仅保留表头与项目名,金额留空)
  • README.md —— 用法说明

表格实现

用 tabularray,7 列基准网格:

  • \SetCell[c=n] 做横向合并
  • \SetCell[r=n] 做「其他费用」的纵向合并
  • 单元格内边距上下午 0(与原文件一致)

⚠️ #23 踩过的坑:\SetCell[c=n]{c} 内容 & 下一格 会吞掉下一格,
必须用 {} 占位。本模板的合并不规则,尤其要注意。

字体

取自 ../fonts.tex(OUC Serif),与仓库其他模板一致。
原文件用的宋体/黑体不必照抄商业字体。

内容

示例保持空表形态(这是"预算表"模板,不是填好的表):

  • 各项目名称要印全
  • 金额、卡号、日期留空
  • 说明文字 1/2/3 照抄

验收标准

  1. xelatex 编译:error 0
  2. 28 行 × 7 列,所有合并单元格位置正确
  3. 「其他费用」竖排合并 5 行正确
  4. 表格总宽不超版心,无 Overfull
  5. 所有项目名称完整(逐项核对,特别注意合并处不吞字)
  6. 双端一致(WSL TeX Live 2025 / Windows TeX Live 2022)
  7. 加入 verify_all.sh TARGETS,全库 14 → 15 项

不做

  • 不改源 .doc
  • 不做通用 doc→latex 转换器
  • 不填任何实际金额(保持空表)
新增《中国海洋大学会议预算表》LaTeX 模板(基于微信收到的 .doc) ## 用户诉求 用户原话:「@"会议预算表.doc" 转成latex模式」 ## 源文件 `D:\Yongquan\xwechat_files\wxid_w49hh5v4f8tk22_9ca3\msg\file\2026-10\会议预算表.doc` - 51712 字节,**真正的 OLE2 老式 .doc**(`D0CF11E0` 签名),不是伪装 docx - python-docx 读不了,先用 LibreOffice 转 docx 再解析 ## 源文档结构 6 个段落 + 1 个表格: ``` P0 附件1 (左上角小字) P1 中国海洋大学会议预算表 22pt 居中 P2 填表日期: 年 月 日 金额单位: 元 表0 28 行 × 7 列 (主体) P3~P5 说明 1/2/3 9pt ``` ### 表 0 逐行结构(含合并) 基础网格 7 列,宽 `[424, 2054, 790, 1262, 2056, 209, 2793]` twips = `[7.48, 36.23, 13.93, 22.26, 36.26, 3.69, 49.26]` mm,合计 169.12mm | 行 | 内容 | 合并 | |---|---|---| | R0 | 会议名称 \| 空 | 左跨2、右跨5 | | R1 | 会议时间 \| 空 \| 会议地点 \| 空 | 各跨2 / 2 / 2 / 1 | | R2 | 会议类型 \| 三选一 | 左跨2、右跨5 | | R3 | 参会人数 \| 总数__人(代表__;工作__;外宾__) | 左跨2、右跨5 | | R4 | 会议支出项目卡号 \| 空 | 左跨2、右跨5 | | R5 | 会议内容 \| 空 | 左跨2、右跨5 | | R6 | **会议收入预算** | 跨全 7 列(分节标题) | | R7 | 收入项目 \| 项目经费卡号 \| 金额 \| 备注 | 2/2/2/1 | | R8 | 会务费收入 \| \| \| 每人___元 | 2/2/2/1 | | R9~R12 | 科研经费 / 财政拨款会议专项经费 / 学校预算经费 / 其他 | 同上 | | R13 | 合计 | 同上 | | R14 | **会议支出预算** | 跨全 7 列(分节标题) | | R15 | 支出项目 \| 预算金额 \| 实际支出金额(由财务处填写) | 3/2/2 | | R16~R19 | 专家咨询费 / 城市间交通费 / 住宿费 / 伙食费 | 3/2/2 | | R20 | **其他费用**(竖排合并 5 行)\| 交通费 \| \| | 1+2 / 2 / 2 | | R21~R24 | (续上)会议资料印刷费 / 会议室使用费 / 工作人员补助 / 其他 | 1+2 / 2 / 2 | | R25 | 合计 | 3/2/2 | | R26 | 经费(项目)负责人意见:\| 所在单位负责人意见:\n校级领导意见: | 3/4 | | R27 | (签字)\| (签字)(盖章) | 3/4 | ## 版式参数(实测) ``` 页面 210.01 × 297.00 mm(A4) 边距 top 38.01 / bottom 35.01 / left 28.01 / right 26.00 mm 表格 tblW 9588 dxa = 169.12mm,fixed 布局 单元格内边距 上下 0 twips(贴边) 行高 R26 567 exact = 10mm 字号 正文 9pt(47 处)、标题 22pt(1 处) ``` ⚠️ **表格 169.12mm 而版心只有 210-28.01-26.00 = 156mm,超宽 13.12mm。** 原 docx 靠 fixed 布局硬撑,会压进右侧页边距。 本模板按比例收到版心宽度内(缩放系数 156/169.12 = 0.9225), 并在 README 记录这一处调整。 ## 实现方案 目录 `会议预算表/`,与 `课程大纲/`、`课程执行大纲/` 同风格: - `oucmeeting.sty` —— 版式包 - `会议预算表.tex` —— 示例(空表,仅保留表头与项目名,金额留空) - `README.md` —— 用法说明 ### 表格实现 用 tabularray,7 列基准网格: - `\SetCell[c=n]` 做横向合并 - `\SetCell[r=n]` 做「其他费用」的纵向合并 - 单元格内边距上下午 0(与原文件一致) ⚠️ #23 踩过的坑:`\SetCell[c=n]{c} 内容 & 下一格` 会吞掉下一格, 必须用 `{}` 占位。本模板的合并不规则,尤其要注意。 ### 字体 取自 `../fonts.tex`(OUC Serif),与仓库其他模板一致。 原文件用的宋体/黑体不必照抄商业字体。 ### 内容 示例保持空表形态(这是"预算表"模板,不是填好的表): - 各项目名称要印全 - 金额、卡号、日期留空 - 说明文字 1/2/3 照抄 ## 验收标准 1. `xelatex` 编译:error 0 2. 28 行 × 7 列,所有合并单元格位置正确 3. 「其他费用」竖排合并 5 行正确 4. 表格总宽不超版心,无 Overfull 5. 所有项目名称完整(逐项核对,特别注意合并处不吞字) 6. 双端一致(WSL TeX Live 2025 / Windows TeX Live 2022) 7. 加入 verify_all.sh TARGETS,全库 14 → 15 项 ## 不做 - 不改源 .doc - 不做通用 doc→latex 转换器 - 不填任何实际金额(保持空表)
Author
Owner

已完成,提交 1c67b7d

源文件处理链路

你给的是 会议预算表.doc,真正的 OLE2 老式 .doc(D0CF11E0 签名),
不是伪装成 .doc 的 docx。python-docx 读不了,所以走了:

.doc --(LibreOffice headless)--> .docx --(python-docx)--> 结构

新增 会议预算表/

会议预算表/oucmeeting.sty   版式包(含全部 28 行合并规则)
会议预算表/会议预算表.tex   空表正文
会议预算表/README.md        用法 + 踩坑记录

用法:bash build.sh 会议预算表

版式(全部从 OOXML 量出)

页面    A4 210×297mm
边距    top 38.01 / bottom 35.01 / left 28.01 / right 26.00 mm
版心    155.99 × 223.98 mm
字号    标题 22pt,表格与说明 9pt
表格    28 行 × 7 列,边框 0.5pt,行高 5.6mm

⚠️ 原表宽 169.12mm,比分宽出版心 13.12mm —— 原 docx 靠 fixed 布局
硬撑、实际压进左右页边距。本模板等比缩到版心内。

三个坑,第一个吃了最多时间

① 合并必须用矩阵式语法,不能写 \SetCell

在这套 7 列 Q[c,m,wd=…] + colsep 配置下,内容里一写 \SetCell[c=n] 就报:

! Missing number, treated as zero.
! Illegal unit of measure (pt inserted.)
\__dim_eval_end:

所有错误都定位到 \end{tblr},完全看不出是哪个格。我试过
\shortstack、\rotatebox、\newline、补 {} 占位、改 colsep、
去掉纵向合并 —— 全都不对,因为一直以为是自己某个格写错了。

最后靠这个最小复现才定位:

\begin{tblr}{colspec={Q[c,m,wd=21mm]...7列..., colsep=0.8mm}}
  \SetCell[c=2]{c} A & \SetCell[c=5]{l} B \\
\end{tblr}   % 必崩

% 同样合并改用 cell{} 语法 → 0 错
\begin{tblr}{colspec={...}, cell{1}{1}={c=2}{c}, cell{1}{3}={c=5}{l}}
  A & & B & & & & \\
\end{tblr}

✅ 正解就是 cell{行}{列}={c=n}{对齐},被合并的格留空。
好处是合并关系与内容彻底分离,改内容不会破坏结构。

② \SetCell[r=n] 与 \SetCell[c=m] 不能同现

纵向 + 横向合并放同一行,报同样那串错。本表因此完全不用纵向合并——
「其他费用」改成 \rotatebox{90} 竖排,第 1 列下面 4 行留空,视觉等价。

③ colspec / hline / vline / ht 参数不能用宏

tabularray 用自带展开器解析,遇到用户宏直接 Undefined control sequence。
全部写字面值。

页高预算(这条值得记住)

28 × 5.6mm = 156.8mm
标题区 ≈ 30mm
说明 3 条(第 2 条占两行)≈ 35mm
合计 ≈ 222mm  ≤ 223.98mm  ✅ 刚好一页

⚠️ 5.6mm 已在下限附近。 改回 6.0mm 会让 28 行多出 11.2mm,
第 3 条说明立刻掉到第 2 页(实测过)。改行高前先算这笔账。

验证

1 页   error 0   Overfull 0   Underfull 0
表格 155.52mm / 版心 155.99mm  → 界内
内容 50 项逐项核对,全部存在
全库 bash build.sh all → 15/15 通过

唯一的"缺失"项是「不得坐支现金」——因为跨行被 \n 断开,
去空白后匹配通过,不是真缺失。

双端一致:

环境 结果
WSL TeX Live 2025 1 页 err=0 over=0 under=0
Windows TeX Live 2022 1 页 err=0 over=0 under=0

说明

这是空表,金额、卡号、日期、人名一律留空,供下载后手填。
不含任何真实数据。已加入 verify_all.sh,全库从 14 项变 15 项。

## 已完成,提交 `1c67b7d` ### 源文件处理链路 你给的是 `会议预算表.doc`,**真正的 OLE2 老式 .doc**(`D0CF11E0` 签名), 不是伪装成 .doc 的 docx。python-docx 读不了,所以走了: ``` .doc --(LibreOffice headless)--> .docx --(python-docx)--> 结构 ``` ### 新增 `会议预算表/` ``` 会议预算表/oucmeeting.sty 版式包(含全部 28 行合并规则) 会议预算表/会议预算表.tex 空表正文 会议预算表/README.md 用法 + 踩坑记录 ``` 用法:`bash build.sh 会议预算表` ### 版式(全部从 OOXML 量出) ``` 页面 A4 210×297mm 边距 top 38.01 / bottom 35.01 / left 28.01 / right 26.00 mm 版心 155.99 × 223.98 mm 字号 标题 22pt,表格与说明 9pt 表格 28 行 × 7 列,边框 0.5pt,行高 5.6mm ``` ⚠️ 原表宽 **169.12mm,比分宽出版心 13.12mm** —— 原 docx 靠 fixed 布局 硬撑、实际压进左右页边距。本模板等比缩到版心内。 ### 三个坑,第一个吃了最多时间 **① 合并必须用矩阵式语法,不能写 `\SetCell`** 在这套 7 列 `Q[c,m,wd=…]` + `colsep` 配置下,内容里一写 `\SetCell[c=n]` 就报: ``` ! Missing number, treated as zero. ! Illegal unit of measure (pt inserted.) \__dim_eval_end: ``` **所有错误都定位到 `\end{tblr}`**,完全看不出是哪个格。我试过 `\shortstack`、`\rotatebox`、`\newline`、补 `{}` 占位、改 `colsep`、 去掉纵向合并 —— 全都不对,因为一直以为是自己某个格写错了。 最后靠这个最小复现才定位: ```latex \begin{tblr}{colspec={Q[c,m,wd=21mm]...7列..., colsep=0.8mm}} \SetCell[c=2]{c} A & \SetCell[c=5]{l} B \\ \end{tblr} % 必崩 % 同样合并改用 cell{} 语法 → 0 错 \begin{tblr}{colspec={...}, cell{1}{1}={c=2}{c}, cell{1}{3}={c=5}{l}} A & & B & & & & \\ \end{tblr} ``` ✅ 正解就是 `cell{行}{列}={c=n}{对齐}`,被合并的格留空。 好处是合并关系与内容彻底分离,改内容不会破坏结构。 **② `\SetCell[r=n]` 与 `\SetCell[c=m]` 不能同现** 纵向 + 横向合并放同一行,报同样那串错。本表因此完全不用纵向合并—— 「其他费用」改成 `\rotatebox{90}` 竖排,第 1 列下面 4 行留空,视觉等价。 **③ `colspec` / `hline` / `vline` / `ht` 参数不能用宏** tabularray 用自带展开器解析,遇到用户宏直接 `Undefined control sequence`。 全部写字面值。 ### 页高预算(这条值得记住) ``` 28 × 5.6mm = 156.8mm 标题区 ≈ 30mm 说明 3 条(第 2 条占两行)≈ 35mm 合计 ≈ 222mm ≤ 223.98mm ✅ 刚好一页 ``` ⚠️ **5.6mm 已在下限附近。** 改回 6.0mm 会让 28 行多出 11.2mm, 第 3 条说明立刻掉到第 2 页(实测过)。改行高前先算这笔账。 ### 验证 ``` 1 页 error 0 Overfull 0 Underfull 0 表格 155.52mm / 版心 155.99mm → 界内 内容 50 项逐项核对,全部存在 全库 bash build.sh all → 15/15 通过 ``` 唯一的"缺失"项是「不得坐支现金」——因为跨行被 `\n` 断开, 去空白后匹配通过,不是真缺失。 **双端一致**: | 环境 | 结果 | |---|---| | WSL TeX Live 2025 | 1 页 err=0 over=0 under=0 | | Windows TeX Live 2022 | 1 页 err=0 over=0 under=0 | ### 说明 这是**空表**,金额、卡号、日期、人名一律留空,供下载后手填。 不含任何真实数据。已加入 `verify_all.sh`,全库从 14 项变 15 项。
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#24