Files
ouc_latex_template/特殊事项说明表/ouccsx.sty
T

630 lines
29 KiB
TeX
Raw Normal View History

%======================================================================
% ouccsx.sty — 中国海洋大学 特殊事项说明表 版式包
%
% 依据:报销相关/中国海洋大学特殊事项说明表.docx(Word 2007 保存)
2026-11-01 09:29:00 +08:00
% 目标:版式与逐项对齐;内容可随意增删而不破版。
%
% 尺寸换算:
% 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,
2026-11-01 09:29:00 +08:00
% 超过一个字符宽,肉眼看得出。标注坐标者均为 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. 页面与版心
%
2026-11-01 09:29:00 +08:00
% 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)向左顶出去。
%
2026-11-01 09:29:00 +08:00
% 坐标(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, % = 表格外宽
2026-11-01 09:29:00 +08:00
% ⚠️ 坐标差:本包所有 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. 字体与字号
%
2026-11-01 09:29:00 +08:00
% 字号(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",
2026-11-01 09:29:00 +08:00
% 但 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}
2026-11-01 09:29:00 +08:00
\setlength{\sxpad}{4.93bp} % 校到内容左界 52.08(实际52.11)
\newlength{\sxboxw} % 单元格内容盒宽(不含边框)
\setlength{\sxboxw}{\dimexpr\sxtblw-2\sxrule\relax}
% ⚠️⚠️ 段落折行的可用宽度 ≠ 盒宽。
% 折行可用宽 = \sxboxw − \sxpad − \sxbodypad。
2026-11-01 09:29:00 +08:00
% 原件内容左界 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」算。
2026-11-01 09:29:00 +08:00
% 最初每行 \par 之后单独给 \baselineskip,**完全无效**:
% 所有行距被压成 13.51,12 pt 的签名行没变高,整表矮 2.25 bp。
% 原因:每行 \par 自成一段后,段间基线距离 = 上段末行深度 +
% \parskip + 本段首行字高,\baselineskip 根本没被读到。
%
% 【正解】不依赖 \baselineskip,逐行显式插胶:
%
% 基线距 = 上盒深度 + \kern + 本盒高度
% ⇒ \kern = 目标距 − 上盒深度 − 本盒高度
%
% 与字体度量彻底解耦:换字体、换字号、描述写长写短,行距不变。
%
% 【坑二】块首行必须用 \kern,不能用 \vskip。
% TeX 会【丢弃 \vbox 开头的胶】,用 \vskip 给的顶距静默消失
2026-11-01 09:29:00 +08:00
% (实际「事项描述:」给 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)·行距。漏掉这一项,
2026-11-01 09:29:00 +08:00
% 多行段自己会被推下一整行,其后所有行跟着错(实际0.48 而非 14.04)。
% ⇒ 用 \prevgraf 取段内行数,把 (n−1)·行距加回 kern。
% ⚠️ \dp 不用改:\vbox 的 \dp 就是末行的真实深度。
%
% 【坑五】\offinterlineskip 会继承进段落内部。
% 它把 \lineskiplimit 设成极小值,段内多行改走 \lineskip(=0),
2026-11-01 09:29:00 +08:00
% \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 下半块:那块是贴格底的,全部位置由
% 「末行深度 + 逐行行距」反推出来,再给绝对顶距就重复
2026-11-01 09:29:00 +08:00
% 定位了(实际多给 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 **内部**取 —— 它是「当前正在排的段落行数」,
2026-11-01 09:29:00 +08:00
% vbox 一关闭就恢复成外层值(实际把 2 读成 0)。
% ② 必须在 \par **之后**取 —— \prevgraf 是在段落断行那一步
2026-11-01 09:29:00 +08:00
% 才被写入的,\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 会把首行推下一整行
2026-11-01 09:29:00 +08:00
% (实际描述两行偏 +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 空格),
2026-11-01 09:29:00 +08:00
% 换台机器字号一改就散架。这里按实际x 坐标绝对定位,不随字体漂移。
%
% ⚠️⚠️ 用 \rlap(= \hbox to 0pt{...\hss})而非 \makebox[0pt][l]:
% 两者都是零宽盒左对齐,但 \makebox 内容超宽会报 Overfull \hbox
% (签名下划线 84 bp 必然超),\rlap 末尾有 \hss 吸收,静默通过。
% 因零宽,一行串多个 \sx@put 时共用同一原点,偏移各自独立。
%
2026-11-01 09:29:00 +08:00
% 偏移 = 「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 撑开 ⇒ 下半贴格底
%
2026-11-01 09:29:00 +08:00
% ⚠️⚠️ 非直觉之处:
% 最初写「先 \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,整行高三点一一,四条横线全部下移
2026-11-01 09:29:00 +08:00
% (实际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. 标题
%
2026-11-01 09:29:00 +08:00
% :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}
2026-11-01 09:29:00 +08:00
% 微调:标题中心原偏右 0.60 bp(字形宽度差所致)
\newlength{\sxtitlefix}
\setlength{\sxtitlefix}{-0.60bp}
2026-11-01 09:29:00 +08:00
% 标题前/后竖直距离(由 PDF 实际反推,见 README「实际记录」)
% ⚠️ 这两个值必须成对调:\sxprespace 在标题前、\sxpostspace 在标题后,
2026-11-01 09:29:00 +08:00
% 单独改一个会把标题与表格的间距一起改掉。标定见 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 改整行:原件里这些行全靠敲空格对齐,一旦让
2026-11-01 09:29:00 +08:00
% 用户自己写,每人写出来都不一样,模板就失去意义。这里按实际
% x 坐标把固定部分钉死,.tex 只需填描述与日期。
%
% ------------------------------------------------------------------
% R0 纵向结构(全表最麻烦的一处)
%
2026-11-01 09:29:00 +08:00
% R0 共 19 段:1「事项描述:」/ 2~3 空 / 4 描述正文 /
% 5~12 八个空段(给手写留白)/ 13 空 / 14「兹证明…」/ 15 签名 /
% 16 年月日 / 17「项目负责人是…」/ 18「非科研经费…」
%
% 那 8 个空段是**手写留白**。本模板把描述改成排字(\sxdesc),
% 它们就成了死间距:描述写短了下面一大片空白,写长了把签名区顶到下一行。
% ⇒ 删掉,改用「上下两半 + 中间 \vfil」:
% 描述短 → 空白落在两半之间,签名区不动
% 描述长 → 空白被吃掉,签名区仍然不动
% 这是本模板比原件更稳的地方。
% ⚠️ 但 \vfil 不能无限压:描述特别长时签名区会挤出行外。
% 这是内容超量的正常表现(Word 里也一样),不是 bug。
%
% ------------------------------------------------------------------
2026-11-01 09:29:00 +08:00
% 实际基线(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 —— 单位负责人签字 + 单位公章
2026-11-01 09:29:00 +08:00
% 实际下划线 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. 备注区
%
2026-11-01 09:29:00 +08:00
% 三条备注是「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 节坑一)。
%
2026-11-01 09:29:00 +08:00
% ⚠️ 第 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。
%----------------------------------------------------------------------
2026-11-01 09:29:00 +08:00
% 第一行的「块顶 → 首行基线」:实际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. 页脚
%
2026-11-01 09:29:00 +08:00
% 页脚:右对齐「— 1 —」,宋体 14 pt,右缩进 180 twips = 9 pt。
% 实际整串左端 463.56、右端 512.65。本包版心右界 527.02,
% 故整串需再左移 527.02 − 512.65 = 14.37 bp。
%
2026-11-01 09:29:00 +08:00
% 负 \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