Files
ouc_latex_template/会议预算表/README.md
T
laoyang f42e6e398a 会议预算表:修正四处排版问题 #24
用户反馈四点,逐条修。

## ① 会议时间与会议地点位置错乱

**现象**:两个字挤在一起,中间没有留填写区。

**根因**:tabularray 的 cell{} 合并位置决定标签落在哪一格,
不是"第几个字"。R2 的合并是 2+2+2+1,即
   格1(列1-2)=会议时间   格3(列3-4)=空值
   格5(列5-6)=会议地点   格7(列7)=空值
「会议地点」必须写在第 5 段,我原先写在第 3 段。

**顺带查清 tabularray 的一个静默失败**(最小复现):
写 7 段 `甲 & & 乙 & & 丙 & & 丁` → 四个字全对
写 4 段 `甲 & 乙 & 丙 & 丁`         → **乙、丁 被吞掉,不报错**
⇒ 段数必须等于列数,被合并的格留空。

**修正**:`会议时间 & & & & 会议地点 & & \\`
实测:会议时间 x=118.6(列1-2),会议地点 x=324.1(列5-6),
中间 193~289 是填写区。

## ② 其他费用应为竖排,不是旋转 90°

**根因**:`\rotatebox{90}` 只是把横排整句转个角度,
不是"上下排列"。用户要的是逐字竖着叠。

**修正**:改 `\shortstack{其\\[17bp]他\\[17bp]费\\[17bp]用}`,
并用 `cell{21}{1}={r=5}{c}` 做纵向合并 5 行。

实测:格高 82bp(y 517.9~611.7),四字 y=517.7/546.4/574.6/602.9,
字距 28.7bp,基本填满。

⚠️ 拉字距**不能**用局部 `\baselineskip` —— `\shortstack` 内部会重置它,
实测设 19bp 完全无效(字距仍是 11.6bp)。必须在 `\\` 上给可选参数。
⚠️ 也**不能**用 `\parbox{}{其\\他\\费\\用}` —— 会变成 4 个独立行盒子,
tabularray 排版错乱,四个字跑到不同段落(实测)。

⚠️ 之前认为「纵向合并和横向合并不能共存」,那是因为写在内容里用
`\SetCell[r=n]`;改用 cell{} 矩阵语法后**可以共存**,本条即证据。
第 2 节的说法已相应更正。

## ③ 校级领导意见是多余的

**先核实**:源 .doc 的 R26 第二格里**确实有两个段落**——
「所在单位负责人意见:」和「校级领导意见:」。
用 LibreOffice 直接转 txt 核过,原文件就有,不是转换时多出来的。

**但用户确认这份表不需要校级领导,故删除。**

代码里注明了原文件有两个段落,要恢复时加回来且必须单独一行。

## 顺带

去掉 `\RequirePackage{graphicx}` —— 不再用 \rotatebox,减少一个依赖。

## 验证

   1 页   error 0   Overfull 0   Underfull 0
   表格 155.52mm / 版心 155.99mm  界内
   最右 521.58(版心止 521.57)  最下 722.27(版心底 742.65)
   校级领导意见 出现 0 次
   会议时间/会议地点 相距 205bp 中间留空

全库 15/15 通过。双端一致:
   WSL TeX Live 2025     1 页 err=0 over=0 under=0
   Windows TeX Live 2022  1 页 err=0 over=0 under=0
2026-10-30 20:11:50 +08:00

162 lines
5.1 KiB
Markdown
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.
# 会议预算表
中国海洋大学会议预算表 LaTeX 模板(空表,可印刷手填)。
## 来源
用户从微信收到的 `会议预算表.doc`(51712 字节,**OLE2 老式 .doc**,
`D0CF11E0` 签名,不是伪装成 .doc 的 docx)。
python-docx 读不了老格式,处理链路是:
```
.doc --(LibreOffice headless)--> .docx --(python-docx)--> 结构
```
```bash
soffice --headless --convert-to docx --outdir . 会议预算表.doc
```
## 编译
```bash
cd 会议预算表
xelatex 会议预算表.tex # 单次即可,无交叉引用
```
或仓库根:`bash build.sh 会议预算表`
## 文件
| 文件 | 作用 |
|---|---|
| `oucmeeting.sty` | 版式包(页面、字体、表格环境 + 全部合并规则) |
| `会议预算表.tex` | 空表正文(只有内容,无任何 `\SetCell`) |
| `README.md` | 本文件 |
## 版式参数(实测)
```
页面 A4 210 × 297 mm
边距 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
```
四个边距都不常见,是原表为把 28 行塞进一页压出来的。照抄,不"优化"。
## 表格结构
7 列基准网格,原 docx 的 `tblGrid` 是
`[424, 2054, 790, 1262, 2056, 209, 2793]` twips = 169.12mm,
比分宽出版心 13.12mm(原文件靠 fixed 布局硬撑、压进页边距)。
→ 本模板等比缩到版心内,列宽
`[7.48, 36.23, 13.93, 22.26, 36.27, 3.69, 49.27] × 0.9224`。
28 行合并结构:
| 行 | 内容 | 跨度 |
|---|---|---|
| 1 | 会议名称 | 2+5 |
| 2 | 会议时间 / 会议地点 | 2+2+2+1 |
| 3 | 会议类型(三选一) | 2+5 |
| 4 | 参会人数 | 2+5 |
| 5 | 会议支出项目卡号 | 2+5 |
| 6 | 会议内容 | 2+5 |
| 7 | **会议收入预算**(分节) | 跨 7 |
| 8 | 收入项目 / 经费卡号 / 金额 / 备注 | 2+2+2+1 |
| 9~13 | 会务费收入 / 科研经费 / 财政拨款专项 / 学校预算 / 其他 | 2+2+2+1 |
| 14 | 合计 | 2+2+2+1 |
| 15 | **会议支出预算**(分节) | 跨 7 |
| 16 | 支出项目 / 预算金额 / 实际支出 | 3+2+2 |
| 17~20 | 专家咨询费 / 城市间交通费 / 住宿费 / 伙食费 | 3+2+2 |
| 21~25 | **其他费用**(竖排)+ 交通费 / 印刷费 / 会议室 / 补助 / 其他 | 1+2+2+2 |
| 26 | 合计 | 3+2+2 |
| 27 | 意见栏 | 3+4 |
| 28 | 签字栏 | 3+4 |
## ⚠️ 三个必须知道的坑
### 1. 合并单元格必须用矩阵式语法,不能用 `\SetCell`
在本表的 7 列 `Q[c,m,wd=…]` + `colsep=1.0mm` 配置下,
一旦在单元格内容里写 `\SetCell[c=n]`,编译立刻报:
```
! Missing number, treated as zero.
! Illegal unit of measure (pt inserted.)
\__dim_eval_end:
```
**所有错误都定位到 `\end{tblr}`**,完全看不出是哪个格。最小复现:
```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} % 必崩
```
✅ 正确写法 —— 在 tblr 选项里用 `cell{行}{列}={c=n}{对齐}`:
```latex
\begin{tblr}{
colspec={...},
cell{1}{1}={c=2}{c},
cell{1}{3}={c=5}{l},
}
A & & B & & & & \\ % 被合并掉的格留空
\end{tblr}
```
被合并掉的格**留空**(写 `& &`),不要写 `{}`。
好处:合并关系与内容彻底分离,改内容不会破坏结构。
### 2. `\SetCell[r=n]` 与 `\SetCell[c=m]` 不能在同一行
纵向合并和横向合并同时出现,报同样那串错。
本表因此全部改用 `cell{}` 矩阵语法(含纵向合并 `cell{21}{1}={r=5}{c}`)。
「其他费用」用 `\shortstack{其\\[17bp]他\\[17bp]费\\[17bp]用}` 逐字竖排,
**不是** `\rotatebox{90}` 旋转——旋转只是把横排整句转个角度,
不是"上下排列"。字距 `\\[17bp]` 让四个字撑满 5 行高(约 82bp)。
⚠️ 拉字距不能用局部 `\baselineskip`——`\shortstack` 内部会重置它,
实测设 19bp 完全无效(字距仍是 11.6bp)。必须在 `\\` 上给可选参数。
⚠️ 也不能用 `\parbox{}{其\\他\\费\\用}`——那会变成 4 个独立行盒子,
tabularray 排版错乱,四个字跑到不同段落。
### 3. colspec / hline / vline / ht 的参数不能用宏
tabularray 用自带的展开器解析这些选项,遇到用户宏直接报
`! Undefined control sequence.`。全部写字面值。
## 页高预算(重要)
28 行 × 行高 + 标题区 + 说明,必须 ≤ 223.98mm:
```
28 × 5.6mm = 156.8mm
标题区(附件1 + 22pt 标题 + 日期行)≈ 30mm
说明 3 条(其中第 2 条两行)≈ 35mm
合计 ≈ 222mm ✅ 刚好放进一页
```
⚠️ 行高 5.6mm 是**下限附近**。若把行高改回 6.0mm,28 行多出 11.2mm,
第 3 条说明就会被挤到第 2 页。改行高前先算这笔账。
## 验证
```
1 页 error 0 Overfull 0 Underfull 0
表格 155.52mm,版心 155.99mm → 在界内
内容 50 项逐项核对,全部存在
双端一致:WSL TeX Live 2025 / Windows TeX Live 2022
```
## 说明
这是**空表**。金额、卡号、日期、人名一律留空,供下载后手填或转 Word 填写。
不含任何真实数据。