会议预算表:修正四处排版问题 #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
This commit is contained in:
2026-10-30 20:11:50 +08:00
parent 1c67b7ded1
commit f42e6e398a
4 changed files with 58 additions and 10 deletions
+37 -6
View File
@@ -60,8 +60,20 @@
\begin{oucmeettable}
% ---- R1~R6 基本信息 ----
%
% ⚠️⚠️ 每行必须写满 7 段(6 个 `&`),被 cell{} 合并掉的格**留空**。
% 实测(最小复现):同样的 cell{} 配置下
% 写 7 段 `甲 & & 乙 & & 丙 & & 丁` → 四个字全部正确
% 写 4 段 `甲 & 乙 & 丙 & 丁` → **乙、丁 被吞掉**
% ⇒ 段数 ≠ 列数时,多出来的内容会静默丢失,不报错。
%
% ⚠️ 标签落在哪一格,取决于 cell{} 的合并位置,不是"第几个字":
% R2 的 cell 配置是 2+2+2+1,即
% 格1(列1-2)=会议时间 格3(列3-4)=空值 格5(列5-6)=会议地点 格7(列7)=空值
% 所以「会议地点」必须写在**第 5 段**,写在第 3 段就会挤到左边、
% 与「会议时间」贴在一起(踩过)。
会议名称 & & & & & & \\
会议时间 & & 会议地点 & & & & \\
会议时间 & & & & 会议地点 & & \\
% ⚠️ R3/R4 的填空横线用 \hspace 撑,宽度必须控制。
% 跨 5 列约 122mm,三个选项各带一对(\hspace{3em})就要 6×3em=18em
% 再加文字,实测撑到 529.7bp(版心止于 521.57),超 8bp。
@@ -93,10 +105,22 @@
住宿费 & & & & & & \\
伙食费 & & & & & & \\
% R21~R25:「其他费用」竖排,只写在第 1 列的第一行(R21),
% 下面 4 行该列留空。用 \rotatebox 真旋转,不用 \\ 换行
% (\\ 会被 tabularray 当成行结束,破坏整表)。
\rotatebox{90}{其他费用} & 交通费 & & & & & \\
% R21~R25:「其他费用」**逐字竖排**,占 5 行高(不是旋转 90°)
% 纵向合并由 sty 里的 cell{21}{1}={r=5}{c} 声明,
% 这里用 \shortstack 让四个字上下堆叠。
% ⚠️ 不能用 \rotatebox{90}:那只是把横排整句转个角度,
% 不是"上下排列"(#24 按用户意见修正)。
% ⚠️ \shortstack 里的 \\ 是**普通换行**,tabularray 在 cell{} 语法下
% 不会把它误当行结束(旧版 \SetCell 语法下会崩,那是另一个坑)。
%
% ★ 字距按 5 行高(约 82bp)拉开:四字之间有 3 个间隔,
% 基础行距 12bp + \\[17bp] ≈ 29bp/字,总高约 87bp,正好填满格高。
% 做法:给 \\ 加可选参数显式指定额外行距。
% ⚠️ 不能靠局部设 \baselineskip —— \shortstack 内部会重置它,
% 实测设 19bp 无效(字距仍是 11.6bp)。
% ⚠️ 也不能用 \parbox{}{其\\他\\费\\用} —— 那会变成 4 个独立行盒子,
% tabularray 排版错乱(实测四个字跑到不同 y 段落)。
\shortstack{其\\[17bp]他\\[17bp]费\\[17bp]用} & 交通费 & & & & & \\
& 会议资料印刷费 & & & & & \\
& 会议室使用费 & & & & & \\
& 工作人员补助 & & & & & \\
@@ -113,7 +137,14 @@
% ⇒ 该单元格内容必须能在一行内放下。「(签字) (盖章)」共 9 个全角字符
% ≈ 9×9bp = 81bp,跨 4 列约 96mm = 272bp,够放,只要 hspace 不太大。
% 给 3em(约 9.5mm)即可,手写签名空间足够。
经费(项目)负责人意见: & & & 所在单位负责人意见:\hspace*{4em}校级领导意见: & & & & \\
%
% ⚠️ 关于「校级领导意见」:源 .doc 的 R26 第二格里确实有**两个段落** ——
% 「所在单位负责人意见:」和「校级领导意见:」,不是转换时多出来的
% (用 LibreOffice 直接转 txt 核过,原文件就有)。
% 但用户确认这份表不需要校级领导,故按用户意见删除。
% ⚠️ 要恢复就把它加回来,且必须单独一行(源文件是两段,不是一行):
% 所在单位负责人意见:\\ 校级领导意见:
经费(项目)负责人意见: & & & 所在单位负责人意见: & & & & \\
\hfill(签字) & & & (签字)\hspace*{3em}(盖章) & & & & \\
\end{oucmeettable}