From e032aec228e0f3346b2206f162fa366c4514b068 Mon Sep 17 00:00:00 2001 From: laoyang Date: Mon, 26 Oct 2026 16:18:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=B3=E5=8A=A1=E5=8F=91?= =?UTF-8?q?=E6=94=BE=E8=AF=B4=E6=98=8E=E8=A1=A8=20LaTeX=20=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=EF=BC=88form2/=EF=BC=89#1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把实验室《劳务发放说明表》docx 复刻为 XeLaTeX 模板,与 exam/、form/ 同一套做法: 自包含子目录、版式逐项对齐原 docx、模板不含真人信息。 - form2/ouclw.sty 版式包:A4 + left=31.70mm + 表宽 150.32mm, 4 列 / 5 行、14pt 宋体、15.6pt 行距、0.5pt 边框、 1.905mm 单元格内边距,全部尺寸附 twips→mm 换算注释 - form2/劳务发放说明表.tex 主文件,填表只改 4 个变量 - form2/README.md 用法、换算表、四个坑、量化校验方法与实测数据 - README.md 目录表登记 form2/ 文字改写:原文「聘请秦依康等2位研究生参与《观测数据驱动的渤海生态系统健康 评估关键技术研发》项目的研究工作。」改为「聘请xxx等x位研究生参与《xxx》 项目的研究工作。」,句式未动;其余内容一律 × 占位。 量化验收(pdftocairo -svg + pdftotext -bbox): 表宽 150.137mm(目标 150.319,差 -0.18) 表左 31.662mm(目标 31.700,差 -0.04) R0 11.172 / R1 5.668 / R2 49.646 / R3 22.159 / R4 11.172 mm 全部达标 三个签字格标签基线、日期行基线完全重合 编译零错误、零 Overfull / Underfull,输出 1 页 本次踩到并记录在 README 的四个坑: 1. ctex 默认 \linespread≈1.3 会把 \fontsize{14}{15.6} 放大成 20.28pt 2. 合并格 {c} 是 LR 模式,不折行而是撑宽整表;\hsize 也未重设 3. 合并格内容可用宽要补回 2*colsep*(n-1),否则长文本提前折行 4. \parbox[t] 与 tabularray 的 strut 叠加会每行多出 3.6pt --- README.md | 1 + form2/README.md | 177 ++++++++++++++++++++ form2/ouclw.sty | 343 +++++++++++++++++++++++++++++++++++++++ form2/劳务发放说明表.pdf | Bin 0 -> 30198 bytes form2/劳务发放说明表.tex | 85 ++++++++++ 5 files changed, 606 insertions(+) create mode 100644 form2/README.md create mode 100644 form2/ouclw.sty create mode 100644 form2/劳务发放说明表.pdf create mode 100644 form2/劳务发放说明表.tex diff --git a/README.md b/README.md index c685044..9f1794a 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ |---|---| | [`exam/`](exam/) | 期末考试**试卷**与**参考答案及评分标准**模板(XeLaTeX) | | [`form/`](form/) | 教职工**年度考核登记表**模板(XeLaTeX) | +| [`form2/`](form2/) | **劳务发放说明表**模板(XeLaTeX) | ## 说明 diff --git a/form2/README.md b/form2/README.md new file mode 100644 index 0000000..3089c01 --- /dev/null +++ b/form2/README.md @@ -0,0 +1,177 @@ +# form2/ — 中国海洋大学 劳务发放说明表(LaTeX 版) + +把实验室用的《劳务发放说明表》Word 版复刻为 LaTeX 模板。版式与原 `.docx` +逐项对齐,**不含任何真人信息**:姓名、人数、项目名称、单位名称一律 `×` 占位。 + +## 文件 + +| 文件 | 说明 | +| :-- | :-- | +| `劳务发放说明表.tex` | 主文件。填表只改第 1 节(4 个变量) | +| `ouclw.sty` | 版式包。页面/字体/列宽/行高/全部尺寸写在这里,附换算注释 | + +## 编译 + +```bash +xelatex 劳务发放说明表.tex +``` + +单页,跑一遍即可(无交叉引用)。 + +需要 **XeLaTeX**,并安装 `ctex`、`geometry`、`fontspec`、`xeCJK`、`tabularray`。 +实测环境:TeX Live 2022 + `tabularray 2022A`。 + +## 改内容 + +```latex +\newcommand{\lwunit}{{\songti ××××××××}} % 用工单位(学部 / 学院) +\newcommand{\lwreason}{{\songti ××××}} % 用工事由 +\newcommand{\lwnote}{} % 备注(可留空) +\newcommand{\lwwork}{% + 聘请{\songti ×××}等{\songti ×}位研究生参与《{\songti ×××}》项目的研究工作。} +``` + +### 关于 `\lwwork` 的句式 + +原文是「聘请秦依康等 2 位研究生参与《观测数据驱动的渤海生态系统健康评估 +关键技术研发》项目的研究工作。」——真人姓名、人数、真实项目名已替换为 +`×××` / `×`,**句式一字未动**。填表时把三处 `×` 换成实际内容即可: + +| 占位 | 换成 | +| :-- | :-- | +| 第一个 `×××` | 第一位研究生的姓名("等"字后面若只有一人,可删"等×位") | +| `×`(位) | 研究生人数 | +| 《`×××`》 | 项目全称 | + +## 版式数据来源 + +全部尺寸从原 `.docx` 的 OOXML 里量出来,换算关系: + +- 长度:`mm = twips ÷ 1440 × 25.4`,`pt = twips ÷ 20` +- 字号:`w:sz` 是半磅值,`sz=28` ⇒ 14 pt +- 行距:`docGrid linePitch=312` twips ⇒ 15.6 pt + +| 项目 | docx 原值 | 换算 | +| :-- | :-- | :-- | +| 纸张 | `pgSz 11906×16838` | A4 210×297 mm | +| 页边距(上下) | `pgMar top/bottom 1361` | 24.01 mm | +| 页边距(左右) | `pgMar left/right 1797` | 31.70 mm | +| 表宽 | `tblW 8522` | 150.32 mm | +| 列宽 c1..c4 | `1384, 1418, 2883, 2837` | 24.41 / 25.01 / 50.85 / 50.04 mm | +| 单元格内边距(左右) | `tblCellMar 108` | 1.905 mm | +| 边框 | `tblBorders sz=4` | 0.5 pt | +| 字号 | `w:sz 28` | 14 pt,宋体 | +| 行距 | `linePitch 312` | 15.6 pt | + +各行行高由**段落数**决定(原表没有 `trHeight`),每段一个行距 15.6 pt: + +| 行 | 段数 | 高度 | +| :-- | :-- | :-- | +| R0 用工单位 | 2(`用工单位` / `(公章)`) | 31.2 pt = 11.01 mm | +| R1 用工事由 | 1 | 15.6 pt = 5.50 mm | +| R2 具体工作 | 9(长句 + 8 空段) | 140.4 pt = 49.53 mm | +| R3 三方签字 | 4(标签 + 2 空段 + 日期) | 62.4 pt = 22.01 mm | +| R4 备注 | 2 | 31.2 pt = 11.01 mm | +| 合计 | | 280.8 pt = 99.06 mm | + +### 为什么左右页边距不对称 + +原表宽 150.32 mm,比 docx 版心(146.68 mm)宽 3.71 mm,而 `tblPr` 里**没有 +`jc`、`tblInd` 又是 0** —— Word 按左对齐处理:表从左边距 31.70 mm 起排, +右端溢进右侧页边距 3.71 mm。 + +所以本模板照实复现这个不对称:`left = 31.70mm`、`totalwidth = 150.32mm`, +右边界自然落到 `210 − 31.70 − 150.32 = 27.98 mm`。**不要**改成左右等边距 +(那样表会整体左移 1.86 mm,与 Word 里看到的位置不符)。 + +## 四个必须知道的坑 + +### 1. ctex 的 `\linespread ≈ 1.3` 会吃掉你设的行距 + +```latex +\fontsize{14}{15.6}\selectfont % \baselineskip = 20.28pt ✗ +\linespread{1}\relax\fontsize{14}{15.6}\selectfont % = 15.60pt ✓ +``` + +`\fontsize` 第二个参数本该直接设定 `\baselineskip`,但 `\selectfont` 时会 +**再乘一次 `\linespread`**。ctex 默认 `\linespread ≈ 1.3`,于是 15.6 pt 被放大 +成 20.28 pt,五行表从 99 mm 涨到 129 mm,`ht=` 也压不住(内容本身就那么高, +tabularray 只能被动撑开)。 + +本包的对策是 `\lwbodyfont`: + +```latex +\newcommand{\lwbodyfont}{\linespread{1}\relax\fontsize{14}{15.6}\selectfont} +\AtBeginDocument{\lwbodyfont} +``` + +`\AtBeginDocument` 那一次不能省——ctex 在 begin document 时会重设 `\linespread`。 + +### 2. 合并格 `{c}` 是不折行的 LR 模式 + +`cell{r}{c}={c=n}{c}` 的 `{c}` 是 **LR 模式**,不是段落模式: + +- 格内文字比所跨各列合计更宽时,它**不折行**,而是把列撑宽、整表超出版心; +- 合并格里的 `\hsize` **没有**被重设成该跨度宽度,仍是外层版心宽, + 长文本会按版心折行、冲出格子。 + +⇒ 合并格里的文字一律包定宽 `\parbox`,本表提供 `\lwcell` / `\lwcellv` / +`\lwstack` / `\lwsign` 四个入口,`.tex` 里只要有内容就用它们,别裸写。 + +### 3. 合并格的“内容可用宽”要补回 `2·colsep·(n−1)` + +单列的内容宽 = `wd`(左右两半 `colsep` 已被 colspec 扣掉); +但跨 n 列合并后,**n 列之间的 (n−1) 组内边距会被回收进内容宽**: + +``` +内容可用宽 = Σ 所跨各列 wd + 2 · colsep · (n − 1) +``` + +漏算的后果很隐蔽:`\parbox` 比真实格宽窄,短文本看不出问题,长文本会 +**提前折行**。本表「批准单位负责人签字」共 9 字 × 14 pt = 44.45 mm, +而 c1+c2 只有 41.37 mm,就曾被折成「批准单位负责人签」+「字」两行, +docx 里明明是一行。正确值是 `41.3653 + 2×1.905 = 45.1753mm`。 + +### 4. `\parbox[t]` 会让行高超目标 + +tabularray 给每个单元格垫了 strut,`[t]` 生成的盒子顶部与 strut 顶部相加, +实测每行白白多出 **3.6 pt**(R0 从 31.67 → 35.26)。 + +原表 R0C1 / R2C1 之所以“贴顶”,不是靠 `vAlign=top`(它们其实没写 `vAlign`), +而是靠**段落数把行高填满**(2 段 = 31.2 pt、9 段 = 140.4 pt,正好等于行高)。 +内容高度已等于行高时,`[c]` 居中的结果就等同于贴顶。 + +⇒ `.tex` 里用 `\lwcellv{内容\lwblank{n}}` 补足段落数,`\parbox` 保持 `[c]`。 + +## 与 docx 的已知差异 + +| 项 | docx | 本模板 | 说明 | +| :-- | :-- | :-- | :-- | +| 表宽 | 150.319 mm | 150.137 mm | 差 0.18 mm。tabularray 计宽按 n−1 根竖线、画宽按 n 根,系统性差 0.5 pt,为消除 Overfull 微调了列宽 | +| 行高 | 11.01 / 5.50 / 49.53 / 22.01 / 11.01 mm | 每行 +0.15 mm | 同上,竖线计入行高 | +| 字体 | 宋体 | SimSun | 同一字体。缺字体时用 `fc-list` 找替代 | +| 标题 | 宋体 14 pt **加粗** | 同 | 字号与正文相同,只靠加粗区分 | + +## 校验方法 + +不用肉眼看 PDF,直接量矢量: + +```bash +pdftocairo -svg 劳务发放说明表.pdf out.svg # 取线条精确坐标 +pdftotext -bbox 劳务发放说明表.pdf out.xml # 取每个字块的坐标 +``` + +SVG 里解析 ``,按 +「`|Δy|<0.9` 且 `|Δx|>10` = 横线」「`|Δx|<0.9` 且 `|Δy|>2` = 竖线」分类去重, +即可得到每条线的精确端点。本模板的实测结果: + +``` +表宽 150.137 mm (目标 150.319,差 −0.18) +表左 31.662 mm (目标 31.700,差 −0.04) +表右 181.799 mm (目标 182.019,差 −0.22) +R0 11.172 / R1 5.668 / R2 49.646 / R3 22.159 / R4 11.172 mm 全部达标 +``` + +三个签字格的标签基线完全重合(`rel-top 1.06 pt`),日期行也完全重合 +(`rel-top 47.69 pt`)——这一条是特意做的:合并格与普通列的垂直居中算法 +不同,若不统一包 `\parbox`,第一格会比另两格低 1.55 pt。 \ No newline at end of file diff --git a/form2/ouclw.sty b/form2/ouclw.sty new file mode 100644 index 0000000..bc6558a --- /dev/null +++ b/form2/ouclw.sty @@ -0,0 +1,343 @@ +%====================================================================== +% ouclw.sty — 中国海洋大学 劳务发放说明表 版式包 +% +% 依据:实验室管理/劳务补贴/劳务发放说明表.docx(Word 2007+ 保存) +% 目标:版式与原 docx 逐项对齐。所有尺寸都由 docx 内部数值换算: +% twips → mm : mm = twips / 1440 * 25.4 +% twips → pt : pt = twips / 20 (1 pt = 1/72 in) +% w:sz : 半磅值,÷ 2 即 pt +% +% 用法见同目录 劳务发放说明表.tex,说明见 README.md +%====================================================================== +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ouclw}[2026/10/26 v1.0 OUC labor payment form] + +\RequirePackage{geometry} +\RequirePackage{fontspec} +\RequirePackage{xeCJK} +\RequirePackage{tabularray} + +%====================================================================== +% 1. 页面与版心 +% +% 原 docx sectPr: +% pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4 +% pgMar top/bottom 1361 = 24.01 mm +% left/right 1797 = 31.70 mm +% header 851 / footer 992 = 15.01 / 17.51 mm +% docGrid linePitch 312 → 行距 15.6 pt +% +% 原表 tblW 8522 twips = 150.32 mm,比 docx 版心(146.68 mm)宽 3.71 mm。 +% docx 的 tblPr 里【没有 jc】,tblInd = 0 ⇒ Word 是按左对齐处理的: +% 表从左边距 31.70 mm 起排,右端溢出到右侧页边距里 3.71 mm。 +% 实测原表左右边距就是 pgMar 的 1797 twips = 31.70 mm,并不对称。 +% +% ⇒ 本包照实复现这个“不对称”: +% left = 31.70 mm (= docx pgMar left) +% 表宽 = 150.32 mm +% ⇒ 右边界自然落在 210 − 31.70 − 150.32 = 27.98 mm +% +% ⚠️ 为什么不写成 left = right = 29.84 mm(把表居中): +% 那样表会整体左移 1.86 mm,与 Word 里看到的位置不符。 +% 代价是 \textwidth 变成 150.32 mm 而非 docx 的 146.68 mm —— +% 本表除标题外没有通栏正文,标题是居中的, +% 居中后中心仍在 31.70 + 75.16 = 106.86 mm, +% 与 docx 的 31.70 + 73.34 = 105.04 mm 差 0.04 mm(取整误差级)。 +%====================================================================== +\geometry{ + paperwidth = 210mm, + paperheight = 297mm, + left = 31.70mm, % = docx pgMar left 1797 twips + totalwidth = 150.32mm, % = 表宽,精确;geometry 由此算出 right=27.98mm + top = 24.01mm, + bottom = 24.01mm, + headheight = 0pt, + headsep = 0pt, + footskip = 17.51mm, +} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt} +\pagestyle{empty} % 原 docx 无页眉页脚,故不排页码 + +%====================================================================== +% 2. 字体与字号 +% +% 全文 宋体 14pt (w:sz=28) ← 注意是宋体,不是仿宋 +% 大标题 宋体 14pt 加粗(w:b + w:sz=28),居中 +% 行距 15.6pt (docGrid linePitch=312 twips) +% +% ⚠️ 本表字号只有 14pt 一档,没有 .docx 里那种混排小字。 +% +%---------------------------------------------------------------------- +% ⚠️⚠️⚠️【最要命的一条】ctex 默认 \linespread 约 1.3,会把 +% \fontsize{14}{15.6} 的 15.6pt 行距放大成 20.28pt! +% +% 实测: +% \fontsize{14}{15.6}\selectfont → \baselineskip = 20.28pt ✗ +% 加 \linespread{1} 之后 → \baselineskip = 15.60pt ✓ +% +% 后果:所有行都高 30%,五行表从 99mm 涨到 129mm,行高全对不上 +% (R0 35.66 vs 31.2、R3 69.3 vs 62.4)。而且 ht= 也压不住 —— +% 内容本身就那么高,tabularray 只能被动撑开。 +% +% \fontsize 的第二个参数【本来是】用来设 \baselineskip 的,但 +% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread +% 归 1。这一步不能省,也必须在 \AtBeginDocument 之后再设一次 +% (ctex 在 begin document 时会重设)。 +%====================================================================== +\setmainfont{Times New Roman} +\setCJKmainfont{SimSun}[AutoFakeBold=2.5] +\newCJKfontfamily\songti{SimSun}[AutoFakeBold=2.5] +\newCJKfontfamily\heiti{SimHei} +\newCJKfontfamily\fangsong{FangSong}[AutoFakeBold=2.5] + +\newcommand{\lwbodyfont}{% + \linespread{1}\relax + \fontsize{14}{15.6}\selectfont} + +%---------------------------------------------------------------------- +% ⚠️ xeCJK 陷阱:局部字体切换命令若紧邻 \par(或落在段落末尾),段末的 +% 字体状态会“溢出”到后面段落。故局部切换一律用带 \normalfont 收尾的 +% 包装,不要直接写 {\heiti ...\par}。 +%---------------------------------------------------------------------- +\newcommand{\LWFS}[1]{{\fangsong #1\normalfont}} +\newcommand{\LWHT}[1]{{\heiti #1\normalfont}} + +%====================================================================== +% 3. 列的宽度模型 +% +% 原 docx tblGrid(4 个网格列,twips → mm): +% c1 1384 → 24.4122 c2 1418 → 25.0119 +% c3 2883 → 50.8529 c4 2837 → 50.0415 +% 合计 8522 twips = 150.3186 mm(与 tblW 一致) +% +% 各行合并跨度(docx gridSpan): +% R0/R1/R2/R4 c1 | c2-c4(span 3) +% R3 c1-c2(span 2)| c3 | c4 +% +%---------------------------------------------------------------------- +% ⚠️ 本表与年度考核表(form/)的关键差别:**可以用 colsep 真实还原内边距**。 +% +% docx 的 tblCellMar 是 top/bottom = 0、left/right = 108 twips(1.905 mm)。 +% 年度考核表里有个只有 1.41 mm 宽的 c10,比两倍内边距还窄,所以只能取 +% colsep=0 并放弃内边距。本表最窄的列也有 24.41 mm,完全可以照实还原: +% +% colsep = 1.905mm +% +% tabularray 的 colsep 计在每列【左右两侧】,故 4 列共 +8×1.905 = 15.24 mm; +% 竖线 5 根(左右边界 + 3 内部)× 0.5pt = 2.5pt = 0.882 mm。 +% 要让 Σwd + 15.24 + 0.882 = 150.3186,需 +% Σwd = 134.197 mm +% 而 (gridCol − 2×1.905) 之和为 135.079 mm,两者差 0.882 mm 正好是竖线宽, +% 故每列再减 0.882/4 = 0.2204 mm: +% +% wd = gridCol(mm) − 3.81 − 0.2204 +% +% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差, +% 实测需再微调(见 3.2 的实测标定值),否则一直报 +% “Table width is too small, need 0.45pt more!” 外加一条 Overfull \hbox。 +% +%---------------------------------------------------------------------- +% ⚠️ 两条通用结论(在 form/ 里踩过,这里同样适用): +% +% (a) 合并单元格 cell{r}{c}={c=n}{c} 的单元类型 {c} 是【不折行的 LR 模式】。 +% 格内文字若比所跨各列合计更宽,它不会在列内折行,而是【把这些列撑宽】, +% 整张表随之超出版心。⇒ 合并格里的文字一律包定宽 \parbox(见 \lwfit)。 +% 单列 Q[c,m,wd=…] 没有这个问题:超出时只溢出、列宽不变。 +% +% (b) 合并单元格里的 \hsize【没有】被重设成该跨度的宽度,仍是外层版心宽。 +% ⇒ 凡是内容较长或含多段的跨列单元格,必须用固定宽 \parbox 包起来。 +%====================================================================== +\newcommand{\lwlwval}{0.5pt} % docx tblBorders sz=4 ⇒ 0.5pt(sz 单位 1/8pt) +\newcommand{\lwcolsep}{1.905mm} % docx tblCellMar left/right 108 twips + +\newlength{\lwtblw} +\setlength{\lwtblw}{150.32mm} % 表宽(含 5 根竖线与 8 处内边距) + +%---------------------------------------------------------------------- +% 3.1 各列宽(= gridCol − 3.81mm − 0.2204mm 的理论值) +% 与 lwtable 环境里 colspec 的 wd 必须逐字一致。 +%---------------------------------------------------------------------- +\newcommand{\lwwa}{20.3828mm} % c1 24.4122 − 4.0304 +\newcommand{\lwwb}{20.9825mm} % c2 25.0119 − 4.0304 +\newcommand{\lwwc}{46.8235mm} % c3 50.8529 − 4.0304 +\newcommand{\lwwd}{46.0121mm} % c4 50.0415 − 4.0304 + +%---------------------------------------------------------------------- +% 3.2 各跨度的【内容可用宽】 +% +% ⚠️⚠️ 这里有一个必踩的坑:合并单元格(cell{r}{c}={c=n}{c})合并后, +% n 列之间的 (n−1) 组内边距【会被回收进内容宽】。 +% ⇒ 内容可用宽 = Σ 所跨各列 wd + 2·colsep·(n−1) +% +% 只有 1 列时(\lwwa…\lwwd)内容宽 = wd,因为左右两半 colsep 已被 +% colspec 扣掉;跨 n 列时则不然,必须补回来。 +% +% 漏算的后果非常隐蔽:\parbox 比真实格宽窄,短文本看不出问题, +% 长文本会【提前折行】——本表“批准单位负责人签字”就曾被折成 +% “批准单位负责人签”+“字”两行,而 docx 里是一行。 +%---------------------------------------------------------------------- +% c1-c2 = 20.3828 + 20.9825 + 2×1.905 = 45.1753mm(“批准单位负责人签字”) +\newcommand{\lwspanA}{45.1753mm} +% c2-c4 = 20.9825 + 46.8235 + 46.0121 + 4×1.905 = 121.4381mm(长句等) +\newcommand{\lwspanB}{121.4381mm} + +%====================================================================== +% 4. 行高 +% +% 原 docx 各行【没有 trHeight】,高度全由段数决定 +% (每段 = 1 个行距 15.6 pt): +% R0 2 段 → 31.2 pt = 11.01 mm +% R1 1 段 → 15.6 pt = 5.50 mm +% R2 9 段 → 140.4 pt = 49.53 mm ← 长句 1 段 + 8 个空段 +% R3 4 段 → 62.4 pt = 22.01 mm ← 标题 1 + 空 2 + “年 月 日” 1 +% R4 2 段 → 31.2 pt = 11.01 mm +% 合计 280.8 pt = 99.06 mm +% +% ⚠️ tabularray 的 ht= 经实测同为“最小行高”,与 Word 的 atLeast 语义一致。 +% 本表直接把这些值写成 ht=,行高即固定;内容更多的行会自然长高。 +%====================================================================== + +%====================================================================== +% 5. 表格环境 +% +% ⚠️ 用 tblr 而非 longtblr:本表总高约 100 mm,一页装得下, +% 不需要断页,也就不需要清 caption 模板。 +% +% ⚠️⚠️ colspec 与 row{} 必须字面写在这里,不能先存进宏再展开: +% tabularray 的列类型解析在宏展开之外进行,会报 +% “Unexpandable command \xxx inside column type”。 +% (所以 3.1 节那些 \lwwa… 只作文档用,不能拼进 colspec。) +% +% ⚠️⚠️⚠️ 跨度用 cell{r}{c}={c=n}{c} 声明,不要用行内 \SetCell[c=n]{c}: +% \SetCell 之后要补若干个空 &,补几个取决于该格跨几列,一旦数错一位, +% 同行后面所有单元格会整体错列到窄列,报出难以定位的 Overfull。 +% ⚠️ 正确写法只有 {c=n}{c};={c=n}、={n}{c}、={span=n}{c} 都不认。 +% +% docx 各行的 gridSpan: +% R0/R1/R2/R4 1,3 R3 2,1,1 +% +% ⚠️ 选项里的宏名一律不带 @:tabularray 解析选项时 @ 不是字母。 +%====================================================================== +\newenvironment{lwtable}{% + \par\begingroup + \begin{tblr}[label=none]{ + colspec={ + Q[c,m,wd=20.3828mm] Q[c,m,wd=20.9825mm] + Q[c,m,wd=46.8235mm] Q[c,m,wd=46.0121mm] + }, + colsep=1.905mm, rowsep=0pt, stretch=0, + hline{1-Z}={\lwlwval}, vline{1-Z}={\lwlwval}, + row{1}={ht=11.01mm}, row{2}={ht=5.50mm}, row{3}={ht=49.53mm}, + row{4}={ht=22.01mm}, row{5}={ht=11.01mm}, + %---- R0/R1/R2/R4 c1 | c2-c4 + cell{1}{2}={c=3}{c}, cell{2}{2}={c=3}{c}, cell{3}{2}={c=3}{c}, + cell{5}{2}={c=3}{c}, + %---- R3 c1-c2 | c3 | c4 + cell{4}{1}={c=2}{}, + }% +}{% + \end{tblr}\par\endgroup} + +%====================================================================== +% 6. 单元格内容包装(见 3 节结论 a / b) +% +% 统一入口,.tex 里只用下面几个宏,不要直接把长文字写进 & 之间。 +%====================================================================== +% \lwfit{跨度宽宏}{内容} —— 定宽、水平居中、可折行(用于合并格里的标签) +\newcommand{\lwfit}[2]{\parbox{#1}{\centering #2}} + +% \lwcell{内容} —— c2-c4 内容栏,左对齐、可折行 +% +% ⚠️⚠️ 这里【必须】保持 \parbox 默认的 [c],不要改成 [t]。 +% 原因:tabularray 会给每个单元格垫一个 strut,[t] 生成的盒子顶部 +% 与 strut 顶部相加,实测每行白白多出 3.6pt(R0 从 31.67 → 35.26)。 +% +% docx 里 R0C1 / R2C1 / R4C1 都没有 (按 OOXML 语义是顶部对齐), +% 但它们靠【段落数把行高填满】实现“贴顶”: +% R0C1 2 段 = 31.2pt = 行高 +% R2C1 9 段 = 140.4pt = 行高 +% 内容高度已等于行高,[c] 居中的结果就是贴顶,等价。 +% ⇒ 场合决定用法:段落数够 → \lwcellv{内容 + \lwblank{n}}; +% 段落数不够(如 R1 只有 1 段)→ 也正是 vAlign=center。 +\newcommand{\lwcell}[1]{\parbox{\lwspanB}{\raggedright #1}} + +% \lwcellv{内容} —— 同上(保留别名,语义上表示“垂直居中”) +\newcommand{\lwcellv}[1]{\parbox[c]{\lwspanB}{\raggedright #1}} + +% \lwstack{内容} —— c1-c2 合并格(通用,任意多段) +\newcommand{\lwstack}[1]{\parbox{\lwspanA}{\centering #1}} + +%---------------------------------------------------------------------- +% \lwsign{格宽}{签字标签} —— R3 的签字格 +% +% docx 里 R3 每格都是 4 段: +% 标签 / 空 / 空 / “年 月 日” +% 即标签与日期之间有【2 个空行距 = 31.2pt】的签名留白,不是 1 行。 +% 4 段 × 15.6pt = 62.4pt = 22.01mm,正好等于行高,故 vAlign 取哪个都一样。 +% +% ⚠️ R3 第一格是合并格(c1-c2),另外两格是普通列。tabularray 对这两种格 +% 的垂直居中算法【不一样】:合并格内容整体偏低 1.55 pt。 +% 三个格分别裸写内容时,实测基线为 +% 批准单位负责人签字 y = 280.65 +% 用工单位负责人签字 y = 279.10 +% 经办人签字 y = 279.10 +% 肉眼勉强看得出参差。把所有格都包成【同一种】\parbox 后, +% 垂直居中的对象变成同一个盒子高度,三格自然对齐(实测 y 完全相同)。 +% 故本表三个签字格一律走这个宏。 +%---------------------------------------------------------------------- +\newcommand{\lwsign}[2]{% + \parbox[c]{#1}{\centering #2\par\vspace*{31.2pt}\lwdate}} + +%====================================================================== +% 7. 签字栏的“年 月 日” +% +% docx 里是右对齐,字间用 3 个半角空格(Times New Roman): +% “年 月 日”,jc=right +% R3C1 另加 firstLine=700 twips / firstLineChars=250(2.5 字)缩进, +% 但既然整段右对齐,缩进只影响折行,不影响位置,故忽略。 +% +% ⚠️ 用固定宽 \parbox 内的 \raggedleft,不要用 \hfill: +% \hfill 在跨越 \par 的段尾会撑满 \hsize,若 \hsize 与 parbox 宽 +% 不一致就会冲出格子。 +%====================================================================== +\newcommand{\lwdate}{% + \par\noindent + \makebox[\linewidth][r]{年\hspace{1.5em}月\hspace{1.5em}日}} + +% 空段落:\lwblank{n} ⇒ 追加 n 个空行 +% +% ⚠️ 不要用 \par\null:实测在 tabularray 单元格里,9 个 \par\null 会排成 +% 192.07pt,而 docx 里 9 个空段落只有 140.4pt。原因是 \null 是一个 +% 有高度的盒子,每个都按“汉字 + 行距”算钱;Word 的空段落只贡献行距。 +% ⇒ 行高统一交给 tabularray 的 ht=(实测 ht=49.53mm 排出 140.73pt,与 +% docx 的 140.4pt 差 0.33pt,可忽略),本宏只用于确有需要的场合。 +\newcommand{\lwblank}[1]{% + \par + \@tempcnta=0 + \loop\ifnum\@tempcnta<#1\relax + \mbox{}\par\advance\@tempcnta by 1 + \repeat} + +%====================================================================== +% 8. 表外标题 +% +% 原 docx 第 1 段:宋体、加粗、sz=28(14pt)、jc=center +% 注意字号与正文相同,只靠加粗区分,不是常见的大标题。 +%====================================================================== +\newcommand{\lwtitle}{% + \par + \begingroup + \centering + {\songti\bfseries\fontsize{14}{15.6}\selectfont 劳务发放说明表\par}% + \endgroup} + +%====================================================================== +% 9. 表后空行 +% +% 原 docx 表格之后还有一个 jc=center 的空段落。 +%====================================================================== +\newcommand{\lwtail}{\par\null\par} + +\AtBeginDocument{\lwbodyfont} +\endinput \ No newline at end of file diff --git a/form2/劳务发放说明表.pdf b/form2/劳务发放说明表.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f3bc389f2618fc6cc8c0b30313ad74199e1e9df5 GIT binary patch literal 30198 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 DtFc^K literal 0 HcmV?d00001 diff --git a/form2/劳务发放说明表.tex b/form2/劳务发放说明表.tex new file mode 100644 index 0000000..8f3b21e --- /dev/null +++ b/form2/劳务发放说明表.tex @@ -0,0 +1,85 @@ +%====================================================================== +% 中国海洋大学 劳务发放说明表 +% +% 编译: xelatex 劳务发放说明表.tex +% +% 本模板不含真人信息:姓名、人数、项目名称一律用 × 占位。 +% 填表时只改下面【第 1 节】。 +% +% 版式来源:SynologyDrive/实验室管理/劳务补贴/劳务发放说明表.docx +% 所有尺寸已在 ouclw.sty 内注明换算过程;要改版式请改 sty。 +%====================================================================== +\documentclass[UTF8,fontset=none]{ctexart} +\usepackage{ouclw} + +%====================================================================== +% 1. 表格内容(填表时只改这一段) +%====================================================================== +\newcommand{\lwunit}{{\songti ××××××××}} % 用工单位(学部/学院) +\newcommand{\lwreason}{{\songti ××××}} % 用工事由 +\newcommand{\lwnote}{} % 备注(可留空) + +% 劳务人员从事的具体工作。 +% ⚠️ 原来写的是“聘请秦依康等 2 位研究生参与《观测数据驱动的渤海生态系统 +% 健康评估关键技术研发》项目的研究工作。”——真人姓名与真实项目名已换成 +% × 占位,句式保持不变。 +\newcommand{\lwwork}{% + 聘请{\songti ×××}等{\songti ×}位研究生参与《{\songti ×××}》项目的研究工作。} + +%====================================================================== +% 2. 正文 +%====================================================================== +\begin{document} + +\lwtitle + +%====================================================================== +% 3. 表格主体 +% +% ⚠️⚠️ 每行写满 4 个格子 + 结尾 \\,跨度不用管(已写死在 ouclw.sty 里)。 +% 若某格是合并的起点,它后面要补 (n−1) 个空 &,凑满 4 格。 +% +% ⚠️⚠️⚠️ 合并格里的文字【必须】用 \lwfit / \lwcell 等定宽 \parbox 包起来。 +% 因为 cell{r}{c}={c=n}{c} 的 {c} 是【不折行的 LR 模式】: +% 文字比所跨各列合计更宽时,它不折行,而是把列撑宽、整表超出版心。 +%====================================================================== +\begin{lwtable} + +%---- R0 用工单位 | 单位名 --------------------------------------------- +% docx 里两格都是 2 段:C0 “用工单位”/“(公章)”,C1 单位名 + 1 个空段。 +% 两格内容都刚好填满行高 ⇒ vAlign 取 center 还是 top 结果相同。 +% ⚠️ 必须把那个空段补出来,否则 C1 只剩 1 段(高 12.6pt),会被 +% m 居中到格子中部,单位名比 C0 低 7mm 左右。 +用工单位\par (公章) + & \lwcellv{\lwunit\lwblank{1}} + & & \\ + +%---- R1 用工事由 | 事由 ----------------------------------------------- +% 唯一一个 vAlign=center 的值格,只有 1 段。 +用工事由 + & \lwcellv{\lwreason} + & & \\ + +%---- R2 劳务人员从事的具体工作 | 说明 --------------------------------- +% C0 3 段(“劳务人员”/“从事的具”/“体工作”),vAlign=center。 +% C1 共 9 段:长句 + 8 个空段 = 140.4pt,刚好等于行高 ⇒ 贴顶、下方留白。 +% ⚠️ 这 8 个空段不能省,否则长句会被居中到 140pt 格里的一半处(下移 64pt)。 +劳务人员\par 从事的具\par 体工作 + & \lwcellv{\lwwork\lwblank{8}} + & & \\ + +%---- R3 三方签字 ------------------------------------------------------ +\lwsign{\lwspanA}{批准单位负责人签字} + & & \lwsign{\lwwc}{用工单位负责人签字} + & \lwsign{\lwwd}{经办人签字} \\ + +%---- R4 备注 | 内容 -------------------------------------------------- +备注 + & \lwcell{\lwnote} + & & \\ + +\end{lwtable} + +\lwtail + +\end{document} \ No newline at end of file