用户反馈四点,逐条修。
## ① 会议时间与会议地点位置错乱
**现象**:两个字挤在一起,中间没有留填写区。
**根因**: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
162 lines
5.1 KiB
Markdown
162 lines
5.1 KiB
Markdown
# 会议预算表
|
||
|
||
中国海洋大学会议预算表 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 填写。
|
||
不含任何真实数据。 |