From 8fa44b138c55c96edb554adef81a9e697de11ee5 Mon Sep 17 00:00:00 2001 From: laoyang Date: Tue, 27 Oct 2026 07:51:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AF=95=E5=8D=B7=E5=BD=92?= =?UTF-8?q?=E6=A1=A3=E7=9B=AE=E5=BD=95=20LaTeX=20=E6=A8=A1=E6=9D=BF=20#7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把「附件2:信息科学与工程学院归档目录(理论课).doc」做成 LaTeX 模板, 落在 试卷归档目录/。版式逐项照原 .doc 还原,尺寸全部注明换算过程。 - oucgddir.sty:A4、表宽 150.81mm、13 行固定行高、单元格宏 - 试卷归档目录.tex:12 项核对清单 - README.md:用法 / 版式参数表 / 实测数据 / 踩坑记录 - 根 README.md、fonts.tex:模板清单加一项,「七个」改「八个」 与原稿实测对比(pymupdf 读 PDF): 表格竖线 x Δ ≤ 0.001mm,横线 y Δ ≤ 0.006mm 32 行文字水平中心 Δ ≤ 0.11pt,字号 24/18/12/10.45 全部精确 编译 1 页,零 Overfull / Underfull / 缺字 踩到并解决的五个坑: 1. \fontsize 必须用 bp(TeX pt 比 PostScript pt 大 0.36%,24pt 实测 23.91) 2. xeCJK 吞连续半角空格 → 标题字间用 \gdgap 手动 kern 24bp 3. xeCJK 默认 PunctStyle=quanjiao 会挤压全角括号,使含括号的行整行 右移 4.23pt → 必须 \xeCJKsetup{PunctStyle=plain} 4. tabularray 把线宽算进列宽、ht 不含 hline 线宽、boxes 比 Σwd 多 0.4945pt → 三处都要实测标定 5. 单元格整体下移只有「尾部 \vspace*」有效,顶部 \vspace*/rule 会被 首行 ascent 吃掉,\raisebox 被 m 居中抵销 字体:方正楷体_GB2312(商业,不可分发)→ OUC Kai(霞鹜文楷子集,OFL 1.1), 西文 Times New Roman → TeX Gyre Termes。字宽逐字相同(60.00 / 120.00pt 全等)。 --- README.md | 3 +- fonts.tex | 2 +- 试卷归档目录/README.md | 199 +++++++++++++++ 试卷归档目录/oucgddir.sty | 461 ++++++++++++++++++++++++++++++++++ 试卷归档目录/试卷归档目录.pdf | Bin 0 -> 25839 bytes 试卷归档目录/试卷归档目录.tex | 61 +++++ 6 files changed, 724 insertions(+), 2 deletions(-) create mode 100644 试卷归档目录/README.md create mode 100644 试卷归档目录/oucgddir.sty create mode 100644 试卷归档目录/试卷归档目录.pdf create mode 100644 试卷归档目录/试卷归档目录.tex diff --git a/README.md b/README.md index 77761e4..c193b2b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ |---|---|---| | [`试卷/`](试卷/) | 期末考试**试卷**、**参考答案及评分标准**两套模板 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` | | [`试卷归档封面/`](试卷归档封面/) | 信息科学与工程学部**试卷归档封面**(理论课) | `试卷归档封面.tex` | +| [`试卷归档目录/`](试卷归档目录/) | 信息科学与工程学部**试卷归档目录**(理论课,12 项核对清单) | `试卷归档目录.tex` | | [`年度考核登记表/`](年度考核登记表/) | 教职工**年度考核登记表** | `年度考核登记表.tex` | | [`劳务发放说明表/`](劳务发放说明表/) | **劳务发放说明表** | `劳务发放说明表.tex` | | [`课程执行大纲/`](课程执行大纲/) | 本科**课程教学执行大纲、教学日历** | `课程执行大纲.tex` | @@ -28,7 +29,7 @@ xelatex slides.tex # 跑两遍,第二遍才能取到正确的目录、 ## 说明 -- **字体单一来源**:全库字体集中在根目录 [`fonts/`](fonts/),由 [`fonts.tex`](fonts.tex) 统一加载。七个模板通过 `\input{../fonts.tex}` 取字体,**不自带字体、不依赖系统字体**——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。 +- **字体单一来源**:全库字体集中在根目录 [`fonts/`](fonts/),由 [`fonts.tex`](fonts.tex) 统一加载。八个模板通过 `\input{../fonts.tex}` 取字体,**不自带字体、不依赖系统字体**——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。 - **全部开源可商用**:无方正、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、无微软雅黑。用的是思源宋体/黑体、霞鹜文楷、朱雀仿宋、TeX Gyre Termes、鸿蒙 HarmonyOS Sans(各字体授权见 [`fonts/LICENSE`](fonts/LICENSE),来源与字符集见 [`fonts/README.md`](fonts/README.md))。 - **每个子目录自包含**:样式文件(`.sty` / `.cls`)、图片都在各目录内,编译时不需要额外的宏包搜索路径;只有字体是共享的上层目录。 - **各目录的 `README.md`** 写明该模板的用法、可改参数、版式数据来源与书写注意事项,改之前先看。 diff --git a/fonts.tex b/fonts.tex index 428e8a2..ff3ebd1 100644 --- a/fonts.tex +++ b/fonts.tex @@ -1,7 +1,7 @@ %====================================================================== % oucfonts.tex —— 中国海洋大学模板库的公共字体入口 % -% 本文件是仓库内**唯一**允许声明字体的地方。七个模板全部通过 +% 本文件是仓库内**唯一**允许声明字体的地方。八个模板全部通过 % \input{../fonts.tex} % 取字体,不再各自写 \setCJKmainfont / \setmainfont。 % diff --git a/试卷归档目录/README.md b/试卷归档目录/README.md new file mode 100644 index 0000000..1cd5125 --- /dev/null +++ b/试卷归档目录/README.md @@ -0,0 +1,199 @@ +# 试卷归档目录 —— 信息科学与工程学部试卷归档目录(理论课) + +信息科学与工程学部**试卷归档目录**的 XeLaTeX 模板。原文件是学院/学部下发的 +`.doc` 表(12 项核对清单),本目录把它做成可直接编译的 LaTeX 版。 + +> **改名说明**:原文件名为「附件2:信息科学与工程学院归档目录(理论课)」, +> 内文写的是「归档目录」、未出现单位名。按现行建制已统一为 **学部**, +> 目录名、文件名同步。内文标题保持原文「归 档 目 录」(四字间隔一个字宽)。 + +> 与 [`试卷归档封面/`](../试卷归档封面/) 的关系:两件是**同一套归档材料**的 +> 两个附件的原件配套 —— 附件1 是封面(随卷装订、11 行表单),本目录是 +> 附件2(装袋前逐项核对的清单、12 项勾选表)。版式上都照原 `.doc` 1:1 还原, +> 但一个是 A4 表单、一个是 A4 居中表格,互不依赖。 + +## 文件 + +| 文件 | 说明 | +|---|---| +| `oucgddir.sty` | 版式包。A4、表宽 150.64mm、13 行固定行高,每项尺寸都附换算过程 | +| `试卷归档目录.tex` | 正文入口(12 项清单写在这里,增删改归档项只改这个文件) | +| `试卷归档目录.pdf` | 成品样张 | + +## 编译 + +```bash +xelatex 试卷归档目录.tex +``` + +必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。 +自包含,不依赖任何图片。实测 1 页,零警告(无 Overfull / Underfull / 缺字)。 + +## 用法 + +正文就是一张表,加行改行即可: + +```latex +\begin{gdtable} + \gdhead{序号} & \gdhead{内容} & \gdheadIII \\ + \gdno{1} & \gditem{考试签到表} & \\ + \gdno{2} & \gditem{监考记录} & \\ + % …… 照此继续 +\end{gdtable} +``` + +可用的单元格宏: + +| 宏 | 用途 | 字号/字形 | +|---|---|---| +| `\gdno{1}` | 序号列 | 楷体 12pt 粗 | +| `\gditem{考试签到表}` | 内容列 | 楷体 12pt | +| `\gdhead{序号}` | 表头单段格(序号、内容两列) | 楷体 18pt 粗 | +| `\gdheadIII` | 表头第三格,**自带**「标注」+ 小字两段 | 18pt 粗 + 10.45pt | +| `\gdnote{...}` | 单独排一行小字(10.45pt) | 楷体 10.45pt | + +标题用 `\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}` —— **`\gdgap` 不能省**, +原因见下面第 3 条。 + +## 版式参数 + +全部照原 `.doc` 实测值,未做主观调整: + +| 项目 | 值 | 来源 | +|---|---|---| +| 纸张 | A4 210×297mm | `pgSz` 11906×16838 twips | +| 页边距 | 上下 25.40mm、左右 29.599mm | `pgMar` top/bottom 1440 twips;左右经实测标定,见下 | +| 表宽 | 150.81mm | `tblGrid` 合计 8540 twips = 150.64mm,加列取整余量 | +| 列宽 | 23.072 + 77.346 + 50.218 mm | `gridCol` 1308 / 4385 / 2847 twips | +| 单元格内边距 | 左右 1.905mm、上下 0 | `tblCellMar` 108 twips | +| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位) | +| 行高 | 表头 20.549mm、中间 12 行 13.758mm、末行 14.164mm | `trHeight` 1165 / 780 / 803 twips,`hRule=exact` | +| 标题 | 楷体 24pt,首行缩进 46.55mm | `firstLine` 2640 twips | +| 表头 | 楷体 18pt 粗 | `w:sz=36` + `w:b` | +| 表头小注 | 楷体 10.45pt | `w:szCs=21`(未设 `w:sz`,Word 退回 10.5pt) | +| 序号列 | 楷体 12pt 粗 | `w:sz=24` + `w:b` | +| 内容列 | 楷体 12pt | `w:sz=24` | + +## 实测校验 + +用 pymupdf 读两版 PDF,逐位对比(原稿由 WPS 导出): + +``` +表格竖线 x (mm) 原稿 29.686 / 52.758 / 130.104 / 180.322 + 新版 29.687 / 52.758 / 130.104 / 180.321 Δ ≤ 0.001 + +表格横线 y (mm) 原稿 53.001 … 239.056(14 条) + 新版 53.004 … 239.050 Δ ≤ 0.006 + +标题四字 x0 (pt) 原稿 222.00 / 270.00 / 318.00 / 366.00 + 新版 221.95 / 269.93 / 317.93 / 365.93 Δ ≤ 0.07 + +32 行文字水平中心 最大偏差 0.11pt +32 行文字距行顶 最大偏差 0.57pt(数字与中文各自字体度量差,见下) +字号 24.00 / 18.00 / 12.00 / 10.45 …………全部精确 +``` + +> 纵向那 0.5pt 的来源:原稿序号列用 Times New Roman、正文用方正楷体, +> Word 让**两种字体各自按自身 ascent 落基线**,同一行里数字比中文高 0.48pt +> (原稿实测 232.25 vs 231.77)。新版用 Termes + OUC Kai 复刻了同样的 +> 相对关系(232.32 vs 232.32 —— 差 0,因为 Termes 与 OUC Kai 的 ascent +> 恰好一致)。这是**字体度量差**,不是排版错误,且新版同一行内更整齐。 + +## 五个坑(改之前先看) + +### 1. `\fontsize` 必须用 `bp`,不能用默认的 `pt` + +Word/PDF 里的 "pt" 是 **PostScript point**(1/72 英寸),TeX 的默认 `pt` 是 +**TeX point**(1/72.27 英寸),后者大出 0.36%。写 `\fontsize{24}{28.8}`, +PDF 里实测只有 **23.91**(= 24 × 72/72.27),与原稿的 24.00 对不上。 + +```latex +\fontsize{24bp}{28.8bp}\selectfont % 实测正好 24.000 +``` + +本包所有照抄 Word 数值的字号、行距、间距一律写 `bp`。 + +### 2. xeCJK 会吞掉连续半角空格 + +标题原文是「归␣␣档␣␣目␣␣录」(字间各两个半角空格)。直接照抄进源码, +编译出来是紧贴的「归档目录」—— 空格全没了(实测 x0=216.09,且只有一个 +span,而原稿是四个独立字、间隔恒 48pt)。 + +正解是不依赖空格策略,用 `\kern` 手动摆: + +```latex +\newcommand{\gdgap}{\kern\gdtitlegap} % \gdtitlegap = 24bp = 1 个字宽 +\gdtitle{归\gdgap 档\gdgap 目\gdgap 录} +``` + +### 3. 必须关掉 xeCJK 的全角标点压缩(`PunctStyle=plain`) + +**这条最隐蔽。** 现象:凡含全角括号的行,整行右移 4.23pt,而字宽完全正确。 +「试卷(项目设计报告)」原稿 x0=199.20,默认设置排出 **203.43**。 + +根因是 xeCJK 默认 `PunctStyle=quanjiao` 会对全角标点做字宽挤压:「(」「)」 +的 advance 从 1.0em 压到 0.5em,省下的空间记在**行内盒子的起点**上,于是 +整行墨迹相对盒子右移。两端对齐的正文里这叫"标点紧凑",但在**居中**的表格 +单元格里就是整行偏移,且偏移量随括号个数变化(1 个 4.23pt、2 个 8.46pt)。 + +```latex +\xeCJKsetup{PunctStyle=plain} +``` + +Word 本来就不做这个挤压,关掉反而与原件一致。 + +### 4. `totalwidth` / 行高 / 位移都要比理论值多留一点 + +tabularray 的**计宽**与**画宽**不是一回事,三处都要实测标定: + +- **列宽**:它把边框线宽算进列宽,故 `wd = gridCol − 2×colsep − 线宽`, + 而不是"按竖线根数分摊"。按分摊算每列窄 0.154mm,整表窄 0.466mm。 +- **表宽**:左竖线画在版心左边界**内侧**,整个 tblr 盒子比 + `Σwd + 6×colsep + 4×线宽` 又多约 0.4945pt,不补足就报 + `Overfull \hbox (0.49452pt too wide)`。 +- **行高**:`row{..}={ht=..}` 是**内容区**高度,hline 线宽不含在内, + 每行实际比 ht 高整整一个 `\gdrule`(0.5pt)。13 行累计多 6.5pt, + 必须逐档减掉 0.1764mm。 + +### 5. 单元格里想"整体下移",只有一种写法有效 + +`\gdheadIII` 要让「标注」+ 小注两段整体下移 1.49pt,五种手段实测对比 +(数值为距行顶距离,末项是两段间距): + +| 手段 | 标注 | 小注 | 间距 | 结论 | +|---|---|---|---|---| +| 原样 | 25.43 | 46.53 | 21.09 | 偏低 1.49 | +| 尾部 `\vspace*{-2.98pt}` | 26.92 | 48.01 | 21.10 | ✅ 正确 | +| 顶部 `\vspace*{+2.98pt}` | 23.95 | 48.01 | 24.06 | 反向且拉大间距 | +| 顶部 `\rule{0pt}{26.5pt}` | 31.25 | 52.34 | 21.09 | 位移过大 | +| `\raisebox{-1.49pt}{\vbox{..}}` | 25.43 | 46.53 | 21.09 | 完全无效 | + +原理:尾部间距 s 改变盒子总高 H(H' = H + s),m 居中后 +内容顶端 = 行顶 + (行高 − H')/2。所以 **s 与位移是 2:1 关系**, +但实测灵敏度是 0.778 而非 0.5(hline 也参与高度分配),故最终标定值是 +`\vspace*{-2.98pt}` 而不是 −1.49×2。 + +顺带一个反直觉的点:**顶部间距会被首行的 ascent 吃掉** —— 3.6pt 的 +`\rule` 远小于 18pt 字的 ascent,写了等于没写;必须超过 ascent 才有反应, +但那时位移已经过量。所以"顶部加高"这条路走不通。 + +## 字体 + +全部来自仓库公共字体包 [`../fonts.tex`](../fonts.tex),来源与授权见 +[`../fonts/README.md`](../fonts/README.md)。 + +原稿中文用「方正楷体_GB2312」(商业字体,不允许随仓库分发),现换成 +**OUC Kai**(霞鹜文楷 GB2312 子集,SIL OFL 1.1)—— 同为楷体、同为 +GB2312 字符集,字宽逐字相同(实测「考试签到表」= 60.00pt, +「试卷(项目设计报告)」= 120.00pt,与原稿全等)。西文/数字原用 +Times New Roman,现用 **TeX Gyre Termes**(度量兼容替代)。 + +## 一个已知的"不改动" + +原表 `tblGrid` 合计 8540 twips = **150.64mm**,而原版心 210 − 2×31.75 += **146.50mm** —— 原文档里这张表本来就在版心之外各溢出 2.07mm,靠 +`jc=center` 居中掩盖,看起来正常。 + +本模板把版心直接设成表宽(150.81mm),表格居中与纸面绝对位置与原稿一致 +(见上面的实测校验),但不再"溢出版心":**视觉上无差别,且不产生 +Overfull 警告**。这是唯一的主动偏离,属修正而非改版。 \ No newline at end of file diff --git a/试卷归档目录/oucgddir.sty b/试卷归档目录/oucgddir.sty new file mode 100644 index 0000000..5982239 --- /dev/null +++ b/试卷归档目录/oucgddir.sty @@ -0,0 +1,461 @@ +%====================================================================== +% oucgddir.sty — 信息科学与工程学部 试卷归档目录(理论课)版式包 +% +% 依据:附件2:信息科学与工程学院归档目录(理论课).doc +% (SynologyDrive/授课/数字逻辑/2025/归档/) +% 原名与内文写的是「学院」,按现行建制改为「学部」, +% 模板标题相应为「信息科学与工程学部试卷归档目录」。 +% +% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算: +% pt → mm : mm = pt / 72 * 25.4 +% twips → mm : mm = twips / 1440 * 25.4 +% w:sz : 半磅值,÷ 2 即 pt +% +% 用法见同目录 试卷归档目录.tex,说明见 README.md +%====================================================================== +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{oucgddir}[2026/10/27 v1.0 OUC exam archive checklist] + +\RequirePackage{geometry} +\RequirePackage{fontspec} +\RequirePackage{xeCJK} +\RequirePackage{tabularray} + +%====================================================================== +% 1. 页面与版心 +% +% 原 .doc sectPr: +% pgSz w:w=11906 h:h=16838 → A4(210.01 × 297.00 mm) +% pgMar top/bottom = 1440 twips = 25.40 mm +% left/right = 1800 twips = 31.75 mm +% header 851 / footer 992 twips +% +% 但这张表本身【比版心宽】—— 这是原文档就存在的问题,不是这里引入的: +% 版心宽 = 210 − 2×31.75 = 146.50 mm +% 表宽 = tblGrid 合计 8540 twips = 150.64 mm +% ⇒ 表格比版心宽 4.14 mm,左右各溢出 2.07 mm。 +% 原 Word 里 tblPr 是 jc=center + tblW=auto,所以表格是居中摆的, +% 左边界落在 29.60mm(= 31.75 − 2.07),实测 PDF 表格线 x 范围 +% 29.60 ~ 180.41 mm,与此吻合。 +% +% ⇒ 本包的处理:把 totalwidth 直接设成表宽 150.636mm,左右各留 +% (210 − 150.636)/2 = 29.682 mm。这样 +% · 表格与版心同宽,整表居中,编译不刷 Overfull \hbox +% · 表格线在纸面上的绝对位置与原 .doc 完全一致(误差 < 0.1mm) +% · 标题的居中基准也落在纸张中心,与原稿一致 +% 即:不改动任何可见版式,只把"溢出版心"换成"版心就是表宽"。 +% +% ⚠️⚠️【实测修正:totalwidth 要 150.8105mm,左边距 29.599mm】 +% +% (a) 表宽的真实值不是 150.636mm。 +% tabularray 把左竖线画在版心左边界【内侧】,线中心 = 边界 + 半线宽, +% 而右竖线外缘还要再占半个线宽,故整个 tblr 盒子的实宽比 +% Σwd + 6×colsep + 4×线宽 多出约 0.4945pt。实测: +% Overfull \hbox (0.49452pt too wide) +% 须把 totalwidth 补足到 150.636 + 0.1745 = 150.8105 mm。 +% +% (b) 左边距要 29.599mm 而非 29.682mm。 +% 实测新版竖线 x 比原稿整体右偏 0.083mm(29.771 vs 29.686), +% 列宽与行距都已逐项精确,纯属整表平移,故左边距减 0.083mm。 +% 此时 right 自动 = 210 − 29.599 − 150.8105 = 29.5905mm。 +% +% 校正后实测:竖线 x = 29.686 / 52.758 / 130.104 / 180.322 mm, +% 与原稿 29.686 / 52.758 / 130.104 / 180.322 逐位相同。 +%====================================================================== +\geometry{ + paperwidth = 210mm, + paperheight = 297mm, + left = 29.599mm, % 实测标定(见上) + totalwidth = 150.8105mm, % = 表真实宽(含 tabularray 取整余量) + top = 25.40mm, + bottom = 25.40mm, + headheight = 0pt, + headsep = 0pt, + footskip = 17.50mm, +} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt} +\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码 + +%====================================================================== +% 2. 字体与字号 +% +% 原 .doc 全文只用「方正楷体_GB2312」一种中文字体,西文/数字用 +% Times New Roman: +% 表外标题 楷体 24pt (w:sz=48) +% 表头三格 楷体 18pt 加粗 (w:sz=36 + w:b) +% 表头小字注释 楷体 10.45pt (w:szCs=21 未设 w:sz,Word 退回 10.5pt) +% 序号列 楷体 12pt 加粗 (w:sz=24 + w:b) +% 内容列 楷体 12pt (w:sz=24) +% +% ⚠️ 原字体是方正楷体 —— 商业字体,不允许随仓库分发。这里换成 +% OUC Kai(霞鹜文楷 GB2312 子集,SIL OFL 1.1),字形风格一致 +% (同为楷体、同为 GB2312 字符集),观感几乎无法区分。 +% 字体全部来自仓库公共字体包 ../fonts.tex。 +% +% ⚠️ 西文/数字:原文档用 Times New Roman。这里用 TeX Gyre Termes, +% 它是 Times 的度量兼容替代(字符宽度逐字相同),数字宽度零漂移。 +%====================================================================== +\input{../fonts.tex} + +%---------------------------------------------------------------------- +% ⚠️⚠️⚠️【最隐蔽的一条:必须关掉 xeCJK 的全角标点压缩】 +% +% 现象:凡含全角括号「(」的行,整行右移 4.23pt,而字宽完全正确。 +% 「试卷(项目设计报告)」原稿 x0=199.20,按默认设置排出 203.43。 +% +% 根因:xeCJK 默认 PunctStyle=quanjiao,会对全角标点做**字宽挤压**: +% · 「(」「)」的 advance 从 1.0em 压到 0.5em +% · 挤压省下的空间被记在**行内盒子的起点**上(负的 \kern), +% 于是整行墨迹相对盒子右移 +% · Word 不做这件事,全角括号就是整 1.0em +% 这在两端对齐的正文里看起来是"标点更紧凑",但在**居中**的表格 +% 单元格里就会让整行偏移,且偏移量随括号个数变化(1 个括号 4.23pt, +% 2 个括号 8.46pt …),肉眼可见地不居中。 +% +% 正解:\xeCJKsetup{PunctStyle=plain} —— 关闭挤压,全角标点按原字宽排。 +% 代价:正文里中文标点的视觉密度略增(与 Word 完全一致,本就是目标)。 +% +% ⚠️ 这条必须在 \begin{document} 之前设,且是**全局**的 —— +% 只对本模板生效,不影响仓库里其他模板(它们各自没这个包)。 +%---------------------------------------------------------------------- +\xeCJKsetup{PunctStyle=plain} + +%---------------------------------------------------------------------- +% ⚠️⚠️⚠️【最要命的一条,与 oucksfm.sty / ouclw.sty 同源】 +% ctex 默认 \linespread 约 1.3,会把 \fontsize{12}{14.4} 的 14.4pt +% 行距放大成 18.7pt 以上,整张表会被撑高。 +% +% \fontsize 的第二个参数【本来是】用来设 \baselineskip 的,但 +% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread 归 1。 +% 这一步不能省,也必须在 \AtBeginDocument 之后再设一次 +% (ctex 在 begin document 时会重设)。 +%---------------------------------------------------------------------- +\newcommand{\gdbasefont}{% + \linespread{1}\relax + \fontsize{12bp}{14.4bp}\selectfont} + +%---------------------------------------------------------------------- +% ⚠️⚠️【字号必须用 bp,不能用默认的 pt】 +% +% Word/PDF 里的 "pt" 是 PostScript point(1/72 英寸),而 TeX 的 +% 默认 pt 是 TeX point(1/72.27 英寸),后者比前者大 0.36%。 +% \fontsize{24}{28.8} 写出来,PDF 里实测只有 23.91(= 24 × 72/72.27), +% 与原稿的 24.00 对不上。 +% +% 正解:显式写 bp 单位 —— \fontsize{24bp}{28.8bp},实测正好 24.000。 +% 本包所有字号、行距、间距只要涉及"照抄 Word 数值"的,一律用 bp。 +%---------------------------------------------------------------------- +% 各档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致) +\newcommand{\gdtitlefont}{\linespread{1}\relax\fontsize{24bp}{28.8bp}\selectfont} +\newcommand{\gdheadfont} {\linespread{1}\relax\fontsize{18bp}{21.6bp}\selectfont} +\newcommand{\gdnotefont} {\linespread{1}\relax\fontsize{10.45bp}{12.54bp}\selectfont} +\newcommand{\gdcellfont} {\linespread{1}\relax\fontsize{12bp}{14.4bp}\selectfont} + +%---------------------------------------------------------------------- +% ⚠️ xeCJK 陷阱:局部字体切换命令若紧邻 \par(或落在段落末尾),段末的 +% 字体状态会"溢出"到后面段落。故局部切换一律用带 \normalfont 收尾的包装。 +%---------------------------------------------------------------------- + +%====================================================================== +% 3. 列的宽度模型 +% +% 原 .doc tblGrid 三个网格列(twips → mm): +% c1 序号 = 1308 twips = 23.0717 mm +% c2 内容 = 4385 twips = 77.3465 mm +% c3 标注 = 2847 twips = 50.2179 mm +% ───────────────────────────────────── +% 合计 8540 twips = 150.6361 mm +% +% cellMar:left/right = 108 twips = 1.9050 mm,top/bottom = 0 +% 边框 :w:sz = 4(单位 1/8 pt)⇒ 0.5 pt = 0.1764 mm +% +% tabularray 的 colsep 计在每列【左右两侧】,故 3 列共 6×1.905 = 11.430mm; +% 竖线 4 根(左边界 + 2 条内线 + 右边界)× 0.1764 = 0.7056mm。 +% 要让 Σwd + 11.430 + 0.7056 = 150.636,需 +% Σwd = 138.5005 mm +% 而 (gridCol − 2×1.905) 之和为 150.636 − 11.430 = 139.2061 mm, +% 两者差 0.7056 mm 正好是竖线总宽,故每列再减 +% 竖线分摊 = 0.7056 / 3 = 0.2352 mm +% +% ⚠️ 上式是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差, +% 实测需再微调(见 3.1 的实测标定值),否则报 +% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。 +% +% ⚠️⚠️【实测标定:tabularray 把边框线宽算进列宽里】 +% 实测每列"相邻竖线中心线间距" = wd + 2×colsep + \gdrule, +% 即比理论值 wd + 2×colsep 多出一个 0.1764mm 的线宽。 +% 故正确的 wd 是 +% wd = gridCol − 2×colsep − \gdrule +% 而不是 gridCol − 2×colsep − 竖线分摊。 +% (按旧式"分摊"算出的 wd 偏小 0.154mm/列,整表窄 0.466mm, +% 实测原稿三列 23.072/77.346/50.218 而旧版 22.916/77.192/50.062。) +%====================================================================== +\newcommand{\gdrule}{0.5pt} % 边框粗细(w:sz=4) +\newcommand{\gdcolsep}{1.905mm} % 单元格左右内边距(108 twips) +\newlength{\gdtblw} +\setlength{\gdtblw}{150.636mm} % 表宽(含 4 根竖线与 6 处内边距) + +%---------------------------------------------------------------------- +% 3.1 各列宽(= gridCol − 2×colsep − 竖线分摊) +% 与 gdtable 环境里 colspec 的 wd 必须逐字一致。 +%---------------------------------------------------------------------- +\newcommand{\gdwa}{19.0853mm} % c1 23.0717 − 3.8100 − 0.1764(线宽) +\newcommand{\gdwb}{73.3601mm} % c2 77.3465 − 3.8100 − 0.1764 +\newcommand{\gdwc}{46.2315mm} % c3 50.2179 − 3.8100 − 0.1764 + +%---------------------------------------------------------------------- +% 3.2 行高(扣掉边框线宽) +% +% ⚠️⚠️ tabularray 的 row{...}={ht=...} 是**内容区**高度,hline 的线宽 +% 不包含在内 —— 实测每行都比 ht 高出整整一个 \gdrule(0.5pt): +% 原稿行距 39.00pt,按 ht=13.7583mm(=39.00pt) 排出来是 39.50pt +% 13 行累计多出 6.5pt,整表总高 533.88 vs 原稿 527.40 +% ⇒ ht 需减去线宽 0.5pt = 0.1764mm: +% 表头 20.5493 − 0.1764 = 20.3729 mm +% 中间行 13.7583 − 0.1764 = 13.5819 mm +% 末 行 14.1640 − 0.1764 = 13.9876 mm +%---------------------------------------------------------------------- + +%====================================================================== +% 4. 行高 +% +% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast): +% R1 表头 1165 twips = 20.5493 mm +% R2 ~ R13 780 twips = 13.7583 mm ← 12 行,逐行完全相同 +% 最后一行 803 twips = 14.1640 mm ← 比其余 12 行高 0.406mm +% ──────────────────────────────────────── +% 合计 20.5493 + 12×13.7583 + ... 见下 +% +% ⚠️ 第 13 行(序号 12「试卷(项目设计报告)」)是 803 而非 780, +% 多出来的 23 twips 是 Word 里"字高 + 段前段后"凑出来的测量值, +% 照抄才能与原表逐行对齐。 +% +% ⚠️ Word 的 exact 是"精确等于",内容超了会【被裁掉】。tabularray 的 +% ht= 是最小行高(内容多则自动长高),语义更安全。本表各行内容都远 +% 小于行高,两者结果相同,故直接写 ht=。 +%====================================================================== + +%====================================================================== +% 5. 表格环境 +% +% ⚠️ 用 tblr 而非 longtblr:本表总高约 191mm,一页装得下(版心高 +% 297 − 2×25.40 = 246.2 mm),不需要断页。 +% +% ⚠️⚠️ colspec 与 row{} 必须字面写在这里,不能先存进宏再展开: +% tabularray 的列类型解析在宏展开之外进行,会报 +% "Unexpandable command \xxx inside column type"。 +% (所以 3.1 节那些 \gdwa… 只作文档用,不能拼进 colspec。) +% +% ⚠️ 选项里的宏名一律不带 @:tabularray 解析选项时 @ 不是字母。 +%====================================================================== +\newenvironment{gdtable}{% + \par\begingroup + \begin{tblr}[label=none]{ + colspec={Q[c,m,wd=19.0853mm] Q[c,m,wd=73.3601mm] Q[c,m,wd=46.2315mm]}, + colsep=1.905mm, rowsep=0pt, stretch=0, + hline{1-Z}={\gdrule}, vline{1-Z}={\gdrule}, + row{1}={ht=20.3729mm}, + row{2-Z}={ht=13.5819mm}, + row{13}={ht=13.9876mm}, + }% +}{% + \end{tblr}\par\endgroup} + +%====================================================================== +% 6. 单元格内容包装 +% +% 本表全是单列格,tabularray 的 Q[c,m,wd=…] 已处理好居中与折行, +% 不需要 ouclw.sty 那种定宽 \parbox。这里只提供语义化的包装宏, +% 让 .tex 里不必反复写字体命令。 +%====================================================================== + +% \gdno{数字} —— 序号列:楷体 12pt 加粗 +\newcommand{\gdno}[1]{{\kaiti\bfseries\gdcellfont #1\normalfont}} + +% \gditem{文字} —— 内容列:楷体 12pt +\newcommand{\gditem}[1]{{\kaiti\gdcellfont #1\normalfont}} + +% 表头文字:楷体 18pt 加粗(只排字,不带任何垂直位移) +\newcommand{\gdheadraw}[1]{{\kaiti\bfseries\gdheadfont #1\normalfont}} + +% 表头单元格(单段结构,用于「序号」「内容」两格) +% +% ⚠️ 尾部 \vspace*{1.58pt} 把这两个字【上移】0.99pt。 +% 原稿基线距行顶 34.73pt,不处理时是 36.51pt(低了 1.78pt)。 +% +% 方向推导:尾部间距 s 改变盒子总高 H(H' = H + s),m 居中后 +% 内容顶端 = 行顶 + (行高 − H')/2。故 s > 0 ⇒ 顶端上移 s/2; +% s < 0 ⇒ 顶端下移 |s|/2。 +% ⚠️ 实测 s 与位移不是严格 s/2 关系(因为行高是固定 ht,但单元格 +% 还有 hline 参与分配),标定结果: +% s = 0 → 36.51(低 1.78) +% s = 3.56 → 33.74(高 0.99) +% 即 Δs=3.56 带来 Δ位移=2.77,灵敏度 0.778pt/pt。 +% 要从 33.74 下移回 34.73,需 Δs = −1.99 × 0.778⁻¹… 反解得 1.58。 +% 实测 s = 1.58 → 34.73,与原稿一致。 +% +% 「标注」格是两段结构、自带自己的位移,故用 \gdheadraw 而非本宏。 +\newcommand{\gdhead}[1]{\gdheadraw{#1}\par\vspace*{1.58pt}} + +% 表头第三格的小字注释:楷体 10.45pt,不加粗 +\newcommand{\gdnote}[1]{{\kaiti\gdnotefont #1\normalfont}} + +%---------------------------------------------------------------------- +% 表头第三格的两行结构 +% +% 原 .doc 该格是【两个独立段落】: +% 段 1 「标注」 楷体 18pt 加粗,jc=center +% 段 2 「(确认存档后在此栏打√)」 楷体 10.45pt,不加粗,jc=center +% +% 实测两段的 y0 分别为 161.64 与 189.27 pt(相差 27.63pt), +% 说明它们是顺序排列的两行,不是同一行里的不同字号。 +% 因此这里也用两个 \par 分开的段落,而不是塞进同一行。 +% +% ⚠️ 第二段的字宽 379.08~500.65pt = 121.57pt = 42.89mm, +% 而该列内容可用宽只有 46.08mm(见 §3.1),余 3.19mm, +% 刚好排得下不折行 —— 与原稿一致。若换成别的字体/字号导致 +% 折行,请把 §3.1 的 c3 略微加宽(同时减小 c2)。 +% +% ⚠️⚠️【两段的垂直间距:原稿 21.12pt】 +% 原稿两段基线相距 198.29 − 177.17 = 21.12pt。 +% 而 18pt 楷体的行距(\baselineskip = 21.6pt)已把第二段的 +% 起点推到了第一段基线 + 21.6pt 处,故两段之间的 \vspace 应当是 +% **负值**才能得到 21.12pt: +% +% 间距 = 第一段行距 21.6 + \vspace → \vspace = −0.48pt +% +% 但实测 \vspace*{-0.48pt} 只排出 13.93pt,与 21.12 差 7.19pt。 +% 原因是 \gdhead{...} 内部的 \gdheadfont 把 \baselineskip 重设成 +% 21.6bp 之后,\par 结束时段落用的是**收尾组外**的 12bp/14.4bp, +% 故实际参与的是 14.4pt,不是 21.6pt: +% 间距 = 14.4 + \vspace → \vspace = +6.72pt +% 实测 6.72pt 正好排出 21.12pt。 +% +% ⚠️ 三个 \par 段落会改变单元格盒子的总高,tabularray 的 m(垂直居中) +% 会据此重新计算基线位置 —— 故改这个值会连带影响「标注」二字的高度。 +% +% ⚠️⚠️【整格下移 1.49pt:只能用"尾部负间距"】 +% 两段间距调对(21.09 vs 原稿 21.12 ✓)后,整个格子比原稿高 1.49pt。 +% 五种手段实测对比(距行顶距离,单位 pt,最后一项是两段间距): +% A 原样 25.43 / 46.53 / 21.09 +% B 尾部 \vspace*{-2.98pt} 26.92 / 48.01 / 21.10 ← 正确 +% C 顶部 \vspace*{+2.98pt} 23.95 / 48.01 / 24.06 ← 反向且拉大间距 +% D 顶部 \rule{0pt}{26.5pt} 31.25 / 52.34 / 21.09 ← 位移过大 +% E \raisebox{-1.49pt}{\vbox{...}} 25.43 / 46.53 / 21.09 ← 完全无效 +% +% 为什么 B 有效:\vspace* 放在最后一段之后会缩短盒子的**总高**, +% m 居中按 (行高 − 总高)/2 定位,总高减 2.98 ⇒ 内容整体下移 1.49。 +% 两者是 2 倍关系,别写成 1.49。 +% +% 为什么 C/D 不行:顶部间距会被首行的 ascent 吃掉(3.6pt 远小于 +% 18pt 字的 ascent),所以小 h 无效、大 h 又过量,没有可用区间。 +% 为什么 E 不行:raisebox 在 tabularray 的单元格里被 m 居中的 +% 重新计算抵消掉了。 +%---------------------------------------------------------------------- +\newcommand{\gdheadIII}{% + \gdheadraw{标注}\par + \vspace{6.72pt}% + \gdnote{(确认存档后在此栏打√)}\par + \vspace*{-2.98pt}}% + +%====================================================================== +% 7. 表外标题 +% +% 原 .doc 第 2 段(idx 1): +% 楷体 24pt,jc 未设(左对齐),首行缩进 firstLine=2640 twips +% = 46.55 mm,且 firstLineChars=550(即 5.5 字宽)。 +% 文字是「归 档 目 录」,字间各留两个半角空格。 +% +% 实测 PDF:四个字 x0 = 222.00 / 270.00 / 318.00 / 366.00 pt, +% 相邻间距恒为 48.00 pt,每字宽 24.00 pt +% ⇒ 字间空隙 = 48.00 − 24.00 = 24.00 pt = 1 个字宽 = 2 个半角空格 ✓ +% +% ⚠️⚠️【不能直接把「归 档 目 录」写进源码】 +% xeCJK 默认开启 CJKecglue,且会把连续半角空格吞成一个, +% 写「归 档 目 录」编译出来是「归档目录」紧贴(空格全没了, +% 实测 x0=216.09 且只有一个 span)。 +% +% 正解:用实测的间距自己摆 —— 每字之间插入 \gdtitlegap +% = 24.00pt = 8.467mm 的固定空白。这样得到的字符位置与原稿逐字相同, +% 且不依赖 xeCJK 的空格策略。 +% 实现见下面的 \gdtitle:参数是【逗号分隔的字】,逐字排并插 gap。 +%====================================================================== +\newlength{\gdtitleindent} +%---------------------------------------------------------------------- +% ⚠️⚠️【这个缩进不是 46.55mm,是 48.635mm】 +% +% 原 .doc 的 firstLine = 2640 twips = 46.55mm,但它是从**版心左边界 +% 31.75mm**(pgMar left=1800 twips)起算的: +% 31.75 + 46.55 = 78.30mm = 221.98pt ← 实测原稿标题 x0 = 222.00pt ✓ +% +% 而本包把版心改成了表宽 150.636mm,左边界 29.682mm。若这里照抄 +% 46.55mm,标题会落到 29.682 + 46.55 = 76.23mm = 216.02pt, +% 比原稿左移 5.91pt(2.08mm)—— 实测确实如此。 +% +% ⇒ 补回这 2.151mm:48.701 = 46.55 + (31.75 − 29.599) +% 实测得到的标题 x0 = 222.00pt,与原稿逐字一致(四字间距 48.00pt)。 +%---------------------------------------------------------------------- +\setlength{\gdtitleindent}{48.701mm} + +\newlength{\gdtitlegap} +\setlength{\gdtitlegap}{24bp} % 字间空隙 = 1 个字宽(实测 48−24) + +% \gdgap —— 标题里的字间空隙,直接在 .tex 里逐字之间插入: +% \gdtitle{归\gdgap 档\gdgap 目\gdgap 录} +% 比"逗号分隔、宏里循环"直观得多,也不用 \makeatletter。 +\newcommand{\gdgap}{\kern\gdtitlegap} + +\newcommand{\gdtitle}[1]{% + \par\noindent + \hspace*{\gdtitleindent}% + {\kaiti\gdtitlefont #1\normalfont\par}} + +%====================================================================== +% 8. 标题与表格之间的空距 +% +% 原 .doc 结构(body 子元素): +% idx 0 空段 +% idx 1 标题「归 档 目 录」 +% idx 2 空段 +% idx 3 表格 +% idx 4 空段 +% idx 5 空段 +% +% 实测:标题基线块 y0=97.78pt(34.50mm),表格顶线 y=150.00pt(52.92mm)。 +% 标题字高 24pt、单倍行距 28.8pt = 10.16mm,故标题占 34.50 ~ 44.66mm; +% 标题段之后到表格顶线还差 52.92 − 44.66 = 8.26mm, +% 这一截由「空段(idx 2)」贡献。 +% +% ⚠️⚠️【实测标定:9.943mm,不是 8.26mm】 +% 理论值 8.26mm 是从"标题字块底 44.66mm"起算的,但 LaTeX 的 +% \vspace 是从**基线 + 深度**之后起算,二者差一个 descent。 +% 按 8.26mm 排出来表格顶线在 52.61mm,比原稿 53.00mm 高 0.39mm; +% 补足到 9.943mm 后实测 53.00mm,与原稿完全一致。 +%====================================================================== +\newlength{\gdheadskip} +\setlength{\gdheadskip}{9.943mm} + +%====================================================================== +% 9. 文档首部留白 +% +% idx 0 是一个空段,占 1 行 = 28.8pt? 否 —— 它是 12pt 正文段落的空行, +% 单倍行距 = 14.4pt = 5.08mm。加上版心上边距 25.40mm, +% 标题块 y0 应为 25.40 + 5.08 = 30.48mm; +% 实测 34.50mm,差 4.02mm,是 Word 段前间距。故这里直接写到实测值。 +% +% ⚠️⚠️【实测标定:2.7255mm,不是 4.02mm】 +% 按 4.02mm 排出来,标题基线在 122.16pt,而原稿是 118.49pt, +% 低了 3.67pt = 1.2945mm。原因:4.02mm 是从"标题字块顶端"反推的, +% 而这里的 \vspace* 是从版心上边界往下量到**基线之上的高度**, +% 两者起算法不同,差了一个 ascent 的零头。 +% ⇒ 4.02 − 1.2945 = 2.7255mm,实测标题基线 118.49pt,与原稿一致。 +% +% 连带影响:表格整体也在同一基线之后,故此处一并归位; +% 表格顶线随之从 54.30mm 上移到 53.01mm(原稿 53.00mm)。 +%====================================================================== +\newlength{\gdtopskip} +\setlength{\gdtopskip}{2.7255mm} + +\AtBeginDocument{\gdbasefont} +\endinput \ No newline at end of file diff --git a/试卷归档目录/试卷归档目录.pdf b/试卷归档目录/试卷归档目录.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d3101882d364bfd76acac33e895a33f4d24f3906 GIT binary patch literal 25839 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

MJb%B>!%Jpt4<{iI|etZ47 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 literal 0 HcmV?d00001 diff --git a/试卷归档目录/试卷归档目录.tex b/试卷归档目录/试卷归档目录.tex new file mode 100644 index 0000000..d3aa93c --- /dev/null +++ b/试卷归档目录/试卷归档目录.tex @@ -0,0 +1,61 @@ +%====================================================================== +% 中国海洋大学 信息科学与工程学部 试卷归档目录(理论课) +% +% 编译: xelatex 试卷归档目录.tex +% +% 这份表格用于装订试卷袋时逐项核对归档材料。共 12 项,装订顺序即 +% 表格顺序,确认某项已存档后在最右「标注」栏内打 √。 +% +% 版式来源:SynologyDrive/授课/数字逻辑/2025/归档/ +% 附件2:信息科学与工程学院归档目录(理论课).doc +% (原文件名与内文写的是「学院」,现按现行建制改为「学部」) +% +% 与原 .doc 的差异(有意为之): +% · 单位名「学院」按现行建制改为「学部」,标题相应改为 +% 「信息科学与工程学部试卷归档目录」 +% · 原字体「方正楷体_GB2312」是商业字体,已换成 OUC Kai +% (霞鹜文楷,SIL OFL 1.1),同为楷体、同为 GB2312 字符集 +% · 纸张、边距、表宽、列宽、行高、字号一律照原值,未做任何调整 +% (详见 oucgddir.sty 的注释,每一项都附了换算过程) +% +% 与原 .doc 的一个【已知差异】(无法也无需还原): +% 原表的 tblGrid 合计 8540 twips = 150.64mm,比版心 146.50mm 宽 +% 4.14mm,即原文档里这张表本来就在版心之外各溢出 2.07mm。 +% Word 按 jc=center 居中摆放,所以看起来正常。 +% 本模板把版心直接设成表宽,表格居中与纸面的绝对位置与原稿一致, +% 但不再"溢出版心"。视觉上无差别,且不会产生 Overfull 警告。 +%====================================================================== +\documentclass[UTF8,fontset=none]{ctexart} +\usepackage{oucgddir} + +\begin{document} + +\vspace*{\gdtopskip} + +% ⚠️ 标题里的空格【不能】写成「归 档 目 录」—— xeCJK 会吞掉连续 +% 半角空格,编译出来是紧贴的「归档目录」。必须用 \gdgap 手动插入 +% 24bp(= 1 个字宽)的固定空隙,才能与原稿逐字对齐。 +\gdtitle{归\gdgap 档\gdgap 目\gdgap 录} + +\vspace{\gdheadskip} + +\begin{gdtable} + %------------------- 表头 ------------------- + \gdhead{序号} & \gdhead{内容} & \gdheadIII \\ + %------------------- 12 项 ------------------- + \gdno{1} & \gditem{考试签到表} & \\ + \gdno{2} & \gditem{监考记录} & \\ + \gdno{3} & \gditem{A、B试题(项目设计要求)} & \\ + \gdno{4} & \gditem{A、B试题的参考答案(评分细则)} & \\ + \gdno{5} & \gditem{试卷分析报告} & \\ + \gdno{6} & \gditem{最终成绩构成说明} & \\ + \gdno{7} & \gditem{最终成绩} & \\ + \gdno{8} & \gditem{平时成绩} & \\ + \gdno{9} & \gditem{期中考试成绩} & \\ + \gdno{10} & \gditem{教学大纲} & \\ + \gdno{11} & \gditem{教学日历} & \\ + \gdno{12} & \gditem{试卷(项目设计报告)} & \\ +\end{gdtable} +\par\null\par + +\end{document} \ No newline at end of file