Files
laoyang 3906bb49a4 清理代码库中的开发过程内容
- 删除 WORKFLOW.md(开发流程文档,已移入记忆库)
- build.sh 去掉 WSL 相关说明
- 33 个源文件的注释:去掉踩坑记录、实测推导、原文件对比、工单号引用
- 保留技术参数、约束说明、命令含义

净删 399 行。全库 16/16 编译通过。
2026-11-01 09:29:00 +08:00

630 lines
29 KiB
TeX
Raw Permalink 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.
%======================================================================
% ouccsx.sty — 中国海洋大学 特殊事项说明表 版式包
%
% 依据:报销相关/中国海洋大学特殊事项说明表.docx(Word 2007 保存)
% 目标:版式与逐项对齐;内容可随意增删而不破版。
%
% 尺寸换算:
% twips → pt : pt = twips / 20 (1 pt = 1/20 twip)
% twips → mm : mm = twips / 1440 * 25.4
% w:sz : 半磅值,÷ 2 即 pt
% w:line : 1/20 pt(lineRule="exact" 时即精确行距)
%
% ⚠️ 与 PDF 对齐的几何量一律用 bp(= 1/72 in,PDF 用户单位),
% 不用 pt(= 1/72.27 in)。两者差 0.375%,A4 上累积可达 2 pt,
% 超过一个字符宽,肉眼看得出。标注坐标者均为 PDF 坐标
% (左上原点、向下为正)。
%
% 用法见同目录 特殊事项说明表.tex,说明见 README.md
%======================================================================
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{ouccsx}[2026/10/28 v1.2 OUC special item statement form]
\RequirePackage{geometry}
\RequirePackage{fontspec}
\RequirePackage{xeCJK}
\RequirePackage{fancyhdr}
%======================================================================
% 1. 页面与版心
%
% sectPr:
% pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4
% pgMar top 2155 / bottom 1985 twips = 38.01 / 35.00 mm
% left 1588 / right 1474 twips = 28.01 / 26.00 mm
%
% ------------------------------------------------------------------
% ⚠️⚠️ 本模板的版心【不是】docx 的版心,这是刻意的。
%
% 原表 tblW = 9613 twips = 169.54 mm = 480.65 bp,
% 而 docx 版心宽只有 210 − 28 − 26 = 156 mm。
% 表比版心宽 13.54 mm,靠 tblInd = −546 twips(−9.63 mm)向左顶出去。
%
% 坐标(Word 导出 PDF):
% 表格左边框 x = 46.70 bp,右边框 x = 527.35 bp(宽 480.65 ✓)
% 标题文字中心 x = 300.41 bp ← 居中于 docx 版心,不是居中于表格
%
% ⇒ 若把 geometry 设成 docx 版心(left 28 mm),表格必然超出版心
% 13.54 mm,报一条 Overfull \hbox,且改内容时位置会漂。
%
% ⇒ 本包把 geometry 的版心【直接设成表格宽度】:
% left = 16.47 mm (= 表格左边框)
% totalwidth = 169.54 mm (= 表格外宽)
% 表格正好填满版心,零 Overfull,位置与原件逐点相同。
%
% ⇒ 代价:标题若用 \centering 会落在 287.03 bp,原件在 300.41 bp,
% 偏左 13.4 bp。故标题另给偏移补回 docx 版心的中心(见第 5 节)。
%======================================================================
\newlength{\sxofficialleft} % docx 版心左界,仅用于换算
\setlength{\sxofficialleft}{28.01mm}
\newlength{\sxtblleft}
\setlength{\sxtblleft}{16.47mm}
\newlength{\sxtblw} % 表格外宽 = 版心宽
\setlength{\sxtblw}{169.54mm}
\geometry{
paperwidth = 210mm,
paperheight = 297mm,
left = 16.47mm, % = 表格左边框
totalwidth = 169.54mm, % = 表格外宽
% ⚠️ 坐标差:本包所有 y 都恒比原件小 0.14 bp(表顶线、备注、
% 页码全部同步偏移,是 top 与 PDF 线宽的取整差,不是各行的问题)。
% 从 top 里补掉,一次消除。
top = \dimexpr38.01mm+0.14bp\relax,
bottom = 35.00mm, % = docx pgMar bottom 1985 twips
headheight = 0pt,
headsep = 0pt,
footskip = 24.41bp,
}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt}
%======================================================================
% 2. 字体与字号
%
% 字号(w:sz 半磅值 ÷ 2):
% 大标题 44 → 22 pt / 表内正文 21 → 10.5 pt
% 签字日期 24 → 12 pt / 备注 21 → 10.5 pt / 页码 28 → 14 pt
%
% ⚠️⚠️⚠️ ctex 默认 \linespread ≈ 1.3,会把 \fontsize{10.5}{13.65}
% 的 13.65 pt 行距再放大 30% 变成 17.7 pt。本模板所有行距都来自
% docx 精确值,故每次设字号前必须先把 \linespread 归 1。
%
% ⚠️ 原标题用「方正小标宋简体」,商业字体,本库不分发(见根 README
% 的字体承诺)。按 课程执行大纲/ 的既定做法换成 OUC Serif 真粗体
% —— 小标宋本就是宋体的标题变体,真粗体比伪粗更接近,笔画不糊。
%======================================================================
\input{../fonts.tex}
\newcommand{\sxfonttitle}{%
\linespread{1}\relax\fontsize{22}{25}\selectfont}
\newcommand{\sxfontbody}{%
\linespread{1}\relax\fontsize{10.5}{13.65}\selectfont}
\newcommand{\sxfontsign}{%
\linespread{1}\relax\fontsize{12}{15.6}\selectfont}
\newcommand{\sxfontfoot}{%
\linespread{1}\relax\fontsize{14}{16.8}\selectfont}
%======================================================================
% 3. 表格的几何量
%
% 边框 tblBorders sz=4 → 0.5 pt(w:sz 是 1/8 pt,4/8)
% 内边距 tblCellMar left/right = 108 twips,top/bottom = 0
%
% 行高:trHeight 是 5091 / 1140 / 634 twips,hRule="atLeast",
% 但 atLeast 是「最小」,实际高度由内容撑开。故用取值:
% 四条横线中线 y = 172.99 / 457.49 / 516.34 / 573.64
% ⇒ 三段高 284.50 / 58.85 / 57.30(线中心距),
% 扣掉各一端的半线宽(0.249)得内容高 284.00 / 58.35 / 56.80。
% ⚠️ 不用 trHeight 的 254.55 / 57 / 31.7:R0 被 19 段撑到 284,
% R2 被 4 段撑到 56.8,照 trHeight 会让整表矮 40 bp。
%======================================================================
\newlength{\sxrule}
\setlength{\sxrule}{0.5pt} % = tblBorders sz 4/8
\newlength{\sxpad}
\setlength{\sxpad}{4.93bp} % 校到内容左界 52.08(实际52.11)
\newlength{\sxboxw} % 单元格内容盒宽(不含边框)
\setlength{\sxboxw}{\dimexpr\sxtblw-2\sxrule\relax}
% ⚠️⚠️ 段落折行的可用宽度 ≠ 盒宽。
% 折行可用宽 = \sxboxw − \sxpad − \sxbodypad。
% 原件内容左界 52.08、右界 521.89 ⇒ 可用宽 469.81 bp。
% ⚠️ 这 1.7 bp 是「折不折行」的临界。本表那句「项目负责人是科研经费
% 使用的直接责任人……」共 47 字,在 471.5 bp 里能挤成一行,
% 在 469.81 bp 里必须折行 —— 原件是两行。差一行 = 13.56 bp,
% R0 下半全部内容上移 16.5 bp,肉眼一看就错。
\newlength{\sxbodypad}
\setlength{\sxbodypad}{6.65bp} % = 481.388 − 4.948 − 469.81
\newlength{\sxrowa}
\setlength{\sxrowa}{284.00bp}
\newlength{\sxrowb}
\setlength{\sxrowb}{58.35bp}
\newlength{\sxrowc}
\setlength{\sxrowc}{56.80bp}
%======================================================================
% 4. 行定位体系(全文件的核心)
%
% ⚠️⚠️⚠️ 本表的行距**不能**用 \baselineskip 控制。改之前先读这段。
%
% 【坑一】\baselineskip 只在**同一段落内部**管行距。
% 本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68),
% 因为 10.5 pt 与 12 pt 的字混排,Word 按「下一行字号 × 1.3」算。
% 最初每行 \par 之后单独给 \baselineskip,**完全无效**:
% 所有行距被压成 13.51,12 pt 的签名行没变高,整表矮 2.25 bp。
% 原因:每行 \par 自成一段后,段间基线距离 = 上段末行深度 +
% \parskip + 本段首行字高,\baselineskip 根本没被读到。
%
% 【正解】不依赖 \baselineskip,逐行显式插胶:
%
% 基线距 = 上盒深度 + \kern + 本盒高度
% ⇒ \kern = 目标距 − 上盒深度 − 本盒高度
%
% 与字体度量彻底解耦:换字体、换字号、描述写长写短,行距不变。
%
% 【坑二】块首行必须用 \kern,不能用 \vskip。
% TeX 会【丢弃 \vbox 开头的胶】,用 \vskip 给的顶距静默消失
% (实际「事项描述:」给 10.53 只落到 5.38,等于只剩字高)。
% \kern 不受这条约束,且照样计入盒高。
%
% 【坑三】必须允许负的 \kern。
% 相邻行的目标距可能小于「上盒深度 + 本盒高度」(如年月日行
% 12 pt 字目标 14.04,而 2.99 + 12.06 = 15.05),差值是 −1.01。
% 最初加了 `\ifdim>0` 守卫,负值被吞 → 该行退回自然距 15.05,
% 整块错位 10 bp。负 \kern 在 TeX 里完全合法,不该挡。
%
% 【坑四】多行段落的 \ht 参照的是**末行**基线,不是首行。
% \vbox 的 \ht = 首行高度 + (n−1)·行距,它的参考点是末行基线。
% 所以「上一行基线 → 本段首行基线」的距离不是 pd + kern + ht,
% 而是 pd + kern + ht − (n−1)·行距。漏掉这一项,
% 多行段自己会被推下一整行,其后所有行跟着错(实际0.48 而非 14.04)。
% ⇒ 用 \prevgraf 取段内行数,把 (n−1)·行距加回 kern。
% ⚠️ \dp 不用改:\vbox 的 \dp 就是末行的真实深度。
%
% 【坑五】\offinterlineskip 会继承进段落内部。
% 它把 \lineskiplimit 设成极小值,段内多行改走 \lineskip(=0),
% \baselineskip 又被架空(行距只剩 10.81 而非 13.56)。
% ⇒ 段落内部必须显式恢复 \lineskiplimit / \lineskip。
%======================================================================
\newbox\sx@boxa
\newbox\sx@boxb
\newbox\sx@boxc
\newdimen\sx@pd % 上一行的真实末行深度
\newdimen\sx@tmp
\newdimen\sx@boxd
\newdimen\sx@pgd % 段内中间各行推进总量(\prevgraf 必须先存出来)
\newif\ifsx@first % 是否块内第一行
\newcommand{\sx@blstart}{%
\offinterlineskip
\topskip=\z@
\sx@pd=\z@
\sx@firsttrue}
% \sx@bl[底深]{与上一行基线的距离}{行内容}
%
% #1(可选)= 本行盒的最小深度。块末行用它留出「基线 → 格底」的空白
% —— TeX 丢弃 \vbox 末尾的胶,不能用 \kern 补。
% #2 = 与上一行基线的距离;块第一行则是「块顶 → 首行基线」。
% #3 = 行内容(水平模式),参照点是单元格内容左界。
% #2 = 与上一行基线的距离;块第一行则是「块顶 → 首行基线」,
% 给 0 表示「首行自然贴块顶、只留字高」。
% 后者用于 R0 下半块:那块是贴格底的,全部位置由
% 「末行深度 + 逐行行距」反推出来,再给绝对顶距就重复
% 定位了(实际多给 208.89,整块下移 66.90)。
\newcommand{\sx@bl}[3][\z@]{%
\setbox\sx@boxc=\hbox to \sxboxw{\hskip\sxpad #3\hss}%
\ifsx@first
\sx@firstfalse
\kern\dimexpr\ifdim#2>\z@#2-\fi\ht\sx@boxc\relax
\else
\kern\dimexpr#2-\sx@pd-\ht\sx@boxc\relax
\fi
\ifdim\dp\sx@boxc<#1 \dp\sx@boxc=#1\relax \fi
\sx@pd=\dp\sx@boxc
\box\sx@boxc}
% \sx@blp[底深]{与上一行基线的距离}{段内行距}{段落内容}
%
% 与 \sx@bl 同一套定位规则,但内容是可折行的段落(用于那两句长话)。
%
% ⚠️⚠️ \vbox 的 \ht 参考点是**末行基线**,不是首行(坑四)。
% 故 kern 里要把 (n−1)·行距 加回去,否则整个多行段被推下一整行。
% \dp 不用改 —— \vbox 的 \dp 就是末行的真实深度。
\newcommand{\sx@blp}[4][\z@]{%
\setbox\sx@boxc=\vbox{%
\hsize=\sxboxw
\leftskip=\sxpad
\rightskip=\sxbodypad
\parindent=\z@
\parskip=\z@
\lineskiplimit=\z@ % ← 抵消外层 \offinterlineskip(坑五)
\lineskip=\z@
\baselineskip=#3\relax
\noindent #4\par
% ⚠️⚠️ \prevgraf 有两道坎:
% ① 必须在 vbox **内部**取 —— 它是「当前正在排的段落行数」,
% vbox 一关闭就恢复成外层值(实际把 2 读成 0)。
% ② 必须在 \par **之后**取 —— \prevgraf 是在段落断行那一步
% 才被写入的,\par 之前读到的还是旧值(实际仍为 0)。
\global\sx@pgd=\dimexpr\numexpr\prevgraf-1\relax\dimexpr#3\relax\relax}%
% 中间各行的推进总量
\sx@tmp=\sx@pgd
\ifsx@first
\sx@firstfalse
% 块首行的 #2 直接是「块顶 → 首行基线」,不需要再扣多行推进量:
% 多行段的 \ht 已经包含了「首行基线 → 末行基线」的全部推进,
% 而首行基线本身与段有几行无关。加回 pgd 会把首行推下一整行
% (实际描述两行偏 +10.39)。
\kern\dimexpr\ifdim#2>\z@#2-\fi\ht\sx@boxc\relax
\else
\kern\dimexpr #2+\sx@tmp-\sx@pd-\ht\sx@boxc\relax
\fi
\ifdim\dp\sx@boxc<#1 \dp\sx@boxc=#1\relax \fi
\sx@pd=\dp\sx@boxc
\box\sx@boxc}
% 签名下划线:长 #1、线宽 0.4 pt(Word underline,比表格线细)
\newcommand{\sx@rule}[1]{%
\rule[-0.55mm]{#1}{0.4pt}}
%----------------------------------------------------------------------
% \sx@put{偏移}{内容} —— 在「内容左界 + 偏移」处放置内容
%
% 原件的签名行、年月日全靠敲空格凑位置(R0 签名前是 30 个 14 pt 空格),
% 换台机器字号一改就散架。这里按实际x 坐标绝对定位,不随字体漂移。
%
% ⚠️⚠️ 用 \rlap(= \hbox to 0pt{...\hss})而非 \makebox[0pt][l]:
% 两者都是零宽盒左对齐,但 \makebox 内容超宽会报 Overfull \hbox
% (签名下划线 84 bp 必然超),\rlap 末尾有 \hss 吸收,静默通过。
% 因零宽,一行串多个 \sx@put 时共用同一原点,偏移各自独立。
%
% 偏移 = 「Word 导出 PDF 实际x」− 52.08(内容左界)
%----------------------------------------------------------------------
\newcommand{\sx@put}[2]{%
\rlap{\hspace*{#1}#2}}
%----------------------------------------------------------------------
% 单元格装配
%
% \sx@cellbl{高度}{块内容} 内容贴顶,不足高度补在底部(= trHeight atLeast)
\newcommand{\sx@cellbl}[2]{%
\setbox\sx@boxa=\vbox{\sx@blstart #2}%
\ifdim\dimexpr\ht\sx@boxa+\dp\sx@boxa\relax<#1
\vbox to #1{\box\sx@boxa\vfil}%
\else
\box\sx@boxa
\fi}
% \sx@cellvf{高度}{上半}{下半} 中间 \vfil 撑开 ⇒ 下半贴格底
%
% ⚠️⚠️ 非直觉之处:
% 最初写「先 \setbox 量内容,再 \vbox to <高>{\box\sx@box\vfil}」,
% 结果 R0 的「兹证明」跑到描述正下方(y=261.95,原件 382.13),
% 整块偏高 120 bp。
% 原因:\vbox{...\vfil} **被测量的那一刻** \vfil 就塌成 0
% (vbox 无目标高度,末端胶只能为 0)。再套壳时剩余胶只能加在
% 整体之后 → 变成「内容贴顶、空白在底」,与想要的正好相反。
% 正解:让 \vfil 与上下两半【同处一个有目标高度的 \vbox 里】。
\newcommand{\sx@cellvf}[3]{%
\setbox\sx@boxa=\vbox{%
\hsize=\sxboxw
\leftskip=\sxpad
\rightskip=\sxpad
\parindent=\z@
\parskip=\z@
#2}%
\setbox\sx@boxb=\vbox{\sx@blstart #3}%
% ⚠️⚠️ 末尾那个 \vskip\z@ 不能省。
% \vbox to N 设定的是**高度**,深度另计:若最后一项是 \box\sx@boxb
% 且它自带深度(本表末行深 3.11),则 vbox 的 \dp = 3.11,
% 总高变成 N + 3.11,整行高三点一一,四条横线全部下移
% (实际R0 = 287.11 而非 284.00)。
% 补一条零高胶让末项变成胶(胶无深度),\dp 归零,
% 总高才正好等于 N。
\ifdim\dimexpr\ht\sx@boxa+\ht\sx@boxb+\dp\sx@boxb\relax<#1
\vbox to #1{\box\sx@boxa\vfil\box\sx@boxb\vskip\z@}%
\else
\vbox{\box\sx@boxa\vfil\box\sx@boxb}%
\fi}
%======================================================================
% 5. 标题
%
% :22 pt 小标宋(→ 宋体真粗体),居中,标题段行距 25 pt。
% 文字中心 x = 300.41 bp,基线 y = 147.65。
%
% ⚠️⚠️ 为什么不能直接 \centering:
% 本包版心 16.47~186.01 mm,中心 287.03 bp;
% 标题要居中的是 docx 版心 28.01~184.01 mm,中心 300.41 bp。
% 两者差 13.4 bp,直接居中会左偏 4.7 mm。
% 正解:先 \hspace* 推到 docx 版心左界,再用一个正好等于
% docx 版心宽的 \makebox 居中。右边不会溢出:
% 11.54 + 156 = 167.54 mm < 169.54 mm。
%======================================================================
\newlength{\sxtitleindent}
\setlength{\sxtitleindent}{\dimexpr\sxofficialleft-\sxtblleft\relax}
\newlength{\sxtitlewidth}
\setlength{\sxtitlewidth}{156mm}
% 微调:标题中心原偏右 0.60 bp(字形宽度差所致)
\newlength{\sxtitlefix}
\setlength{\sxtitlefix}{-0.60bp}
% 标题前/后竖直距离(由 PDF 实际反推,见 README「实际记录」)
% ⚠️ 这两个值必须成对调:\sxprespace 在标题前、\sxpostspace 在标题后,
% 单独改一个会把标题与表格的间距一起改掉。标定见 README。
\newlength{\sxprespace}
\setlength{\sxprespace}{10.07bp}
\newlength{\sxpostspace}
\setlength{\sxpostspace}{21.09bp}
\newcommand{\sxtitle}[1]{%
\par\begingroup
\vspace*{\sxprespace}%
\noindent
\hspace*{\dimexpr\sxtitleindent+\sxtitlefix\relax}%
\makebox[\sxtitlewidth][c]{%
\sxfonttitle\songti\bfseries #1}%
\par\vspace*{\sxpostspace}%
\endgroup}
%======================================================================
% 6. 表格主体
%
% 原表是**单列 3 行**(tblGrid 只有一个 gridCol),即三行整宽方框上下叠。
% 没有合并单元格、没有多列,不需要 tabularray —— 手工 \vbox 叠三块
% 反而更可控:行高精确、内线不重复、内容可用 \vfil 撑。
% 外框 \framebox,两条内线 \hrule(各占 \sxrule)。
%======================================================================
\newcommand{\sxtable}{%
\par\noindent
\begingroup
\setlength{\fboxsep}{0pt}%
\setlength{\fboxrule}{\sxrule}%
\framebox[\sxtblw]{%
\vbox{%
\hsize=\sxboxw
\sx@rowa@box
\hrule height \sxrule
\sx@cellbl{\sxrowb}{\sx@rowB}%
\hrule height \sxrule
\sx@cellbl{\sxrowc}{\sx@rowC}%
}%
}%
\par\endgroup}
%======================================================================
% 7. 三行内容的装配
%
% 三行里的固定话术(「兹证明该事项真实有效……」等)是学校规定原文,
% **不要在 .tex 里改**;它们在这里装配好,.tex 只提供要人填的几项:
% \sxdesc 事项描述正文(必填)
% \sxdateA 项目负责人签字处日期(留空则印「 年 月 日」)
% \sxdateB 单位负责人签字处日期
% \sxdateC 科技管理部门签字处日期
%
% ⚠️ 为什么不让 .tex 改整行:原件里这些行全靠敲空格对齐,一旦让
% 用户自己写,每人写出来都不一样,模板就失去意义。这里按实际
% x 坐标把固定部分钉死,.tex 只需填描述与日期。
%
% ------------------------------------------------------------------
% R0 纵向结构(全表最麻烦的一处)
%
% R0 共 19 段:1「事项描述:」/ 2~3 空 / 4 描述正文 /
% 5~12 八个空段(给手写留白)/ 13 空 / 14「兹证明…」/ 15 签名 /
% 16 年月日 / 17「项目负责人是…」/ 18「非科研经费…」
%
% 那 8 个空段是**手写留白**。本模板把描述改成排字(\sxdesc),
% 它们就成了死间距:描述写短了下面一大片空白,写长了把签名区顶到下一行。
% ⇒ 删掉,改用「上下两半 + 中间 \vfil」:
% 描述短 → 空白落在两半之间,签名区不动
% 描述长 → 空白被吃掉,签名区仍然不动
% 这是本模板比原件更稳的地方。
% ⚠️ 但 \vfil 不能无限压:描述特别长时签名区会挤出行外。
% 这是内容超量的正常表现(Word 里也一样),不是 bug。
%
% ------------------------------------------------------------------
% 实际基线(PDF 绝对 y;Δ 为与上一行的基线距)
%
% R0(顶线 172.99,内容顶 173.24)
% 事项描述 183.77 (10.53)
% 描述首行 227.81 (54.57) ← 段内行距 13.68
% 兹证明 382.13 (208.89)
% 项目负责人 397.37 (Δ15.24)
% 年月日 412.85 (Δ15.48)
% 项目负责人是 426.89 (Δ14.04) ← 段内行距 13.56
% 责任。 440.45 (Δ13.56)
% 非科研经费 454.13 (Δ13.68) 末行深 3.11
%
% R1(顶线 457.49,内容顶 457.74)
% 本人证明 468.29 (10.55)
% 单位负责人 483.41 (Δ15.12)
% 年月日 498.89 (Δ15.48)
% 学院 512.93 (Δ14.04) 末行深 3.16
%
% R2(顶线 516.34,内容顶 516.59)
% 科技管理 527.09 (10.50)
% 负责人签字 554.33 (Δ27.24) ← 原件一个空段,留写字空间
% 年月日 569.93 (Δ15.60) 末行深 3.46
%======================================================================
%----------------------------------------------------------------------
% 日期行
%
% 原件「 年 月 日」,三字间隔**各处不同**:
% R0 370.08 / 412.08 / 454.08 步长 42 / 42
% R1 400.08 / 442.08 / 484.08 步长 42 / 42
% R2 424.08 / 454.08 / 478.08 步长 30 / 24 ← 这格右边距紧
%
% ⚠️⚠️ 两个坑:
% ① 原来用 \makebox[12pt][l] + \hspace{步长−12pt} 拼步长,
% 12 pt(12.045 bp)与 42 pt(42.157 bp)混减,每字累积
% 0.16 bp,第三个字偏出 1.6 bp。
% ② 原来年份用 \makebox[12pt][l]{#1},即使 #1 为空**仍占 12 pt**,
% 把「年」推出 30 pt,整组右移 28.67 bp。
% ⇒ 三字全用 \sx@put 绝对定位,不积累、不占位;年份用右对齐
% \makebox 挂在「年」左边,空着就整块不出。
%
% \sx@dateline{年份}{年 x}{月 x}{日 x}
%----------------------------------------------------------------------
\newcommand{\sx@ifempty}[1]{\if\relax\detokenize{#1}\relax}
\newcommand{\sx@dateline}[4]{%
\sx@ifempty{#1}\else
\sx@put{\dimexpr#2-26bp\relax}{\makebox[24bp][r]{#1}}%
\fi
\sx@put{#2}{年}%
\sx@put{#3}{月}%
\sx@put{#4}{日}}
%----------------------------------------------------------------------
% R0 —— 事项描述 + 项目负责人签字
%----------------------------------------------------------------------
\newcommand{\sx@rowa@box}{%
\sx@cellvf{\sxrowa}%
{\sxfontbody\songti
\sx@blstart
\sx@bl{10.53bp}{事项描述:}%
\sx@blp{44.04bp}{13.68bp}{\sxdesc}}%
{\sxfontbody\songti
\sx@blstart
\sx@bl{0bp}{\sx@put{31.56bp}{兹证明该事项真实有效,本人愿意为此承担责任。}}%
\sx@bl{15.24bp}{%
\sx@put{210.00bp}{\sxfontsign\songti 项目负责人(签名):}%
\sx@put{323.97bp}{\sx@rule{84bp}}}%
\sx@bl{15.48bp}{%
\sx@put{318.00bp}{\sxfontsign\songti}%
\sx@dateline{\sxdateA}{318.00bp}{360.00bp}{402.00bp}}%
\sx@blp{14.04bp}{13.56bp}{%
\hspace*{21.00bp}项目负责人是科研经费使用的直接责任人,对经费使用的真实性、合理性及有效性承担经济与法律责任。}%
\sx@bl[3.11bp]{13.68bp}{\sx@put{21.00bp}{非科研经费亦适用本表格。}}}}
%----------------------------------------------------------------------
% R1 —— 单位负责人签字 + 单位公章
% 实际下划线 x 187.05~253.05(长 66 bp);「单位公章:」后不画线。
%----------------------------------------------------------------------
\newcommand{\sx@rowB}{%
\sxfontbody\songti
\sx@bl{10.55bp}{本人证明以上事项属实,并愿意承担相应责任。}%
\sx@bl{15.12bp}{%
\sx@put{21.00bp}{\sxfontsign\songti 单位负责人(签名):}%
\sx@put{134.97bp}{\sx@rule{66bp}}%
\sx@put{309.00bp}{\sxfontsign\songti 单位公章:}}%
\sx@bl{15.48bp}{%
\sx@put{348.00bp}{\sxfontsign\songti}%
\sx@dateline{\sxdateB}{348.00bp}{390.00bp}{432.00bp}}%
\sx@bl[3.16bp]{14.04bp}{\sx@put{15.72bp}{学院对本单位科研经费使用承担监督和管理责任。}}}
%----------------------------------------------------------------------
% R2 —— 科技管理部门审批意见
% 「科技管理」→「负责人签字」差 27.24 bp,比正常行距 15.6 多 11.64,
% 对应原件这一个空段(审批意见要留写字空间)。
%----------------------------------------------------------------------
\newcommand{\sx@rowC}{%
\sxfontbody\songti
\sx@bl{10.50bp}{科技管理部门审批意见:}%
\sx@bl{27.24bp}{%
\sx@put{26.28bp}{\sxfontsign\songti 负责人签字:}%
\sx@put{314.28bp}{\sxfontsign\songti 单位公章:}}%
\sx@bl[3.46bp]{15.60bp}{%
\sx@put{372.00bp}{\sxfontsign\songti}%
\sx@dateline{\sxdateC}{372.00bp}{402.00bp}{426.00bp}}}
%======================================================================
% 8. 备注区
%
% 三条备注是「annotation text」样式 + 自动编号(decimal "%1."),
% 行距 15 pt。实际基线 585.89 / 600.89 / 615.89 / 630.89(间距 15)。
% 实际x: 「备注:」79.44,编号「1.」95.16~103.05,正文 113.16
% ⇒ 减内容左界 52.08:27.36 / 50.97 / 61.08
%
% ⚠️ 四条同样不能用 \baselineskip —— 各自独立成段(同第 4 节坑一)。
%
% ⚠️ 第 3 条在里是**手打的**「 3. 」(没有 numPr),
% 比前两条多两个空格、位置差 0.36 bp。本模板统一排齐,
% 这是与原件唯一的有意差异(README「与原件差异」已列明)。
%======================================================================
\newlength{\sxnotebody}
\setlength{\sxnotebody}{61.08bp} % 正文左端
\newlength{\sxnotenum}
\setlength{\sxnotenum}{50.97bp} % 编号右端
\newlength{\sxnotelab}
\setlength{\sxnotelab}{27.36bp} % 「备注:」左端
% #1 = 编号 #2 = 正文
%
% ⚠️ 偏移用「相对内容左界」的值,不要再减 \sxpad。
% \sx@bl 的行盒是 \hbox to \sxboxw{\hskip\sxpad 内容\hss},
% \rlap 的参照原点就在那 \hskip 之后 —— 也就是内容左界本身。
\newcommand{\sxnoteitem}[2]{%
\sx@bl{15bp}{%
\rlap{\hspace*{\sxnotenum}\makebox[0bp][r]{#1}}%
\rlap{\hspace*{\sxnotebody}#2}}}
%----------------------------------------------------------------------
% 备注区四条(引言 + 三条),原文照录 —— 学校规定文字,不要改
% ⚠️ 引言「备注:使用科研经费报销时……」是**连排的一句话**,
% 「备注:」不是悬挂标签,整行从 79.44 起排,故只需一个 \sx@put。
%----------------------------------------------------------------------
% 第一行的「块顶 → 首行基线」:实际585.89 − 表格底 573.89 = 12.00
\newcommand{\sxnotes}{%
\par\nointerlineskip
\vbox{%
\sxfontbody\songti
\sx@blstart
\sx@bl{12.00bp}{\sx@put{\sxnotelab}{备注:使用科研经费报销时,本表需要相关负责人签字审批的情形和要求如下:}}%
\sxnoteitem{1.}{符合《办法》第十八条第八款、第二十三条情形的,需项目负责人、单位负责人签字;}%
\sxnoteitem{2.}{符合《办法》第二十二条的情形,需项目负责人、单位负责人和科技部门负责人签字;}%
\sxnoteitem{3.}{除以上两种情形外,其他均由项目负责人签字。}}%
\par}
%======================================================================
% 9. 页脚
%
% 页脚:右对齐「— 1 —」,宋体 14 pt,右缩进 180 twips = 9 pt。
% 实际整串左端 463.56、右端 512.65。本包版心右界 527.02,
% 故整串需再左移 527.02 − 512.65 = 14.37 bp。
%
% 负 \hspace 放**开头** —— 完全没效果(实际偏右 24.94 bp)。
% 原因:fancyhdr 的 [R] 位把内容放进 \hbox to \textwidth 并前置
% \hfil,靠「内容块整体贴右」对齐。开头加负 \hspace 只把块起点
% 左移,块宽没变,右边界仍贴版心右界。
% 正解:把内容装进**零宽盒**,让它的右缘成为对齐基准,
% 再用末尾的 \hspace 把基准往里推。
%======================================================================
\newlength{\sxfootinset}
\setlength{\sxfootinset}{24.94bp}
\newcommand{\sxfootfont}{\sxfontfoot\songti}
\newcommand{\sxfootcontent}{%
\makebox[0pt][r]{\sxfootfont — \thepage\ —}%
\hspace*{\sxfootinset}}
\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\fancyfoot[R]{\sxfootcontent}
\fancypagestyle{plain}{%
\fancyhf{}%
\renewcommand{\headrulewidth}{0pt}%
\renewcommand{\footrulewidth}{0pt}%
\fancyfoot[R]{\sxfootcontent}%
}
%======================================================================
% 10. 一句话入口
%
% \sxform —— 在 .tex 里只调这一个,整张表就出来了。
% 标题、表格、备注、页脚全在里面。
%======================================================================
\newcommand{\sxform}{%
\sxtitle{中国海洋大学特殊事项说明表}%
\sxtable
\sxnotes}
\AtBeginDocument{\sxfontbody\songti}
\endinput