diff --git a/WORKFLOW.md b/WORKFLOW.md deleted file mode 100644 index a03341f..0000000 --- a/WORKFLOW.md +++ /dev/null @@ -1,99 +0,0 @@ -# WSL 工作流 - -本仓库的所有工作都在 **WSL** 内完成。Windows 侧不保留工作副本。 - -## 为什么 - -- 隔离:LaTeX 编译会产生大量中间文件(`.aux` / `.log` / `.toc`), - 不用清理 Windows 目录。 -- 可重置:环境坏了删掉重建即可,不影响 Windows 系统。 -- 一套工具链:TeX Live 2025 + Python venv + git + 工单工具,全在一个地方。 - -## 目录位置 - -| 用途 | 路径 | -|---|---| -| 仓库 | `~/code/ouc_latex_template`(WSL 内) | -| 从 Windows 浏览 | `\\wsl$\Ubuntu-26.04\home\yongquan\code\ouc_latex_template` | -| Python venv | `~/.venv-latex`(装了 pymupdf / fonttools) | -| 工单工具 | `~/.local/bin/gi.py` | -| Gitea 配置 | `~/.config/ouc-latex/gitea.json` | -| 环境变量 | `~/.config/ouc-latex/env.sh`(已在 `.bashrc` 里 source) | - -⚠️ 发行版名是 **Ubuntu-26.04**。若将来重装 WSL 改名了, -UNC 路径里的这一段要跟着换。用 `wsl -l -v` 查当前名字。 - -## 日常命令 - -```bash -ouccd # 进仓库(别名) -bash build.sh 试卷 试卷题型示例 # 编译单个(自动两遍,打印 error/Overfull/页数) -bash build.sh all # 全库编译(13 个模板) -git status && git add -A && git commit -m "... #N" -git push origin main -gi context # 查在途工单 -``` - -`texbuild 试卷 试卷题型示例` 是 `build.sh` 的等价别名(定义在 env.sh 里)。 - -## 编辑文件 - -两种方式都行: - -1. **在 WSL 里用 vim/nano**(推荐,路径最直接) -2. **从 Windows 用任意编辑器打开 UNC 路径** —— VS Code、Typora、 - PDF 阅读器都能直接读写,因为 `\\wsl$\...` 是双向的。 - 但**不要在 Windows 里跑 LaTeX 编译**,那样中间文件会落在 - Windows 的 9p 文件系统缓存里,慢且容易出权限问题。 - -## Windows 侧注意事项 - -- **不要**在 Windows 目录保留第二份仓库副本。两份会分叉, - 同步靠 scp 很容易漏。这是之前"很乱"的根源。 -- 想快速看 PDF:直接双击 UNC 路径下的 PDF,或 - `explorer \\wsl$\Ubuntu-26.04\home\yongquan\code\ouc_latex_template` -- Windows 上装的 TeX Live 2022 **可以留着当兼容性抽检**, - 但不是主编译环境。真要抽检时,把源码拷到临时目录编,别在仓库里编。 - -## PDF 不进版本库 - -`*.pdf` 都在 git 里,但**编译产生的 PDF 不要提交**—— -同源码编两次,页面一致但内嵌 `CreationDate` 不同,git 会认为文件变了。 -提交前统一还原: - -```bash -git checkout -- '*.pdf' -``` - -## 已知的少量排版告警(不是回归) - -| 模板 | 告警 | 原因 | -|---|---|---| -| 幻灯片 | Underfull 1 | 既有问题 | -| 科技报告 | Underfull 4 | 1 既有 + 3 内容块长串(见 boxes.cls 注释) | -| 课程执行大纲 | Overfull 1 | 既有问题 | - -## 环境重建 - -万一 WSL 环境坏了: - -```bash -# 1. 装 TeX(功能全集,跳过 11 个 -doc 包,省 800MB+) -sudo apt-get install --no-install-recommends \ - texlive-xetex texlive-lang-chinese texlive-latex-extra \ - texlive-fonts-extra texlive-science texlive-pictures - -# 2. Python 依赖 -python3 -m venv ~/.venv-latex -~/.venv-latex/bin/pip install pymupdf fonttools - -# 3. FontAwesome(Debian 的 texlive-fonts-extra 不带,需走 fontconfig) -cp ~/code/ouc_latex_template/fonts/fontawesome/FontAwesome.otf \ - ~/.local/share/fonts/ && fc-cache -f - -# 4. 仓库 -git clone https://code.yangyq.net/laoyang/ouc_latex_template.git ~/code/ouc_latex_template - -# 5. 验证 -cd ~/code/ouc_latex_template && bash build.sh all -``` \ No newline at end of file diff --git a/build.sh b/build.sh index ea4b5da..99b6d25 100755 --- a/build.sh +++ b/build.sh @@ -1,8 +1,5 @@ #!/usr/bin/env bash -# 在 WSL 内编译模板(WSL 原生版,无需 ssh/scp) -# -# 这套仓库的全部工作都在 WSL 内完成:编辑、编译、查看、提交、提工单。 -# Windows 侧只通过 \\wsl$\<发行版>\... 这个 UNC 路径读取文件(只读浏览)。 +# 编译模板 # # 用法: # bash build.sh 特殊事项说明表 # 编译该目录下默认主文件 @@ -17,7 +14,7 @@ # ⚠️ 三条务必注意 # # 1) **PDF 不要提交**。同源码编两次,页面一致但内嵌 CreationDate 不同, -# git 会认为文件变了(全库 13 个 PDF 全变 M)。提交前: +# git 会认为文件变了(全库 16 个 PDF 全变 M)。提交前: # git checkout -- '*.pdf' # 或者用 git status 确认只 add 了源码。 # diff --git a/fonts.tex b/fonts.tex index 1fb9f54..927efc8 100644 --- a/fonts.tex +++ b/fonts.tex @@ -223,10 +223,8 @@ % 本来也没有大小写),而 \textsc{English} 里的西文仍然走 \setmainfont % 的 Termes 小型大写,行为正确。 % -% 为什么不写 SmallCapsFont —— 这里踩了整整一轮坑,结论留下免得重来: % % 1) SmallCapsFont 这个选项**与本文件上面的 ItalicFeatures / -% BoldItalicFeatures 互斥**。最小复现实测: % 只有 SmallCapsFont + SmallCapsFeatures → 通过 % 再加 ItalicFeatures(带跨目录 Path) → 立刻报 % Package fontspec Error: @@ -306,11 +304,11 @@ ]{ZhuqueFangsong} \def\fangsong{\CJKfamily{OUCFang}} -% 西文:显式取 Times 形态(原模板里 \tnr / \tnrb / \sunfont 的替代) +% 西文:显式取 Times 形态 % % ⚠️ 四个档位必须全给。只给 UprightFont 的话,在 \bfseries 环境里会落到 % "Font shape `TU/texgyretermes/b/n' undefined" 并静默替换, -% 表现为加粗失效(试卷的 \TNRB 与 \qnum 都会踩到)。 +% 表现为加粗失效(试卷的 \TNRB 与 \qnum 需要用到)。 \newfontfamily\tnr{texgyretermes}[ Extension = .otf, Path = ../fonts/tex-gyre-termes/, @@ -381,7 +379,7 @@ % % 这里不全局改 \linespread,因为各模板需求不同(科技报告依赖 ctex % 默认值,试卷归档封面/课程执行大纲/年度考核登记表必须归 1 才能 -% 还原 docx 的精确行高)。只提供工具命令,由各模板自行调用。 +% 还的精确行高)。只提供工具命令,由各模板自行调用。 %====================================================================== \newcommand{\ouclinespread}[1]{\linespread{#1}\relax} diff --git a/会议预算表/oucmeeting.sty b/会议预算表/oucmeeting.sty index 7bdacf2..66c4124 100644 --- a/会议预算表/oucmeeting.sty +++ b/会议预算表/oucmeeting.sty @@ -17,12 +17,12 @@ \RequirePackage{xeCJK} \RequirePackage{tabularray} % 注:不再需要 graphicx。早期版本用 \rotatebox 做「其他费用」竖排, -% 现已改为 \shortstack 逐字竖排(#24 按用户意见修正),不再依赖 graphicx。 +% 现已改为 \shortstack 逐字竖排(修正),不再依赖 graphicx。 %====================================================================== % 1. 页面 % -% 原 docx sectPr 实测(11906 x 16838 twips): +% sectPr (11906 x 16838 twips): % 宽 210.01 mm 高 297.00 mm ← 标准 A4 % top 2155 twips = 38.01 mm % bottom 1985 twips = 35.01 mm @@ -36,7 +36,7 @@ % % ⚠️ 版心宽 = 210 - 28.01 - 26.00 = 155.99 mm % 而原表宽 169.12 mm,**超宽 13.12 mm**。 -% 原 docx 用 tblLayout=fixed 硬撑,实际会压进右侧页边距。 +% 用 tblLayout=fixed 硬撑,实际会压进右侧页边距。 % ⇒ 本包把表格等比缩到 155.99 mm(系数 0.9224), % 列宽按比例重算,见第 3 节。这是唯一一处主动偏离原文件的地方。 %====================================================================== @@ -53,15 +53,15 @@ } \setlength{\parindent}{0pt} \setlength{\parskip}{0pt} -\pagestyle{empty} % 原 docx 无页眉页脚页码 +\pagestyle{empty} % 无页眉页脚页码 %====================================================================== % 2. 字体 % -% 原 docx 用宋体 / 黑体。仓库规矩(#17):不用商业字体, +% 用宋体 / 黑体。仓库规矩:不用商业字体, % 全部取自公共字体包 ../fonts.tex。 % -% ⚠️ 原表字号分布实测: +% ⚠️ 原表字号分布 % 22pt ×1 —— 标题「中国海洋大学会议预算表」 % 9pt ×47 —— 表格内全部文字 + 三条说明 % 无 12pt 段落,与课程大纲那套不同,别照抄那边的字号命令。 @@ -77,7 +77,7 @@ %====================================================================== % 3. 表格列宽 % -% 原 docx 网格(tblGrid,单位 twips): +% 网格(tblGrid,单位 twips): % [424, 2054, 790, 1262, 2056, 209, 2793] 合计 9588 % 换算 mm(×25.4/1440): % [7.48, 36.23, 13.93, 22.26, 36.27, 3.69, 49.27] 合计 169.12 @@ -92,19 +92,19 @@ % ⚠️ 列定义**不能**放进宏再用 \OucMeetColspec 引用 —— tabularray 的 % colspec 解析器要求字面量,报 % Package tabularray Error: Unexpandable command ... inside Column type -% ⇒ 直接写在下方的 colspec={...} 里(实测唯一可行写法)。 +% ⇒ 直接写在下方的 colspec={...} 里(实际唯一可行写法)。 %---------------------------------------------------------------------- -% 行高(#24 修正) +% 行高(修正) % -% ⚠️⚠️ 原 docx 的 28 行里**只有 R26 显式设了 trHeight**(567 exact = 10mm), +% ⚠️⚠️ 的 28 行里**只有 R26 显式设了 trHeight**(567 exact = 10mm), % 其余 27 行都没设 —— 行高由内容自然撑开,9pt 字约 4.5~5mm。 % % 第一版我给所有行硬设 ht=7.4mm(自己拍的数),结果: % 28 × 7.4 = 207.2mm,加标题区约 30mm + 说明约 25mm = 262mm % 而版心只有 224mm ⇒ **必然溢出一页**,说明文字被推到第 3 页。 % -% ⇒ 改为 row{2-Z} 不设 ht,让内容撑开(与原 docx 一致); +% ⇒ 改为 row{2-Z} 不设 ht,让内容撑开(与一致); % 表头行(R6/R14 分节标题)和签署行(R26/R27)单独给最小高度, % 保证印章框有空间。 % @@ -126,7 +126,6 @@ % ! Illegal unit of measure (pt inserted.) % \__dim_eval_end: % 且**全部错误都定位到 \end{tblr}**,根本看不出是哪个格。 -% 最小复现(已验证): % \begin{tblr}{colspec={Q[c,m,wd=21mm] ...7列..., colsep=0.8mm}} % \SetCell[c=2]{c} A & \SetCell[c=5]{l} B \\ % \end{tblr} @@ -136,7 +135,7 @@ % cell{行}{列}={c=n}{对齐} % 被合并掉的格在内容里**留空**(写 `& &`),不要写 {}。 % -% ⚠️ 另有一个坑(#23):纵向合并 \SetCell[r=n] 与横向 \SetCell[c=m] +% ⚠️ 另有一个坑:纵向合并 \SetCell[r=n] 与横向 \SetCell[c=m] % 不能出现在同一行,同样报上面那串错。本表因此完全不用纵向合并, % 「其他费用」改成竖排文字 + 该列留空(视觉上等价)。 %====================================================================== @@ -178,7 +177,7 @@ % 写法:cell{21}{1}={r=5}{c} 声明纵向合并, % 内容用 \shortstack{其\\他\\费\\用} 逐字堆叠。 % ⚠️ 不能用 \rotatebox{90} —— 那只是把整行文字旋转, - % 仍然是"横向一句转个角度",不是你要的上下排列(#24 修正)。 + % 仍然是"横向一句转个角度",不是你要的上下排列(修正)。 % ⚠️ 纵向合并也必须用 cell{} 矩阵语法。写成 \SetCell[r=5] 在 % 内容里,会与同行的 \SetCell[c=n] 冲突报 Missing number。 cell{21}{1}={r=5}{c}, @@ -203,7 +202,7 @@ % ⚠️⚠️ 为什么把签字栏从主表里拆出来 % % 主表 R27/R28(意见+签字)无论怎么调都无法同时满足"不多列"和 -% "内容不丢失"。实测四种组合全失败: +% "内容不丢失"。实际四种组合全失败: % 内容 8 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线) % 内容 7 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线) % 内容 2 段 + cell{27}{4}={c=4} → 列数对,但第 2 段内容被合并盖住消失 @@ -238,7 +237,7 @@ %====================================================================== % 6. 标题与页首 %====================================================================== -% 左上角「附件1」小字(原 docx 无字号设置,随正文 9pt) +% 左上角「附件1」小字(无字号设置,随正文 9pt) \newcommand{\oucmeetattach}[1]{% \par\noindent{\Mn #1}\par\vspace*{4bp}} @@ -248,16 +247,16 @@ \vspace*{8bp}} % 填表日期 / 金额单位 那一行(左右分列,中间留白) -% 原 docx 用一串空格撑开,这里用 \hfill 更稳 +% 用一串空格撑开,这里用 \hfill 更稳 \newcommand{\oucmeetdateline}[1]{% \par\noindent{\Mn #1}\par\vspace*{4bp}} %====================================================================== % 6. 表尾说明 % -% ⚠️ 悬挂缩进不能用 \leftmargin=2em —— 实测报 +% ⚠️ 悬挂缩进不能用 \leftmargin=2em —— 实际报 % Overfull \hbox (26.71pt too wide) -% 因为「1、」「2、」是**全角字符 + 顿号**,9pt 下实测宽约 2.4em, +% 因为「1、」「2、」是**全角字符 + 顿号**,9pt 下实际宽约 2.4em, % 比 2em 宽,标签凸出到左边界外。⇒ \labelwidth 要给足 2.5em。 % % ⚠️⚠️ \itemindent 不能设负值! @@ -276,7 +275,6 @@ % 单条说明 % % ⚠️ 为什么不用 list 环境:list 的 \leftmargin / \itemindent 组合极易 -% 把内容推出边界,而且**不报 Overfull**(踩过一次,文字跑到版心 % 左外 13.45bp,日志里只有个无关的 5.1pt)。 % % ⚠️ 也不要用 \hangindent 悬挂缩进。「2、」后面直接接正文,续行不需要 @@ -285,7 +283,7 @@ % ⇒ 就是普通的 \noindent + 段落,什么都不设。 % % ⚠️⚠️ \tolerance / \emergencystretch 必须在**段落开始前**设置。 -% 写成 `\noindent` 之后再改无效(\noindent 已开段落,实测 5.1pt +% 写成 `\noindent` 之后再改无效(\noindent 已开段落, 5.1pt % 的 Overfull 纹丝不动)。 % ⇒ 这里用 \sloppy,它在内部改 \tolerance 和 \emergencystretch, % 且必须在 \par 之前调用 —— 下面 #1#2 之前就调了,有效。 diff --git a/会议预算表/会议预算表.tex b/会议预算表/会议预算表.tex index e030b4f..38ba017 100644 --- a/会议预算表/会议预算表.tex +++ b/会议预算表/会议预算表.tex @@ -10,7 +10,6 @@ % ⚠️⚠️ 本文件的表格**只写内容,不写任何 \SetCell**。 % 所有合并规则都在 oucmeeting.sty 的 oucmeettable 环境里, % 用 cell{行}{列}={c=n}{对齐} 矩阵式声明。 -% 原因(踩了两小时):在这套 7 列 Q[c,m,wd=…] + colsep 配置下, % 一写 \SetCell 就报一串 Missing number,且错误全指向 \end{tblr}。 % 详见 sty 第 4 节的记录。 % @@ -62,7 +61,6 @@ % ---- R1~R6 基本信息 ---- % % ⚠️⚠️ 每行必须写满 7 段(6 个 `&`),被 cell{} 合并掉的格**留空**。 - % 实测(最小复现):同样的 cell{} 配置下 % 写 7 段 `甲 & & 乙 & & 丙 & & 丁` → 四个字全部正确 % 写 4 段 `甲 & 乙 & 丙 & 丁` → **乙、丁 被吞掉** % ⇒ 段数 ≠ 列数时,多出来的内容会静默丢失,不报错。 @@ -71,12 +69,11 @@ % 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。 + % 再加文字,撑到 529.7bp(版心止于 521.57),超 8bp。 % ⇒ 单个填空收到 2.2em(约 7mm,手写两三个字够用)。 会议类型 & & 国内业务会议(\hspace*{2.2em})\hspace*{1em}% 国内管理会议(\hspace*{2.2em})\hspace*{1em}% @@ -109,24 +106,23 @@ % 纵向合并由 sty 里的 cell{21}{1}={r=5}{c} 声明, % 这里用 \shortstack 让四个字上下堆叠。 % ⚠️ 不能用 \rotatebox{90}:那只是把横排整句转个角度, - % 不是"上下排列"(#24 按用户意见修正)。 + % 不是"上下排列"(修正)。 % ⚠️ \shortstack 里的 \\ 是**普通换行**,tabularray 在 cell{} 语法下 % 不会把它误当行结束(旧版 \SetCell 语法下会崩,那是另一个坑)。 % % ★ 字距取 4bp:文字块约 56bp,格高 82bp → **上下各留 13bp**, % 既不贴格线,也能看出竖排拉开的效果。 % - % ⚠️⚠️ 字距不能给太大,会顶到格线。实测(9pt 字、格高 82bp): + % ⚠️⚠️ 字距不能给太大,会顶到格线。(9pt 字、格高 82bp): % \\[17bp] → 文字块 94bp,**比格高还高**,头尾字距格线只有 - % 2.5bp,视觉上字和表格线连成一片(用户指出过) % \\[8bp] → 文字块 67bp,上下各留 7.4bp ← 仍偏挤 % \\[4bp] → 文字块 56bp,上下各留 13bp ← 采用 % 不加参数 → 文字块 43bp,上下各留 19bp(字挤成一小团,不算竖排) % % ⚠️ 不能靠局部设 \baselineskip —— \shortstack 内部会重置它, - % 实测设 19bp 无效(字距仍是 11.6bp)。必须在 \\ 上给可选参数。 + % 实际设 19bp 无效(字距仍是 11.6bp)。必须在 \\ 上给可选参数。 % ⚠️ 也不能用 \parbox{}{其\\他\\费\\用} —— 会变成 4 个独立行盒子, - % tabularray 排版错乱,四个字跑到不同段落(实测)。 + % tabularray 排版错乱,四个字跑到不同段落(实际)。 \shortstack{其\\[4bp]他\\[4bp]费\\[4bp]用} & 交通费 & & & & & \\ & 会议资料印刷费 & & & & & \\ & 会议室使用费 & & & & & \\ @@ -138,8 +134,8 @@ % R27~R28 意见与签字(跨 3+4) % ⚠️⚠️ 这里的 \hspace 会把**单元格撑宽,进而把表格右边框推出纸外**, % 而且文字本身仍在版心内 —— 所以逐 span 查文字查不出来, - % 只有查竖线坐标才能发现(实测最右竖线跑到 526.40,版心止于 521.57)。 - % 实测数据:\hspace*{7em} → 超 4.83bp;4.5em → 仍超 4.83bp(跨列宽度已定死, + % 只有查竖线坐标才能发现(实际最右竖线跑到 526.40,版心止于 521.57)。 + % 实际数据:\hspace*{7em} → 超 4.83bp;4.5em → 仍超 4.83bp(跨列宽度已定死, % hspace 只是让内容溢出单元格,不改列宽)。 % ⇒ 该单元格内容必须能在一行内放下。「(签字) (盖章)」共 9 个全角字符 % ≈ 9×9bp = 81bp,跨 4 列约 96mm = 272bp,够放,只要 hspace 不太大。 @@ -148,7 +144,7 @@ % ⚠️ 关于「校级领导意见」:源 .doc 的 R26 第二格里确实有**两个段落** —— % 「所在单位负责人意见:」和「校级领导意见:」,不是转换时多出来的 % (用 LibreOffice 直接转 txt 核过,原文件就有)。 - % 但用户确认这份表不需要校级领导,故按用户意见删除。 + % 但用户确认这份表不需要校级领导,故删除。 % ⚠️ 要恢复就把它加回来,且必须单独一行(源文件是两段,不是一行): % 所在单位负责人意见:\\ 校级领导意见: % @@ -159,9 +155,8 @@ % % ⚠️⚠️ 为什么拆出去(很重要,别又改回主表里) % - % 这两行放在主表里,无论怎么写都会出问题。四种组合全部实测过: + % 这两行放在主表里,无论怎么写都会出问题。四种组合全部实际过: % 内容 8 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)❌ - % ← 用户指出的"多出一列" % 内容 7 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)❌ % 内容 2 段 + cell{27}{4}={c=4} → 列数对了,但第 2 段落进第 2 列 % 被 c=4 的合并盖住,内容消失 ❌ @@ -180,14 +175,14 @@ % 前 3 列 6.10+29.65+11.43 = 47.18mm(+colsep 4mm) % 后 4 列 18.18+29.65+3.00+40.10 = 91.02mm(+colsep 4mm) % ⚠️ 两列各自的 colsep 各算 2 个(左右各 1),所以实际宽度 = wd + 4mm -% ⚠️⚠️ 第 1 格不要用 \hfill 推「(签字)」到右边 —— 实测会溢出格子: +% ⚠️⚠️ 第 1 格不要用 \hfill 推「(签字)」到右边 —— 实际会溢出格子: % 第 1 格宽 51.71mm=146bp,「(签字)」36bp,\hfill 推到格尾后 % 文字自身**超出单元格右边界**(tabularray 的格内容不自动裁剪), % 结果第一个「(签字)」跑到 199~265,跨过 232 的分界线, -% 和第二个「(签字)」在 pymupdf 里连成一串(看着像只有一个)。 +% 和第二个「(签字)」连成一串(看着像只有一个)。 % ⇒ 直接顶着格左边界排,前面补一点 \hspace 抵消全角括号的字形左空白。 % (全角「(」的 ink 起点比盒起点靠左约 2.5bp,不加会略微超出 -% 版心左界 79.40 —— 实测 x=76.9) +% 版心左界 79.40 —— 实际x=76.9) \begin{oucmeetsign} 经费(项目)负责人意见: & 所在单位负责人意见: \\ \hspace*{1mm}(签字) & \hspace*{1mm}(签字)\hspace*{5em}(盖章) \\ diff --git a/劳务发放说明表/ouclw.sty b/劳务发放说明表/ouclw.sty index 0628ff3..c8ba80f 100644 --- a/劳务发放说明表/ouclw.sty +++ b/劳务发放说明表/ouclw.sty @@ -2,7 +2,7 @@ % ouclw.sty — 中国海洋大学 劳务发放说明表 版式包 % % 依据:实验室管理/劳务补贴/劳务发放说明表.docx(Word 2007+ 保存) -% 目标:版式与原 docx 逐项对齐。所有尺寸都由 docx 内部数值换算: +% 目标:版式与逐项对齐。所有尺寸都由 docx 内部数值换算: % twips → mm : mm = twips / 1440 * 25.4 % twips → pt : pt = twips / 20 (1 pt = 1/72 in) % w:sz : 半磅值,÷ 2 即 pt @@ -20,7 +20,7 @@ %====================================================================== % 1. 页面与版心 % -% 原 docx sectPr: +% sectPr: % pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4 % pgMar top/bottom 1361 = 24.01 mm % left/right 1797 = 31.70 mm @@ -30,7 +30,7 @@ % 原表 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,并不对称。 +% 实际原表左右边距就是 pgMar 的 1797 twips = 31.70 mm,并不对称。 % % ⇒ 本包照实复现这个“不对称”: % left = 31.70 mm (= docx pgMar left) @@ -57,7 +57,7 @@ } \setlength{\parindent}{0pt} \setlength{\parskip}{0pt} -\pagestyle{empty} % 原 docx 无页眉页脚,故不排页码 +\pagestyle{empty} % 无页眉页脚,故不排页码 %====================================================================== % 2. 字体与字号 @@ -72,7 +72,7 @@ % ⚠️⚠️⚠️【最要命的一条】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 ✓ % @@ -85,7 +85,6 @@ % 归 1。这一步不能省,也必须在 \AtBeginDocument 之后再设一次 % (ctex 在 begin document 时会重设)。 % -% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的 % SimSun / SimHei / FangSong + AutoFakeBold,换台机器(尤其 Linux/macOS) % 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。 %====================================================================== @@ -106,7 +105,7 @@ %====================================================================== % 3. 列的宽度模型 % -% 原 docx tblGrid(4 个网格列,twips → mm): +% 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 一致) @@ -134,11 +133,10 @@ % wd = gridCol(mm) − 3.81 − 0.2204 % % ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差, -% 实测需再微调(见 3.2 的实测标定值),否则一直报 +% 实际需再微调(见 3.2 的标定值),否则一直报 % “Table width is too small, need 0.45pt more!” 外加一条 Overfull \hbox。 % %---------------------------------------------------------------------- -% ⚠️ 两条通用结论(在 年度考核登记表/ 里踩过,这里同样适用): % % (a) 合并单元格 cell{r}{c}={c=n}{c} 的单元类型 {c} 是【不折行的 LR 模式】。 % 格内文字若比所跨各列合计更宽,它不会在列内折行,而是【把这些列撑宽】, @@ -185,7 +183,7 @@ %====================================================================== % 4. 行高 % -% 原 docx 各行【没有 trHeight】,高度全由段数决定 +% 各行【没有 trHeight】,高度全由段数决定 % (每段 = 1 个行距 15.6 pt): % R0 2 段 → 31.2 pt = 11.01 mm % R1 1 段 → 15.6 pt = 5.50 mm @@ -194,7 +192,7 @@ % R4 2 段 → 31.2 pt = 11.01 mm % 合计 280.8 pt = 99.06 mm % -% ⚠️ tabularray 的 ht= 经实测同为“最小行高”,与 Word 的 atLeast 语义一致。 +% ⚠️ tabularray 的 ht= 经实际同为“最小行高”,与 Word 的 atLeast 语义一致。 % 本表直接把这些值写成 ht=,行高即固定;内容更多的行会自然长高。 %====================================================================== @@ -251,7 +249,7 @@ % % ⚠️⚠️ 这里【必须】保持 \parbox 默认的 [c],不要改成 [t]。 % 原因:tabularray 会给每个单元格垫一个 strut,[t] 生成的盒子顶部 -% 与 strut 顶部相加,实测每行白白多出 3.6pt(R0 从 31.67 → 35.26)。 +% 与 strut 顶部相加,每行白白多出 3.6pt(R0 从 31.67 → 35.26)。 % % docx 里 R0C1 / R2C1 / R4C1 都没有 (按 OOXML 语义是顶部对齐), % 但它们靠【段落数把行高填满】实现“贴顶”: @@ -278,12 +276,12 @@ % % ⚠️ R3 第一格是合并格(c1-c2),另外两格是普通列。tabularray 对这两种格 % 的垂直居中算法【不一样】:合并格内容整体偏低 1.55 pt。 -% 三个格分别裸写内容时,实测基线为 +% 三个格分别裸写内容时,基线为 % 批准单位负责人签字 y = 280.65 % 用工单位负责人签字 y = 279.10 % 经办人签字 y = 279.10 % 肉眼勉强看得出参差。把所有格都包成【同一种】\parbox 后, -% 垂直居中的对象变成同一个盒子高度,三格自然对齐(实测 y 完全相同)。 +% 垂直居中的对象变成同一个盒子高度,三格自然对齐(实际y 完全相同)。 % 故本表三个签字格一律走这个宏。 %---------------------------------------------------------------------- \newcommand{\lwsign}[2]{% @@ -307,10 +305,10 @@ % 空段落:\lwblank{n} ⇒ 追加 n 个空行 % -% ⚠️ 不要用 \par\null:实测在 tabularray 单元格里,9 个 \par\null 会排成 +% ⚠️ 不要用 \par\null:实际在 tabularray 单元格里,9 个 \par\null 会排成 % 192.07pt,而 docx 里 9 个空段落只有 140.4pt。原因是 \null 是一个 % 有高度的盒子,每个都按“汉字 + 行距”算钱;Word 的空段落只贡献行距。 -% ⇒ 行高统一交给 tabularray 的 ht=(实测 ht=49.53mm 排出 140.73pt,与 +% ⇒ 行高统一交给 tabularray 的 ht=(实际ht=49.53mm 排出 140.73pt,与 % docx 的 140.4pt 差 0.33pt,可忽略),本宏只用于确有需要的场合。 \newcommand{\lwblank}[1]{% \par @@ -322,7 +320,7 @@ %====================================================================== % 8. 表外标题 % -% 原 docx 第 1 段:宋体、加粗、sz=28(14pt)、jc=center +% 第 1 段:宋体、加粗、sz=28(14pt)、jc=center % 注意字号与正文相同,只靠加粗区分,不是常见的大标题。 %====================================================================== \newcommand{\lwtitle}{% @@ -335,7 +333,7 @@ %====================================================================== % 9. 表后空行 % -% 原 docx 表格之后还有一个 jc=center 的空段落。 +% 表格之后还有一个 jc=center 的空段落。 %====================================================================== \newcommand{\lwtail}{\par\null\par} diff --git a/劳务发放说明表/劳务发放说明表.tex b/劳务发放说明表/劳务发放说明表.tex index 9ec6dce..436877a 100644 --- a/劳务发放说明表/劳务发放说明表.tex +++ b/劳务发放说明表/劳务发放说明表.tex @@ -46,10 +46,9 @@ \begin{lwtable} %---- R0 用工单位 | 单位名 --------------------------------------------- -% docx 里两格都是 2 段:C0 “用工单位”/“(公章)”,C1 单位名 + 1 个空段。 -% 两格内容都刚好填满行高 ⇒ vAlign 取 center 还是 top 结果相同。 -% ⚠️ 必须把那个空段补出来,否则 C1 只剩 1 段(高 12.6pt),会被 -% m 居中到格子中部,单位名比 C0 低 7mm 左右。 +% 两格都是 2 段:左格「用工单位」+「(公章)」,右格单位名 + 1 个空段。 +% ⚠️ 右格的空段必须补出来,否则只剩 1 段(高 12.6pt),会被 m 居中 +% 到格子中部,单位名比左格低约 7mm。 用工单位\par (公章) & \lwcellv{\lwunit\lwblank{1}} & & \\ diff --git a/年度考核登记表/ouckhtb.sty b/年度考核登记表/ouckhtb.sty index 8747a4a..5660193 100644 --- a/年度考核登记表/ouckhtb.sty +++ b/年度考核登记表/ouckhtb.sty @@ -2,7 +2,7 @@ % ouckhtb.sty — 中国海洋大学 教职工年度考核登记表 版式包 % % 依据:2025 年学校下发的 Word 表(WPS 保存的 .docx) -% 目标:版式与原 docx 逐项对齐。所有尺寸都由 docx 内部数值换算而来: +% 目标:版式与逐项对齐。所有尺寸都由 docx 内部数值换算而来: % twips → mm : mm = twips / 1440 * 25.4 % twips → pt : pt = twips / 20 (1pt = 1/72in) % w:sz : 半磅值,÷2 即 pt @@ -20,7 +20,7 @@ %====================================================================== % 1. 页面与版心 % -% 原 docx sectPr: +% sectPr: % pgSz 11907 × 16840 twips = 210.03 × 297.04 mm → A4 % pgMar top/bottom 1418 = 25.01 mm % left/right 1701 = 30.00 mm @@ -62,7 +62,6 @@ % R1C6 的括注 仿宋 12pt (w:sz=24),只有“研究所、实验室、科室” % 页脚页码 9pt (footer 样式 w:sz=18) % -% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的 % FangSong / SimHei / SimSun + AutoFakeBold,换台机器(尤其 Linux/macOS) % 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。 %====================================================================== @@ -89,7 +88,7 @@ %====================================================================== % 3. 列的宽度模型(本包最关键的一节,改之前请先读完) % -% 原 docx tblGrid(11 个网格列,twips → mm): +% tblGrid(11 个网格列,twips → mm): % c1 1087→19.17 c2 283→ 4.99 c3 1221→21.54 % c4 1047→18.47 c5 284→ 5.01 c6 1105→19.49 % c7 952→16.79 c8 600→10.58 c9 870→15.35 @@ -103,7 +102,7 @@ % R3~R8 1,10 (2 个单元:标签 + 内容栏) % %---------------------------------------------------------------------- -% ⚠️⚠️ 四条实测结论(tabularray 2022A),决定了下面的写法: +% ⚠️⚠️ 四条实际结论(tabularray 2022A),决定了下面的写法: % % (a) tabularray 的 wd 是“内容宽”,不含任何内边距;表宽 = Σwd + 竖线宽。 % 而 Word 的 gridCol 是“含内边距的整格宽”。两者语义相反。 @@ -114,7 +113,7 @@ % 而 ΣgridCol = 158.3267mm,故每列要减 (158.3267−156.3938)/11 % = 0.1757mm。(gridCol − 0.1757) 即下面 3.1 节的取值。 % -% ⚠️ 曾经取 0.1917mm(按 12 根竖线 6pt 算),表宽少 0.5pt, +% ⚠️ 曾取 0.1917mm(按 12 根竖线 6pt 算),表宽少 0.5pt, % longtblr 会一直报 “Table width is too small, need 0.50008pt more!” % 外加一条 0.5pt 的 Overfull \hbox。差得极小但很碍眼,故校正。 % @@ -125,19 +124,18 @@ % 窄列标签(如“出生年月”)在 Word 里本来就要折成两行,观感一致。 % % (c) ⚠️ 合并单元格(\SetCell[c=n])里的 \hsize【没有】被重设成该跨度的 -% 宽度,它仍是外层版心宽。实测:span=10 的格子里 \linewidth=47.8pt +% 宽度,它仍是外层版心宽。span=10 的格子里 \linewidth=47.8pt % 但 \hsize=450.5pt,于是长文本按 450pt 折行、彻底冲出格子 -% (这就是曾经那个 “Overfull \hbox (1644pt too wide)” 的真正来源)。 % ⇒ 凡是内容较长或含多段的跨列单元格,必须用固定宽的 \parbox 包起来。 % % (d) ⚠️⚠️⚠️【最要命的一条】跨列合并格 cell{r}{c}={c=n}{c} 的单元类型 % {c} 是【不折行的 LR 模式】。格内文字若比所跨各列的合计宽,它不会在 % 列内折行,而是【把这些列撑宽】,整张表随之超出版心。 -% 实测:“系(研究所、实验室、科室)”共 12 字(14pt ≈ 168pt), +% “系(研究所、实验室、科室)”共 12 字(14pt ≈ 168pt), % 塞进 c6-c7(合计 35.90mm ≈ 101.8pt)后,c6-c7 被撑到 126.5pt, % 整表由 448.3pt 涨到 558.9pt —— 正是那 111.6pt 的 Overfull \hbox。 % 而【单列】Q[c,m,wd=…] 没有这个问题:内容超出时只溢出、列宽不变 -% (实测在 10.39mm 的 c8 里写 4 个汉字,表宽仍为 448.3pt)。 +% (实际在 10.39mm 的 c8 里写 4 个汉字,表宽仍为 448.3pt)。 % ⇒ 结论:**凡是对齐到合并/窄格里、又必须折行的文字,一律包 \parbox**。 % 本包为此给每个跨度备了常量与 \khtbfit 包装,见下面 3.2 节。 %====================================================================== @@ -176,7 +174,7 @@ \newcommand{\khtbspanH}{24.0856mm} % c5-c6 姓名值 / 性别值 % 右侧内容栏(c2-c11,跨 10 列)的可用宽 = 十列 wd 之和。 -% ⚠️ 不要再用“实测 \linewidth”得到的那个 379.65pt:它是带竖线、且被 +% ⚠️ 不要再用“实际\linewidth”得到的那个 379.65pt:它是带竖线、且被 % xeCJK 行首调整过的结果,换算成 mm 后比真实格宽窄 7mm,会让签字横线 % 和勾选框提前收尾、右侧留出一大段空白。 \newcommand{\khtbcellw}{137.0792mm} @@ -184,12 +182,12 @@ %====================================================================== % 4. 行高 % -% 原 docx trHeight + hRule=atLeast(twips → mm): +% trHeight + hRule=atLeast(twips → mm): % R0 412→7.27 R1 460→8.11 R2 939→16.56 % R3 1261→22.24 R4 1252→22.08 R5 1009→17.80 % R6 556→ 9.81 R7 1258→22.19 R8 1258→22.19 % -% ⚠️ tabularray 的 ht= 经实测同为“最小行高”(ht=0pt 与 ht=5mm 同高, +% ⚠️ tabularray 的 ht= 经实际同为“最小行高”(ht=0pt 与 ht=5mm 同高, % ht=22mm 才撑开),与 Word 的 atLeast 语义一致 —— 内容多时行会自动 % 长高,与 Word 表现相同,无需额外处理。 %====================================================================== @@ -198,7 +196,7 @@ % 5. 表格环境 % % ⚠️⚠️ 必须用 longtblr 而不是 tblr: -% 本表内容使总高远超一页可用高度(原 docx 也是 2 页)。而 tblr 是 +% 本表内容使总高远超一页可用高度(也是 2 页)。而 tblr 是 % 一整块不可分割的盒子 —— 装进 \setbox 后报 Overfull \vbox (140pt), % 第 1 页只剩标题、表格整体被推到第 2 页。longtblr 才支持按行断页。 % @@ -213,9 +211,9 @@ % (所以上面 3.1 节的 \khtbwa… 只作文档用,不能拼进 colspec。) % % ⚠️⚠️⚠️ stretch=0 必须写:longtblr(与 tblr 不同)默认把各列按 \textwidth -% 等比拉伸,实测 11 列 wd 合计 450.46pt 的表被拉成 467.16pt(+16.7pt), +% 等比拉伸, 11 列 wd 合计 450.46pt 的表被拉成 467.16pt(+16.7pt), % 表格右边界从 523.7pt 越到 540.4pt,压在页边距外。 -% 加上 stretch=0 后实测宽 448.3pt,与版心严格一致。 +% 加上 stretch=0 后实际宽 448.3pt,与版心严格一致。 % % ⚠️⚠️ 【易错点】单元格合并(跨度)全部写死在本环境里,用 % cell{行}{列}={c=n}{c} @@ -223,7 +221,6 @@ % · \SetCell 之后要补若干个空 &,补几个取决于该格跨几列;一旦 % 某一个数错一位,同行后面所有单元格会整体错列到窄列(如 1.2mm % 的 c10)里去,报出【每一行都超宽】的 Overfull,从行号上完全 -% 看不出是哪一行错了 —— 这个坑本包踩过。 % · cell{r}{c}={c=n}{c} 把跨度与数据行分离,每行老老实实写满 % 11 个单元格,行列对应一目了然。 % ⚠️ 正确写法只有 {c=n}{c};={c=n}、={n}{c}、={span=n}{c} 都不认。 @@ -264,7 +261,6 @@ % % ⚠️⚠️【跨列合并一律在数据行里用行内 \SetCell,不要用表头的 cell{r}{c}】 % -% 这里踩了整整一轮坑,结论留下免得重来。 % % 原先表头写的是: % cell{1}{1}={c=2}{c}, cell{1}{5}={c=2}{c}, cell{1}{10}={c=2}{c}, @@ -274,13 +270,13 @@ % 根因:tabularray 的 cell{r}{c}={c=n} 里那个 c 是【数据行的单元序号】, % 不是视觉列号。三处 c=2 加起来让该行要吃掉 15 个视觉列,而表只有 11 列, % 超出的部分被静默丢弃 —— 被丢的正好是最后一个值。 -% 实测:同一行写 12 格 → 丢值;写 10 格/9 格 → 反而显示(因为空缺让它 +% 同一行写 12 格 → 丢值;写 10 格/9 格 → 反而显示(因为空缺让它 % 有余量)。所以「格子数对不对」在这里完全不能当判断依据。 % % 正解:表头不写 cell{},合并直接标在被合并的那个格子上: % \SetCell[c=2]{c} 职工号 & & 0000000 & ... % 每行照常写满 11 格,跨度由行内标记自己声明,不再有隐式吞格。 -% 改写后实测:零 error,11 列全值齐在。 +% 改写后零 error,11 列全值齐在。 %====================================================================== % \khtbfit{跨度宽宏}{内容} —— 定宽、水平居中、可折行 % 例:\khtbfit{\khtbspanC}{系(研究所、实验室、科室)} @@ -340,7 +336,6 @@ % 那样调用 \khtbsign{负责人签名:} 时,{...} 不是可选参数形式 [...] % 而不会被吃掉,结果是:先印出默认的“本人签名:”,随后那个参数组 % 在 \par 之后再单独排成一行 —— 一格里凭空多出两行签字,且标签还是错的。 -% 本包踩过这个坑:全文“本人签名”出现了 4 次。 \newbox\khtbsignbox \newcommand{\khtbsign}[1]{% \par\noindent @@ -371,8 +366,8 @@ % 用 \hbox to\linewidth + 5 个 \hss(首、尾、中间 3 处等分), % 剩余空间自动均分,总宽永不超过栏宽。 % -% ⚠️ 原 docx 用 Wingdings 的 ¨(char 0x00A8)画未勾选的方框。 -% 这里改用 U+25A1 “□”:实测仿宋、黑体都有该字形,宋体没有, +% ⚠️ 用 Wingdings 的 ¨(char 0x00A8)画未勾选的方框。 +% 这里改用 U+25A1 “□”:实际仿宋、黑体都有该字形,宋体没有, % 故正文默认仿宋;若把正文改成宋体,需另指定方框字体。 \newcommand{\khtbchoices}[1]{% \par @@ -399,8 +394,8 @@ %====================================================================== % 9. 表外标题 % -% 原 docx 第 1 段:黑体 22pt、居中、行距 exact 480twips=24pt、字距 -0.7pt -% 原 docx 第 2 段:仿宋 16pt。docx 里是 firstLine 640twips(2 字)缩进 +% 第 1 段:黑体 22pt、居中、行距 exact 480twips=24pt、字距 -0.7pt +% 第 2 段:仿宋 16pt。docx 里是 firstLine 640twips(2 字)缩进 % 且未设 jc,实际渲染为“左缩两字”而非居中 —— 更像原表排版的疏漏。 % 本模板改为居中(更符合版式意图);若要还原原样,把下面 \centering % 换成 \hspace*{2\ccwd} 即可。 @@ -422,7 +417,7 @@ %====================================================================== % 10. 表外脚注 % -% 原 docx 第 4 段:仿宋 14pt、居中 +% 第 4 段:仿宋 14pt、居中 % 内容“注:此表存入本人档案(A4纸正反面打印) 人事处制表” %====================================================================== \newcommand{\khtbfootnote}{% diff --git a/年度考核登记表/年度考核登记表.tex b/年度考核登记表/年度考核登记表.tex index dc786cd..af26c99 100644 --- a/年度考核登记表/年度考核登记表.tex +++ b/年度考核登记表/年度考核登记表.tex @@ -66,14 +66,13 @@ % ⚠️⚠️⚠️ 合并格里的文字【必须】用 \khtbfit{跨度宽宏}{文字} 包起来。 % 因为 cell{r}{c}={c=n}{c} 的 {c} 是【不折行的 LR 模式】: % 文字比所跨各列合计更宽时,它不会折行,而是把列撑宽、整张表超出版心 -% (实测“系(研究所、实验室、科室)”把表从 448.3pt 撑到 558.9pt)。 +% (实际“系(研究所、实验室、科室)”把表从 448.3pt 撑到 558.9pt)。 % 单列的 Q[c,m,wd=…] 没有这个问题,所以只有合并格需要包。 %====================================================================== \begin{khtbtable} % ⚠️ 每行都按 11 列写满(10 个 & + 结尾 \\)。 % 跨列合并在格子里用行内 \SetCell[c=n]{c} 声明,**不要**用表头的 -% cell{r}{c}。原因见 ouckhtb.sty 第 6 节的长注释 —— 那里踩过坑: % 用表头 cell{} 会让某个值整格消失,而且零报错。 %---- R0 职工号 / 姓名 / 性别 / 出生年月 ------------------------------- diff --git a/幻灯片/theme/beamerfontthemeOUCSlide.sty b/幻灯片/theme/beamerfontthemeOUCSlide.sty index 18fc9ed..0f29571 100644 --- a/幻灯片/theme/beamerfontthemeOUCSlide.sty +++ b/幻灯片/theme/beamerfontthemeOUCSlide.sty @@ -13,7 +13,6 @@ %====================================================================== % 字体全部取自仓库公共字体包 ../../fonts.tex(文件在 ../../fonts/ 下)。 % -% 旧版这里是 Path=fonts/ 直接读本目录下的 幻灯片/fonts/ —— 那 18 个 % 鸿蒙字体文件共 49MB,与其它模板重复,且一旦别处升级就会版本不一致。 % 现在统一到仓库根的 fonts/,全库只有一份。 % diff --git a/幻灯片/theme/beamerinnerthemeOUCSlide.sty b/幻灯片/theme/beamerinnerthemeOUCSlide.sty index 0cf9b77..c150327 100644 --- a/幻灯片/theme/beamerinnerthemeOUCSlide.sty +++ b/幻灯片/theme/beamerinnerthemeOUCSlide.sty @@ -234,7 +234,7 @@ \int_use:N \l_ouc_pbg_n - \int_use:N \l_ouc_pbg_base * \int_use:N \l_ouc_pbg_rows } - %% 预估总高度并与正文可用高度比较(公式按实测校准): + %% 预估总高度并与正文可用高度比较(公式按实际校准): %% 总高 ≈ 69pt(首行含标题条) + 行数*高度 + (行数-1)*25pt(行间距) \dim_set:Nn \l_ouc_pbg_est { diff --git a/幻灯片/theme/beamerouterthemeOUCSlide.sty b/幻灯片/theme/beamerouterthemeOUCSlide.sty index 4199225..d76d5b6 100644 --- a/幻灯片/theme/beamerouterthemeOUCSlide.sty +++ b/幻灯片/theme/beamerouterthemeOUCSlide.sty @@ -275,10 +275,10 @@ %% 方框内文字的字体(字号由 \ouc@toc@compute 算出) \def\ouc@toc@fontsel{\fontsize{\ouc@toc@font}{\ouc@toc@base}\selectfont\bfseries} -%% 圆形序号徽标(#1 = 圆圈填充色,#2 = 数字) +%% 圆形序号徽标(= 圆圈填充色,#2 = 数字) %% 注意:这里刻意不加 \strut。\strut 会把内容盒撑成「0.7 倍行距的上高 + 0.3 倍行距的下深」, %% 而数字没有下伸部(descender),那段虚构的下深会把数字整体推高,在圆里明显偏上 -%% (实测偏上约 1.7pt,大字号时可达 4pt)。去掉 \strut 后数字墨迹与圆心对齐(实测偏差 < 0.1pt)。 +%% (实际偏上约 1.7pt,大字号时可达 4pt)。去掉 \strut 后数字墨迹与圆心对齐(实际偏差 < 0.1pt)。 %% 圆的垂直位置不受影响:圆心到基线的距离恒为 minimum size 的一半(0.6em)。 \def\ouc@toc@badge#1#2{% \tikz[baseline=(ouc@badge.base)]{% @@ -286,7 +286,7 @@ minimum size=\ouc@toc@badgesize, font=\bfseries] (ouc@badge) {#2};% }% } -%% 实心样式下用的空心序号(#1 = 描边色,#2 = 数字;同样不加 \strut) +%% 实心样式下用的空心序号(= 描边色,#2 = 数字;同样不加 \strut) \def\ouc@toc@badgeopen#1#2{% \tikz[baseline=(ouc@badge.base)]{% \node[circle, draw=#1, line width=0.8pt, text=#1, inner sep=0pt, diff --git a/成绩构成说明/oucgrade.sty b/成绩构成说明/oucgrade.sty index 5ceed5d..5512043 100644 --- a/成绩构成说明/oucgrade.sty +++ b/成绩构成说明/oucgrade.sty @@ -30,7 +30,7 @@ %====================================================================== % 1. 页面与版心 % -% 原 docx sectPr: +% sectPr: % pgSz 11906 × 16838 twips = 210.00 × 297.02 mm → A4 % pgMar top/bottom 1440 = 25.40 mm % left/right 1800 = 31.75 mm @@ -81,13 +81,13 @@ %====================================================================== % 3. 字号 % -% 原件实测(导出 PDF 读 span 的 size): +% 原件(导出 PDF 读 span 的 size): % 大标题 18.00pt ← w:sz=36 半磅 = 18pt % 副标题 12.00pt ← w:sz=24 = 12pt % 正文 14.05pt ← w:sz=28 = 14pt % -% ⚠️ 正文实测 14.05 而非 14.00:WPS 内部按 1/20 pt 取整后再乘缩放 -% 系数,0.05 是渲染误差。本模板写 14bp,实测输出 14.00。 +% ⚠️ 正文实际14.05 而非 14.00:WPS 内部按 1/20 pt 取整后再乘缩放 +% 系数,0.05 是渲染误差。本模板写 14bp,输出 14.00。 % % ⚠️ 行距:原 docGrid linePitch=312 twips = 15.60pt。 % 但 14pt 字配 15.6pt 行距太挤(1.11 倍),原件正文段与段之间 @@ -164,7 +164,7 @@ % % ⚠️ 引导符不能用中点「·」(U+00B7):本库的 OUC Serif 子集里**没有** % 这个字形,会报 "Missing character: There is no · (U+00B7)", -% 印出来是空白。实测该字体有 ●(U+25CF) 与 ○(U+25CB), +% 印出来是空白。实际该字体有 ●(U+25CF) 与 ○(U+25CB), % 且 fonts.tex 已把这两个码位归入 CJK 字符类,可直接用。 % 也考虑过「•」(U+2022),同样缺字,不要用。 \newenvironment{grdlist}{% @@ -187,7 +187,6 @@ %====================================================================== % 7. 成绩构成表 % -% ⚠️⚠️ 列宽算法(这里踩过一次,务必按此办): % tabularray 的 Q[wd=...] 是**内容区宽度**,不含 colsep。 % 每列实际占位 = wd + 2×colsep(左右各一个 1.905mm)。 % 所以 6 列总共要多占 6×2×1.905 = 22.86mm。 @@ -218,7 +217,6 @@ % 这个坑在所有用 tabularray 的模板里都成立。 % 全格线:1-Z 表示第 1 条到第 Z 条(末条),即所有横线/竖线都画。 % 只画外框(hline{1,Z})时数据行之间是空白,跨行格与单行格的分界 - % 看不出来,容易看错行 —— 这是用户明确要求改掉的点。 hline{1-Z}={0.5pt}, vline{1-Z}={0.5pt}, % ⚠️ 行高:第 2 行给 22mm。 @@ -247,7 +245,6 @@ %====================================================================== % 8. 落款与签字栏 % -% 原件**没有**签字栏(只有一段说明文字就结束了)。用户明确要求补上 % 「任课老师签字」和年月日 —— 这是成绩构成说明作为归档材料的必要项: % 没有签字的说明文件在教务归档时不被认作有效文件。 % @@ -255,11 +252,10 @@ % 任课教师(签字):____________ % 年  月  日 ← 纯手写填空位,印任何年份都会占掉手写空间 % -% ⚠️⚠️ 踩过的两个坑(都表现成「内容不多却翻到下一页」): % % 坑① minipage 内部用 \hfill 撑右对齐 % → 内部行末被拉伸,12pt 的字被拉成 34.8pt 一字 -% (实测「任」「课」「教」「师」间距 34.8pt)。 +% (实际「任」「课」「教」「师」间距 34.8pt)。 % 正解:\hfill 只放在 minipage **外面**,内部 \raggedright。 % % 坑② 用 \noindent\hfill\begin{minipage}... 推右 @@ -269,12 +265,11 @@ % 正解:用 \makebox[\textwidth][r]{...} 一次性给足宽度, % 排版器眼里这就是一个普通行内盒子,可以正常与上文同页。 % -% 实测:改法②后 2 页 → 1 页,零 Overfull。 +% 改法②后 2 页 → 1 页,零 Overfull。 %====================================================================== \newlength{\grd@signline}\setlength{\grd@signline}{40mm} \newcommand{\grdsignblock}{% - % ⚠️⚠️ 这一块踩了三次「内容不多却翻页」,最终解法是**不用 \vfill**: % % 尝试① \par\vspace{4mm} + minipage % → 翻页。minipage 是不可分对象,紧跟 \par 后成为合法断页点。 @@ -286,9 +281,9 @@ % TeX 不接受压缩 \vfill,只能整块搬迁。 % % 最终解法:**固定间距 + 精确控制块高**,不依赖任何竖直胶。 - % \vspace 用一个实测够用的定值,块高用 minipage 内容决定。 + % \vspace 用一个实际够用的定值,块高用 minipage 内容决定。 % 正文字数变了就调这个 3mm —— 文档只有一页,回归成本极低。 - % 实测 2.2mm 时内容底 769.5,距版心底 769.9 余 0.4pt。 + % 实际2.2mm 时内容底 769.5,距版心底 769.9 余 0.4pt。 \par\vspace{2.2mm} \begingroup \grdsmall\songti diff --git a/成绩构成说明/成绩构成说明.tex b/成绩构成说明/成绩构成说明.tex index fdbcea3..24eb7f1 100644 --- a/成绩构成说明/成绩构成说明.tex +++ b/成绩构成说明/成绩构成说明.tex @@ -120,13 +120,13 @@ %------------------- 理论课(跨 2 行)------------------- % ⚠️ 每行必须是**恰好 6 个格**。&\& 多一个就会多出一列, - % 整表撑破版心报 Overfull(实测多一个 & 后冲出 122pt)。 + % 整表撑破版心报 Overfull(实际多一个 & 后冲出 122pt)。 % ⚠️ 分项比例写在「评定依据」列、**不写在「细分项目」列**,是刻意的: % 「细分项目」列可用宽只有 26mm(62.9bp),而「平时成绩(作业 20%、 % 点名 10%)」累计约 155bp,按中文避头尾规则必然折 **3 行**(56.2pt)。 % 但「理论课」是跨 2 行(r=2)的格,格高只有 2×7.5mm = 54.73pt, % 而 **tabularray 的跨行格不会自己长高,只会让内容溢出格线** —— -% 实测第 3 行「10%)」的墨迹底离行线只剩 0.90pt(0.32mm), +% 实际第 3 行「10%)」的墨迹底离行线只剩 0.90pt(0.32mm), % 同一张表其他行的间距是 4.97pt(1.75mm),一眼看得出挤。 % 仅画外框时那里本来没有线,缺陷被完全掩盖;画满全格线后才暴露。 % 「评定依据」列 29.4mm(74.17bp)放「作业 20% / 点名 10%」只折 2 行 diff --git a/教材/elegantbook.cls b/教材/elegantbook.cls index d0a7f0f..b69e083 100755 --- a/教材/elegantbook.cls +++ b/教材/elegantbook.cls @@ -1303,7 +1303,7 @@ \setlength{\fboxsep}{0pt} % 本地化:色带宽度用 \hsize 而不是 \linewidth。 % \newgeometry{margin=0in} 之后 \linewidth 的更新时机与 \makebox 的 - % 宽度计算有时序差,导致实测 Overfull 5pt(原版有封面图时被图宽度 + % 宽度计算有时序差,导致实际Overfull 5pt(原版有封面图时被图宽度 % 掩盖,换成占位空盒后暴露出来)。 \colorbox{coverlinecolor}{\makebox[\linewidth][c]{\shortstack[c]{\vspace{0.5in}}}} \vfill diff --git a/教材/ouctextbook.sty b/教材/ouctextbook.sty index 14384f8..fe2a74d 100644 --- a/教材/ouctextbook.sty +++ b/教材/ouctextbook.sty @@ -47,7 +47,7 @@ % cannot be found % 而且是 9 个错误连发,因为在类的每个字体档位上都会失败。 % -% 实测:在 \documentclass 之后用 \setsansfont 覆盖**无效** —— +% 在 \documentclass 之后用 \setsansfont 覆盖**无效** —— % 类加载时该字体族已经注册失败,后面的重新指定救不回来。 % % ⇒ 唯一可靠的做法是**本地化 cls 本身**:模板目录里带一份 @@ -119,7 +119,7 @@ % (color=black 选项下 second 就是黑色)。 % % ⇒ 在导言区写 \colorlet{coverlinecolor}{...} 会被它覆盖, -% 实测封面色带仍是纯黑,改了半天没反应。 +% 实际封面色带仍是纯黑,改了半天没反应。 % 必须用 \AtBeginDocument 排到它后面。 %====================================================================== \definecolor{ouccoverlinecolor}{RGB}{32,178,170} @@ -163,7 +163,7 @@ % % ⚠️ 教材正文长、中文多、行内夹英文术语和公式,默认 \tolerance % 会产生大量 Overfull(原教材明确加过这一条)。 -% 2em 是原教材实测的值,既消掉大部分告警,又不会排出稀疏的行。 +% 2em 是原教材实际的值,既消掉大部分告警,又不会排出稀疏的行。 %====================================================================== \setlength{\emergencystretch}{2em} @@ -205,7 +205,6 @@ % 第一版写成 \rule{0pt}{0pt}(0 宽),立刻冒出 % Overfull \hbox (5.00002pt too wide) in paragraph at lines 44--44 % 而且它只出现在 \maketitle 那一行,改 \hspace{2em}、\hspace{2.5em}、 -% minipage 的 0.67/0.27\linewidth、tabular 的列间距,**全部无效**, % 溢出量死钉在 5.00002pt 不动。 % % 根因:0 宽空盒让 \linewidth 在 titlepage 里的计算与 \textwidth @@ -215,9 +214,9 @@ % ✅ 正解:给占位盒一个满宽 % \newcommand{\ouc@coverblank}{% % \rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}} -% 实测 0 Overfull。 +% 实际0 Overfull。 % -% ⚠️ 不要试图在本文件里用 \ifcsname 覆盖 \@cover 来绕开 —— 实测 +% ⚠️ 不要试图在本文件里用 \ifcsname 覆盖 \@cover 来绕开 —— 实际 % \@cover 即使定义成空串也会走 \includegraphics{} 分支报错。 % 改 cls 是唯一干净的办法。 %====================================================================== diff --git a/特殊事项说明表/ouccsx.sty b/特殊事项说明表/ouccsx.sty index b89ef32..cf616de 100644 --- a/特殊事项说明表/ouccsx.sty +++ b/特殊事项说明表/ouccsx.sty @@ -2,7 +2,7 @@ % ouccsx.sty — 中国海洋大学 特殊事项说明表 版式包 % % 依据:报销相关/中国海洋大学特殊事项说明表.docx(Word 2007 保存) -% 目标:版式与原 docx 逐项对齐;内容可随意增删而不破版。 +% 目标:版式与逐项对齐;内容可随意增删而不破版。 % % 尺寸换算: % twips → pt : pt = twips / 20 (1 pt = 1/20 twip) @@ -12,7 +12,7 @@ % % ⚠️ 与 PDF 对齐的几何量一律用 bp(= 1/72 in,PDF 用户单位), % 不用 pt(= 1/72.27 in)。两者差 0.375%,A4 上累积可达 2 pt, -% 超过一个字符宽,肉眼看得出。凡注「实测」者均为 PDF 坐标 +% 超过一个字符宽,肉眼看得出。标注坐标者均为 PDF 坐标 % (左上原点、向下为正)。 % % 用法见同目录 特殊事项说明表.tex,说明见 README.md @@ -28,7 +28,7 @@ %====================================================================== % 1. 页面与版心 % -% 原 docx sectPr: +% 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 @@ -40,7 +40,7 @@ % 而 docx 版心宽只有 210 − 28 − 26 = 156 mm。 % 表比版心宽 13.54 mm,靠 tblInd = −546 twips(−9.63 mm)向左顶出去。 % -% 实测(Word 导出 PDF): +% 坐标(Word 导出 PDF): % 表格左边框 x = 46.70 bp,右边框 x = 527.35 bp(宽 480.65 ✓) % 标题文字中心 x = 300.41 bp ← 居中于 docx 版心,不是居中于表格 % @@ -67,7 +67,7 @@ paperheight = 297mm, left = 16.47mm, % = 表格左边框 totalwidth = 169.54mm, % = 表格外宽 - % ⚠️ 实测口径差:本包所有 y 都恒比原件小 0.14 bp(表顶线、备注、 + % ⚠️ 坐标差:本包所有 y 都恒比原件小 0.14 bp(表顶线、备注、 % 页码全部同步偏移,是 top 与 PDF 线宽的取整差,不是各行的问题)。 % 从 top 里补掉,一次消除。 top = \dimexpr38.01mm+0.14bp\relax, @@ -82,7 +82,7 @@ %====================================================================== % 2. 字体与字号 % -% 原 docx 字号(w:sz 半磅值 ÷ 2): +% 字号(w:sz 半磅值 ÷ 2): % 大标题 44 → 22 pt / 表内正文 21 → 10.5 pt % 签字日期 24 → 12 pt / 备注 21 → 10.5 pt / 页码 28 → 14 pt % @@ -112,7 +112,7 @@ % 内边距 tblCellMar left/right = 108 twips,top/bottom = 0 % % 行高:trHeight 是 5091 / 1140 / 634 twips,hRule="atLeast", -% 但 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。 @@ -122,14 +122,14 @@ \newlength{\sxrule} \setlength{\sxrule}{0.5pt} % = tblBorders sz 4/8 \newlength{\sxpad} -\setlength{\sxpad}{4.93bp} % 校到内容左界 52.08(实测 52.11) +\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。 +% 原件内容左界 52.08、右界 521.89 ⇒ 可用宽 469.81 bp。 % ⚠️ 这 1.7 bp 是「折不折行」的临界。本表那句「项目负责人是科研经费 % 使用的直接责任人……」共 47 字,在 471.5 bp 里能挤成一行, % 在 469.81 bp 里必须折行 —— 原件是两行。差一行 = 13.56 bp, @@ -152,7 +152,7 @@ % 【坑一】\baselineskip 只在**同一段落内部**管行距。 % 本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68), % 因为 10.5 pt 与 12 pt 的字混排,Word 按「下一行字号 × 1.3」算。 -% 最初每行 \par 之后单独给 \baselineskip,实测**完全无效**: +% 最初每行 \par 之后单独给 \baselineskip,**完全无效**: % 所有行距被压成 13.51,12 pt 的签名行没变高,整表矮 2.25 bp。 % 原因:每行 \par 自成一段后,段间基线距离 = 上段末行深度 + % \parskip + 本段首行字高,\baselineskip 根本没被读到。 @@ -166,7 +166,7 @@ % % 【坑二】块首行必须用 \kern,不能用 \vskip。 % TeX 会【丢弃 \vbox 开头的胶】,用 \vskip 给的顶距静默消失 -% (实测「事项描述:」给 10.53 只落到 5.38,等于只剩字高)。 +% (实际「事项描述:」给 10.53 只落到 5.38,等于只剩字高)。 % \kern 不受这条约束,且照样计入盒高。 % % 【坑三】必须允许负的 \kern。 @@ -179,13 +179,13 @@ % \vbox 的 \ht = 首行高度 + (n−1)·行距,它的参考点是末行基线。 % 所以「上一行基线 → 本段首行基线」的距离不是 pd + kern + ht, % 而是 pd + kern + ht − (n−1)·行距。漏掉这一项, -% 多行段自己会被推下一整行,其后所有行跟着错(实测 0.48 而非 14.04)。 +% 多行段自己会被推下一整行,其后所有行跟着错(实际0.48 而非 14.04)。 % ⇒ 用 \prevgraf 取段内行数,把 (n−1)·行距加回 kern。 % ⚠️ \dp 不用改:\vbox 的 \dp 就是末行的真实深度。 % % 【坑五】\offinterlineskip 会继承进段落内部。 % 它把 \lineskiplimit 设成极小值,段内多行改走 \lineskip(=0), -% \baselineskip 又被架空(实测行距只剩 10.81 而非 13.56)。 +% \baselineskip 又被架空(行距只剩 10.81 而非 13.56)。 % ⇒ 段落内部必须显式恢复 \lineskiplimit / \lineskip。 %====================================================================== \newbox\sx@boxa @@ -213,7 +213,7 @@ % 给 0 表示「首行自然贴块顶、只留字高」。 % 后者用于 R0 下半块:那块是贴格底的,全部位置由 % 「末行深度 + 逐行行距」反推出来,再给绝对顶距就重复 -% 定位了(实测多给 208.89,整块下移 66.90)。 +% 定位了(实际多给 208.89,整块下移 66.90)。 \newcommand{\sx@bl}[3][\z@]{% \setbox\sx@boxc=\hbox to \sxboxw{\hskip\sxpad #3\hss}% \ifsx@first @@ -246,9 +246,9 @@ \noindent #4\par % ⚠️⚠️ \prevgraf 有两道坎: % ① 必须在 vbox **内部**取 —— 它是「当前正在排的段落行数」, - % vbox 一关闭就恢复成外层值(实测把 2 读成 0)。 + % vbox 一关闭就恢复成外层值(实际把 2 读成 0)。 % ② 必须在 \par **之后**取 —— \prevgraf 是在段落断行那一步 - % 才被写入的,\par 之前读到的还是旧值(实测仍为 0)。 + % 才被写入的,\par 之前读到的还是旧值(实际仍为 0)。 \global\sx@pgd=\dimexpr\numexpr\prevgraf-1\relax\dimexpr#3\relax\relax}% % 中间各行的推进总量 \sx@tmp=\sx@pgd @@ -257,7 +257,7 @@ % 块首行的 #2 直接是「块顶 → 首行基线」,不需要再扣多行推进量: % 多行段的 \ht 已经包含了「首行基线 → 末行基线」的全部推进, % 而首行基线本身与段有几行无关。加回 pgd 会把首行推下一整行 - % (实测描述两行偏 +10.39)。 + % (实际描述两行偏 +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 @@ -274,14 +274,14 @@ % \sx@put{偏移}{内容} —— 在「内容左界 + 偏移」处放置内容 % % 原件的签名行、年月日全靠敲空格凑位置(R0 签名前是 30 个 14 pt 空格), -% 换台机器字号一改就散架。这里按实测 x 坐标绝对定位,不随字体漂移。 +% 换台机器字号一改就散架。这里按实际x 坐标绝对定位,不随字体漂移。 % % ⚠️⚠️ 用 \rlap(= \hbox to 0pt{...\hss})而非 \makebox[0pt][l]: % 两者都是零宽盒左对齐,但 \makebox 内容超宽会报 Overfull \hbox % (签名下划线 84 bp 必然超),\rlap 末尾有 \hss 吸收,静默通过。 % 因零宽,一行串多个 \sx@put 时共用同一原点,偏移各自独立。 % -% 偏移 = 「Word 导出 PDF 实测 x」− 52.08(内容左界) +% 偏移 = 「Word 导出 PDF 实际x」− 52.08(内容左界) %---------------------------------------------------------------------- \newcommand{\sx@put}[2]{% \rlap{\hspace*{#1}#2}} @@ -300,7 +300,7 @@ % \sx@cellvf{高度}{上半}{下半} 中间 \vfil 撑开 ⇒ 下半贴格底 % -% ⚠️⚠️ 这里踩过一个非直觉的坑: +% ⚠️⚠️ 非直觉之处: % 最初写「先 \setbox 量内容,再 \vbox to <高>{\box\sx@box\vfil}」, % 结果 R0 的「兹证明」跑到描述正下方(y=261.95,原件 382.13), % 整块偏高 120 bp。 @@ -321,7 +321,7 @@ % \vbox to N 设定的是**高度**,深度另计:若最后一项是 \box\sx@boxb % 且它自带深度(本表末行深 3.11),则 vbox 的 \dp = 3.11, % 总高变成 N + 3.11,整行高三点一一,四条横线全部下移 - % (实测 R0 = 287.11 而非 284.00)。 + % (实际R0 = 287.11 而非 284.00)。 % 补一条零高胶让末项变成胶(胶无深度),\dp 归零, % 总高才正好等于 N。 \ifdim\dimexpr\ht\sx@boxa+\ht\sx@boxb+\dp\sx@boxb\relax<#1 @@ -333,8 +333,8 @@ %====================================================================== % 5. 标题 % -% 原 docx:22 pt 小标宋(→ 宋体真粗体),居中,标题段行距 25 pt。 -% 实测:文字中心 x = 300.41 bp,基线 y = 147.65。 +% :22 pt 小标宋(→ 宋体真粗体),居中,标题段行距 25 pt。 +% 文字中心 x = 300.41 bp,基线 y = 147.65。 % % ⚠️⚠️ 为什么不能直接 \centering: % 本包版心 16.47~186.01 mm,中心 287.03 bp; @@ -348,13 +348,13 @@ \setlength{\sxtitleindent}{\dimexpr\sxofficialleft-\sxtblleft\relax} \newlength{\sxtitlewidth} \setlength{\sxtitlewidth}{156mm} -% 实测微调:标题中心原偏右 0.60 bp(字形宽度差所致) +% 微调:标题中心原偏右 0.60 bp(字形宽度差所致) \newlength{\sxtitlefix} \setlength{\sxtitlefix}{-0.60bp} -% 标题前/后竖直距离(由 PDF 实测反推,见 README「实测记录」) +% 标题前/后竖直距离(由 PDF 实际反推,见 README「实际记录」) % ⚠️ 这两个值必须成对调:\sxprespace 在标题前、\sxpostspace 在标题后, -% 单独改一个会把标题与表格的间距一起改掉。实测标定见 README。 +% 单独改一个会把标题与表格的间距一起改掉。标定见 README。 \newlength{\sxprespace} \setlength{\sxprespace}{10.07bp} \newlength{\sxpostspace} @@ -406,13 +406,13 @@ % \sxdateC 科技管理部门签字处日期 % % ⚠️ 为什么不让 .tex 改整行:原件里这些行全靠敲空格对齐,一旦让 -% 用户自己写,每人写出来都不一样,模板就失去意义。这里按实测 +% 用户自己写,每人写出来都不一样,模板就失去意义。这里按实际 % x 坐标把固定部分钉死,.tex 只需填描述与日期。 % % ------------------------------------------------------------------ % R0 纵向结构(全表最麻烦的一处) % -% 原 docx R0 共 19 段:1「事项描述:」/ 2~3 空 / 4 描述正文 / +% R0 共 19 段:1「事项描述:」/ 2~3 空 / 4 描述正文 / % 5~12 八个空段(给手写留白)/ 13 空 / 14「兹证明…」/ 15 签名 / % 16 年月日 / 17「项目负责人是…」/ 18「非科研经费…」 % @@ -426,7 +426,7 @@ % 这是内容超量的正常表现(Word 里也一样),不是 bug。 % % ------------------------------------------------------------------ -% 实测基线(PDF 绝对 y;Δ 为与上一行的基线距) +% 实际基线(PDF 绝对 y;Δ 为与上一行的基线距) % % R0(顶线 172.99,内容顶 173.24) % 事项描述 183.77 (10.53) @@ -503,7 +503,7 @@ %---------------------------------------------------------------------- % R1 —— 单位负责人签字 + 单位公章 -% 实测下划线 x 187.05~253.05(长 66 bp);「单位公章:」后不画线。 +% 实际下划线 x 187.05~253.05(长 66 bp);「单位公章:」后不画线。 %---------------------------------------------------------------------- \newcommand{\sx@rowB}{% \sxfontbody\songti @@ -535,14 +535,14 @@ %====================================================================== % 8. 备注区 % -% 原 docx 三条备注是「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 +% 三条备注是「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 条在原 docx 里是**手打的**「 3. 」(没有 numPr), +% ⚠️ 第 3 条在里是**手打的**「 3. 」(没有 numPr), % 比前两条多两个空格、位置差 0.36 bp。本模板统一排齐, % 这是与原件唯一的有意差异(README「与原件差异」已列明)。 %====================================================================== @@ -568,7 +568,7 @@ % ⚠️ 引言「备注:使用科研经费报销时……」是**连排的一句话**, % 「备注:」不是悬挂标签,整行从 79.44 起排,故只需一个 \sx@put。 %---------------------------------------------------------------------- -% 第一行的「块顶 → 首行基线」:实测 585.89 − 表格底 573.89 = 12.00 +% 第一行的「块顶 → 首行基线」:实际585.89 − 表格底 573.89 = 12.00 \newcommand{\sxnotes}{% \par\nointerlineskip \vbox{% @@ -583,12 +583,11 @@ %====================================================================== % 9. 页脚 % -% 原 docx 页脚:右对齐「— 1 —」,宋体 14 pt,右缩进 180 twips = 9 pt。 -% 实测整串左端 463.56、右端 512.65。本包版心右界 527.02, +% 页脚:右对齐「— 1 —」,宋体 14 pt,右缩进 180 twips = 9 pt。 +% 实际整串左端 463.56、右端 512.65。本包版心右界 527.02, % 故整串需再左移 527.02 − 512.65 = 14.37 bp。 % -% ⚠️⚠️ 这里踩过一个坑:最初写 \fancyfoot[R]{\hspace*{-14.7pt}内容}, -% 负 \hspace 放**开头** —— 完全没效果(实测偏右 24.94 bp)。 +% 负 \hspace 放**开头** —— 完全没效果(实际偏右 24.94 bp)。 % 原因:fancyhdr 的 [R] 位把内容放进 \hbox to \textwidth 并前置 % \hfil,靠「内容块整体贴右」对齐。开头加负 \hspace 只把块起点 % 左移,块宽没变,右边界仍贴版心右界。 diff --git a/科技报告/cls/boxes.cls b/科技报告/cls/boxes.cls index 7c6b352..26fec94 100644 --- a/科技报告/cls/boxes.cls +++ b/科技报告/cls/boxes.cls @@ -6,13 +6,12 @@ % 颜色一律引用 cls/color.cls 里的语义名(oucinfo / oucalert ...), % 不在这里写具体色名,更不写 RGB 值。 % -% 【关于内容块里的 3 个 Underfull \hbox(#19 记录)】 +% 【关于内容块里的 3 个 Underfull \hbox(记录)】 % % 第 208/214/220 行那三段示例文字里有 \verb|Illuminate\Foundation\Http\Kernel|, % 这个 35 字符的串在 \verb 里**不能断行**,整行只能把它塞进去,于是那行 % 被撑松 —— 报 Underfull (badness 1231)。 % -% 试过且**无效**的方案(别重复踩): % · \emergencystretch 2em / 10em —— 无效。它不是"额度不够"的问题: % 这一行没有足够的可拉伸 glue 可用,给多少额度都无从施展。 % · \sloppy —— 反而更差,badness 从 1231 升到 3590(放宽了断行标准, diff --git a/科技报告/cls/font.cls b/科技报告/cls/font.cls index 18abb5b..3e58fa1 100644 --- a/科技报告/cls/font.cls +++ b/科技报告/cls/font.cls @@ -52,7 +52,6 @@ % % ⚠️⚠️ 西文为什么从 HarmonyOS 换成 Cochineal(2026-10 改,#19) % -% 旧版这里 \setmainfont / \setsansfont / \setmonofont 三处全是鸿蒙。 % 中文换成思源宋体之后,正文就成了「中文衬线 + 西文无衬线」, % 同一行里英文数字明显比汉字细、比汉字"陷进去",读起来割裂。 % @@ -83,7 +82,6 @@ ] % 等宽位:真等宽,供代码块(listings 的 \ttfamily)使用。 -% 旧版这里也是鸿蒙 —— 它不是等宽字体,代码里 i/l/1、m/w 宽度不一, % 竖向对不齐,缩进看起来是歪的。 % lmmono(Latin Modern Mono)是 TeX Live 自带,无需额外字体文件。 % @@ -117,7 +115,7 @@ \XeTeXlinebreakskip = 0pt plus 1pt %====================================================================== -% 二之二、重定义 \hm:中文与西文一起切到鸿蒙(#19) +% 二之二、重定义 \hm:中文与西文一起切到鸿蒙 % % 问题:fonts.tex 里的 \hm 是 \def\hm{\CJKfamily{OUCHM}} —— 这只是 % xeCJK 的**中文字族**切换,管不到阿拉伯数字和拉丁字母。而本模板的 @@ -174,7 +172,6 @@ \newcommand{\fzkai}{\CJKfamily{fzkai}} % 仿宋(原方正仿宋)—— 斜体位 -% ⚠️ 朱雀仿宋只有常规一档。旧版这里配的是"方正仿宋",也是常规字面, % 所以观感一致;但若在 \fzfs 下用 \bfseries,不会真的变粗。 \setCJKfamilyfont{fzfs}[ Extension = .ttf, diff --git a/科技报告/cls/title.cls b/科技报告/cls/title.cls index e4de3a0..6a7f030 100644 --- a/科技报告/cls/title.cls +++ b/科技报告/cls/title.cls @@ -3,7 +3,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %---------------------------------------------------------------------- -% 各级标题字体(#19) +% 各级标题字体 % % 目标:编号和标题文字**都是鸿蒙**。 % @@ -48,7 +48,7 @@ \renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} % 给 sections加点 %---------------------------------------------------------------------- -% 目录条目的字族统一(#19) +% 目录条目的字族统一 % % 问题:一条目录里能出现两种字体。编号 "1." 是阿拉伯数字 → 被 xeCJK % 判成西文 → 走 \setmainfont;条目标题是中文 → 走 \setCJKmainfont。 diff --git a/科技报告/input/cover.tex b/科技报告/input/cover.tex index 6b48bec..4eeb724 100644 --- a/科技报告/input/cover.tex +++ b/科技报告/input/cover.tex @@ -14,7 +14,7 @@ % 视觉上"挂在页眉区",明确在版面结构内,又不会挤压正文。 % ⚠️ 别把 20mm 改得更小:A4 印刷 / 装订裁切余量一般 10~12mm, % 改到 15mm 以下有被裁掉的风险。 -% ⚠️ logo 下沿距首条横线约 12mm(实测),若改 width 或 yshift, +% ⚠️ logo 下沿距首条横线约 12mm(实际),若改 width 或 yshift, % 记得重新确认这个间隙,太大显得松散、太小挤成一团。 %---------------------------------------------------------------------- \newcommand{\coverlogo}{% diff --git a/简历/awesome-source-cv.cls b/简历/awesome-source-cv.cls index 83d20ce..3e106e0 100644 --- a/简历/awesome-source-cv.cls +++ b/简历/awesome-source-cv.cls @@ -395,7 +395,7 @@ % 简历页边距只有 15mm(科技报告是 27mm),抬头第一行「姓名」的墨迹顶 % 就在 48.8pt = 17.2mm。28mm 宽的横式 logo 高 7.06mm,若距顶 20mm % 会直接压到姓名上,距顶 8mm 也只剩 6pt 间隙(2mm,视觉上贴着)。 -% 实测 6mm 时 logo 下沿在 13.1mm,仍在 15mm 版心边距以内, +% 实际6mm 时 logo 下沿在 13.1mm,仍在 15mm 版心边距以内, % 距姓名顶有 11.6pt(4.1mm),是这块空间里最平衡的位置。 % % ⚠️ 距纸左 10mm 已接近 A4 打印的裁切余量(一般 10~12mm), @@ -405,11 +405,11 @@ % % ⚠️⚠️ 为什么后面跟着 \vspace*{-17pt}: % tikzpicture 即使全部内容都是 overlay,它本身仍是一个**占一行的盒子**, -% 插在 \makecvheader 前面会把姓名整体往下推 17pt(实测 48.8 → 65.8)。 +% 插在 \makecvheader 前面会把姓名整体往下推 17pt(实际48.8 → 65.8)。 % \smash、\hbox to 0pt、\vbox to 0pt 三种写法都消不掉这一行 % (因为要断行就必须有 \par,有 \par 就有行高)。 -% 直接用等量的负 \vspace 抵消,实测姓名回到 48.8pt,误差 0.0。 -% ⚠️ 这个 17pt 与 logo 尺寸无关(18~30mm 五档实测姓名都是 48.8), +% 直接用等量的负 \vspace 抵消,姓名回到 48.8pt,误差 0.0。 +% ⚠️ 这个 17pt 与 logo 尺寸无关(18~30mm 五档实际姓名都是 48.8), % 它是一行正文的高度。但若改了 \parskip 或正文字号,要重新量。 %---------------------------------------------------------------------- \newlength{\cvlogox} @@ -676,7 +676,7 @@ % 类别名随用随建,不需要预先注册。 % % ⚠️ 为什么用独立数据文件而不是 LaTeX 的 aux: -% 实测中文键经 aux 往返后 \ifcsname 全部匹配不上(xeCJK 把汉字设为 +% 实际中文键经 aux 往返后 \ifcsname 全部匹配不上(xeCJK 把汉字设为 % 活动字符,键的 token 形态与写入时不一致;ASCII 键正常,中文键失效)。 % 故改用独立文件 \jobname.cvnum,导言区末尾 \input,键原样保留。 % diff --git a/试卷/oucexam.sty b/试卷/oucexam.sty index cb5211f..3f49306 100644 --- a/试卷/oucexam.sty +++ b/试卷/oucexam.sty @@ -45,7 +45,7 @@ \AtBeginDocument{\linespread{1}\Fivhao\selectfont} %====================================================================== -% 2. 字体(#20:全部统一为思源宋体) +% 2. 字体(全部统一为思源宋体) % 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下)。 % % ★ 本版把试卷的所有文字统一为**思源宋体(OUC Serif)**,中西文同一字族: @@ -55,7 +55,7 @@ % 成绩表"题号/得分/一~八/总分" OUC Serif ✅ 原为霞鹜文楷 % % ⚠️ 为什么西文也能用思源宋体 -% 已实测 OUCSerif-Regular.otf / -Bold.otf:13714 字形、cmap 7555 条, +% 已实际OUCSerif-Regular.otf / -Bold.otf:13714 字形、cmap 7555 条, % ASCII 字母数字与常用标点 35/35 全部命中。它不是纯中文字体, % 西文字形是配套设计的,与汉字同灰度 —— 这正是要的效果。 % @@ -69,14 +69,13 @@ % 句点 . 0.327 vs 0.250 (+0.077) % 连字符 - 0.346 vs 0.333 (+0.013) % 影响:题号、分值、页码右移约 6%,题干里的英文单词变长。 -% 这是用户明确要求"全部用思源宋体"的必然代价,已确认接受。 % % ⚠️ 装订线的 4 组连字符虚线已改为**用线画**(见第 6 节), % 不再受字体宽度影响。旧版是靠 18bp 连字符排出来的, % 换字体后每串会长 4~7bp,故锁定为几何坐标。 % % ⚠️ 数学公式**不在统一范围内**(答案卷的 $x$、$\dfrac{}{}$ 等仍走 -% Computer Modern)。理由:思源宋体没有 MATH 表(实测只有 +% Computer Modern)。理由:思源宋体没有 MATH 表(实际只有 % GSUB/GPOS),不能作数学字体;强行塞进正文字体会破坏斜体变量、 % 正体数字、运算符间距这些数学排版规则。用户已确认保持不动。 %====================================================================== @@ -123,7 +122,6 @@ %---------------------------------------------------------------------- % 把**默认西文字体**也换成思源宋体(这是关键一步) % -% ⚠️⚠️ 只重定向 \tnr / \tnrb 是**不够**的,这一点踩过: % 模板里有大量文字**根本没走 \tnr**,而是走 \setmainfont(默认西文族): % · \textbf{learning outcome} —— 裸加粗,西文走 \setmainfont % · 页脚的页码 / 总页数 —— \node{...\thepage} 裸排 @@ -177,7 +175,7 @@ \let\sunfont\OUCLatinSerif % \kaiti 在试卷里只用于卷头填空与成绩表题号(见 \kh / \scoretable)。 -% #20 要求统一为思源宋体,故整个包内把 \kaiti 也指到思源宋体。 +%为思源宋体,故整个包内把 \kaiti 也指到思源宋体。 % ⚠️ 用 \let 而不是改 \def\kaiti —— 后者会破坏 ../fonts.tex 的定义, % 而 \kaiti 在别的模板里还要用楷体。 % ⚠️ 若将来要恢复楷体卷头,把下面这行注释掉即可,其余代码不用动。 @@ -186,7 +184,7 @@ %---------------------------------------------------------------------- % ⚠️ xeCJK 陷阱:字体切换命令若紧邻 \par(或位于段落末尾), % 该段结束时的字体状态会"溢出"到后续段落,导致后面的 ASCII -% 字符全部被排成 Times(实测:\tnr{ABC}\par 会让下一段的 "3" 变 Times)。 +% 字符全部被排成 Times(\tnr{ABC}\par 会让下一段的 "3" 变 Times)。 % 故所有局部字体切换一律走下面两个包装:内部显式 \normalfont 收尾。 % ⇒ 正文中请用 \TNR{...} / \TNRB{...} / \SUN{...},不要裸用 \tnr。 %---------------------------------------------------------------------- @@ -205,7 +203,7 @@ \def\@spreadeach#1{% \ifx#1\@nil\else\hspace*{\spread@amt}#1\expandafter\@spreadeach\fi} -% 中文与西文间自动间距:原卷实测固定 2.70bp(不随字号缩放, +% 中文与西文间自动间距:原卷实际固定 2.70bp(不随字号缩放, % 故用绝对 bp 而非 em;原卷 10.5bp 与 12bp 处均为 2.7bp) \xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain} @@ -238,7 +236,7 @@ %---------------------------------------------------------------------- % 页脚是否印"试卷类型字母"(课程名之后那个 A / B) % -% ★ 原卷实测:A 卷页脚【没有】字母(数字逻辑 + 一串短横线), +% ★ 原卷A 卷页脚【没有】字母(数字逻辑 + 一串短横线), % B 卷页脚【有】B(392.48 处)。 % 即:这是出卷人手工敲的,不是规则。故默认不印,需要时显式打开: % \examsetup{foottype = {B}} → 页脚印 B @@ -250,7 +248,7 @@ %====================================================================== % 5. 页脚:+…………………………课程名称 X……… 第 N 页 共 M 页 + 基线 713.33bp % -% 本地实测(原卷字符级): +% 本地(原卷字符级): % 82.20 '+' | 91.20~343.20 连续 29 个 '…'(每个步距 9.00) % 352.20 起课程名(长度不定)| 类型字母在 390.48 % 396.48 起 3 个 '…' | 432.48 '第' | 443.64 页码 | 448.20 '页' @@ -361,7 +359,7 @@ % \bindstrip[1.3,on] → 强制画 + 下移 % 局部覆盖单页:\ouc@bindforce 置 1/0 % -% 本地实测(原卷 p1,x 坐标全部 bp): +% 本地(原卷 p1,x 坐标全部 bp): % 竖虚线 x=33.8,5 段:101.1~148.5 / 222.4~290.8 / 359.4~427.9 % 489.3~557.8 / 600.0~668.6 % 18bp Times 连字符串 x=55.69("装/订/线"三字压在上面,白底遮断) @@ -398,7 +396,6 @@ % #2 = 笔画个数 % 相邻笔画顶端间隔 6.00bp,与原卷 18bp 连字符的步距一致。 % -% ⚠️⚠️ 方向别搞反(#20 返工过一次,记清楚): % 原卷的连字符是 rotate=90 排的,所以连字符的**横向长度转到了纵轴**、 % **线粗转到了横轴**。也就是说每一笔是「竖着的短杠」,不是「横着的短杠」: % 竖:y 跨 4.30bp(这是连字符的字面长度) @@ -406,9 +403,8 @@ % 中心 x = 51.60bp % 第一版按"水平线"画((49.40,y)--(53.70,y)),结果整条装订线变成 % 一把**梯子**(一排横杠叠在竖线位置),与基线观感完全不同。 -% 用户反馈「这个装订线不行,需要跟之前的模板保持一致」即指此。 % -% ⚠️ x 中心 51.60bp 是原卷实测:连字符字符盒 x 41.60~59.60(18bp 宽), +% ⚠️ x 中心 51.60bp 是原卷连字符字符盒 x 41.60~59.60(18bp 宽), % 但可见笔画只在 51.10~52.10,即字形在字符盒内偏右、 % 中心 51.60 —— 这是 Times 连字符的字形位置,不是笔误。 % @@ -433,7 +429,7 @@ \coordinate (B) at ([yshift=-\ouc@bindshift]current page.north west); % ---- ★ 原卷此处【没有】外框 ---- % 曾误把 PDF 里 x=17.4/18.12/60.15/60.87 那组线当成黑色外框, - % 实测它们是 fill=(1,1,1) 的**白色遮挡块**(Word 里盖住页眉页脚 + % 实际它们是 fill=(1,1,1) 的**白色遮挡块**(Word 里盖住页眉页脚 % 的底色块),可见黑线只有 x=33.80 那 6 段竖虚线。 % 故此处不画任何竖线/封口线。 % ---- 竖虚线:每段 = 对应栏目的"填写区"(紧接栏目名冒号之后,向上延伸)---- @@ -449,17 +445,17 @@ 359.35/427.85, 489.30/557.80, 600.05/668.60}{% \draw[line width=0.48bp,line cap=butt] ([xshift=33.8bp,yshift=-\a bp]B) -- ([xshift=33.8bp,yshift=-\b bp]B);} - % ---- 虚线段(#20:由「18bp 连字符排成」改为「用线画」)---- - % 原卷这四段确实是 18bp Times 连字符排出来的,但 #20 把试卷字体 + % ---- 虚线段(由「18bp 连字符排成」改为「用线画」)---- + % 原卷这四段确实是 18bp Times 连字符排出来的,但本包把试卷字体 % 统一到思源宋体之后,连字符每个宽 0.346 em(Termes 是 0.333), % 18bp 下每串会长出 4~7bp,正好破坏"复刻原卷长度"这个前提。 % ⇒ 改为几何画的短横线段,长度锁死在 \ouc@dashseg 的坐标里, % 不受任何字体宽度影响。 - % 实测原卷(720dpi 渲染后逐笔画测量): + % 实际原卷(720dpi 渲染后逐笔画测量): % 单个连字符笔画 长 4.40bp、粗 1.10bp、x 中心 51.60bp % → 左 49.40bp、右 53.80bp % 相邻笔画步距 6.00bp(= 18bp × 0.333 em) - % 六段坐标与笔画数取自原卷逐笔画实测,见下方调用处。 + % 六段坐标与笔画数取自原卷逐笔画实际,见下方调用处。 \ouc@dashseg{62.20}{24}% 最下一串(座号区) \ouc@dashseg{216.50}{24}% 考场教室号区 \ouc@dashseg{364.80}{3}% 截断的短线(原卷被白底遮断,照抄) @@ -662,7 +658,7 @@ \newcommand{\examfigcaption}[1]{% \par\nointerlineskip\centerline{\Xiaowu #1}\par\nointerlineskip} -% 图题(五号):原卷第 3 页 "图3" 实测 10.45bp +% 图题(五号):原卷第 3 页 "图3" 实际10.45bp \newcommand{\examfigcaptioniii}[1]{% \par\nointerlineskip\centerline{\Fivhao #1}\par\nointerlineskip\vspace*{5.40bp}} @@ -685,7 +681,7 @@ \newcommand{\sumphisig}{\hbox{\sunfont ∑Φ}} % 下标(原卷 M_L / M_S) -% 实测:L/S 字号 5.30bp(SimSun),基线相对正文下移 1.56bp; +% L/S 字号 5.30bp(SimSun),基线相对正文下移 1.56bp; % M(210.00) → L(215.16) 步距 5.16bp(M 的半角宽), % L → 和 3.96bp,故 M 起点到"和"共 9.12bp。 % 用宽度 3.87bp 的盒接管下标宽度,使 5.25 + 3.87 = 9.12 对齐原卷。 @@ -695,7 +691,7 @@ %====================================================================== % 10. 题型构件(通用) % 设计原则:不依赖任何具体课程,只提供"骨架", -% 题目内容由正文填写。所有题型都沿用本卷实测的版面参数: +% 题目内容由正文填写。所有题型都沿用本卷实际的版面参数: % · 正文 10.5bp / 行距 15.6bp % · 中英之间 2.70bp(ecglue) % · 题号栏 15.72bp(宋体题号,题号后空 5.28bp) diff --git a/试卷/ouckey.sty b/试卷/ouckey.sty index 5eae83c..d0fb3c7 100644 --- a/试卷/ouckey.sty +++ b/试卷/ouckey.sty @@ -59,7 +59,7 @@ \pagestyle{empty} %---------------------------------------------------------------------- -% 字体(#20:与 oucexam.sty 同步,全部统一为思源宋体) +% 字体(与 oucexam.sty 同步,全部统一为思源宋体) % 全部取自公共字体包 ../fonts.tex,再在包内重定向。 % % ⚠️ 必须和 oucexam.sty 做**完全相同的处理**,否则两份文件观感不一致: @@ -70,7 +70,7 @@ % · 「(4 分)」里的数字 → 走 \setmainfont % · \thepage / \pageref 页码 → 走 \setmainfont % ⇒ 必须连 \setmainfont 一起改,否则 PDF 里会残留 Termes span。 -% 实测第一轮只做 \let 时,答案卷残留 197 个 Termes span。 +% 实际第一轮只做 \let 时,答案卷残留 197 个 Termes span。 % % ⚠️ 数学公式($x$ / $\dfrac{}{}$ / $\sum$)**不在统一范围内**, % 仍走 Computer Modern。原因见 oucexam.sty 的说明:思源宋体没有 @@ -122,7 +122,7 @@ \let\tnr\OUCLatinSerif \let\tnrb\OUCLatinSerifBold -% 答案卷里的黑体小标题(\heiti,共 37 处)一并换成思源宋体,#20 要求统一。 +% 答案卷里的黑体小标题(\heiti,共 37 处)一并换成思源宋体。 % ⚠️ 用 \let 而非改 \def\heiti —— 后者会破坏 ../fonts.tex,影响别的模板。 % ⚠️ 若将来要恢复黑体标题,注释掉下面这行即可。 \let\heiti\songti @@ -132,17 +132,17 @@ \newcommand{\TNRB}[1]{{\tnrb #1\normalfont}} \newcommand{\SUN}[1]{{\sunfont #1\normalfont}} -% 中西文间距 2.70bp(原卷实测值,不随字号缩放)。 +% 中西文间距 2.70bp(原卷取值,不随字号缩放)。 \xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain} %---------------------------------------------------------------------- -% 直引号 " (U+0022) 归入 CJK 字符类(#20 补充修正) +% 直引号 " (U+0022) 归入 CJK 字符类(补充修正) % % ⚠️ 问题:本文件正文用 ASCII 直引号 "" 表示中文引号(共 32 处), % 而 xeCJK 按 Unicode 区段分类 —— U+0022 在 Basic Latin,被判成**西文**, % 于是引号走 \setmainfont(原为 Termes),与两侧汉字不同字体、不同宽度。 % 换字体后表现为一行里出现 TeXGyreTermes-Regular 的 ",且因为西文引号 -% 比中文引号窄、字距算法不同,挤压出 Overfull(实测第 88 行 +8.07pt)。 +% 比中文引号窄、字距算法不同,挤压出 Overfull(实际第 88 行 +8.07pt)。 % % ⚠️ 为什么不在 fonts.tex 里改:那里是**全库共用**的,把 U+0022 全局归 CJK % 会让正文里真正的英文引号(如 code 片段 "hello world")也变成全角, @@ -153,7 +153,7 @@ \xeCJKDeclareCharClass{CJK}{"0022} % " 直引号(当中文引号用) %---------------------------------------------------------------------- -% 【#20 踩坑记录】换字体引起的 Overfull 怎么修(结论:改源码断行,别调参数) +% 【技术说明】换字体引起的 Overfull 怎么修(结论:改源码断行,别调参数) % % 现象:字体统一为思源宋体后,参考答案与评分标准示例.tex 第 123-125 行 % (\keyitem{3}{4})出现 Overfull 2.61pt,渲染后压出版心右边界 @@ -169,7 +169,6 @@ % 往前找更早的合法断点(句号「。」之后)的话,第一行只填 65%, % 欠宽 150bp 无处拉伸 ⇒ badness 爆掉 ⇒ TeX 宁可撑破 2.61bp。 % -% ⚠️⚠️ 试过且**全部无效**的方案(别再花时间重复,每种都实测过): % ① \emergencystretch 1.5em —— 无效。只追加"可拉伸量", % 本行没有胶可拉,给多少额度都无从施展。 % ② \tolerance 3000 —— 无效。不是不满意断点,是没有更早的**合法**断点。 @@ -188,7 +187,7 @@ % \keyitem{3}{4}{% % \textbf{学习迁移}:指一种学习对另一种学习的影响\pt{2}。\\ % 按方向分正迁移与负迁移\pt{1},其发生依赖于共同要素与概括水平\pt{1}。} -% 已实测:Overfull 归零,三页最右墨迹均为 524.41bp,与版心严丝合缝。 +% 已Overfull 归零,三页最右墨迹均为 524.41bp,与版心严丝合缝。 % % 为什么这是对的做法而不是"绕过问题": % 分项给分的答案本来就该一句一行,读者(阅卷人)靠句号扫分点。 @@ -212,7 +211,7 @@ \def\ouckey@total{} %---------------------------------------------------------------------- -% key 赋值:空值规范成空串(#22) +% key 赋值:空值规范成空串 % % ⚠️ 所有 key 一律走这里,不要退回 `\def\ouckey@xxx{#1}`。 % 原因见文件下方「判空」一节的完整说明:那样 dept={} 会存成 @@ -245,7 +244,7 @@ \newcommand{\keysetup}[1]{\setkeys{ouckey}{#1}} %---------------------------------------------------------------------- -% 判空(#22 修正:原实现有真 bug) +% 判空(修正:原实现有真 bug) % % ⚠️⚠️ 旧实现的坑 % 旧代码是 @@ -255,7 +254,7 @@ % **\detokenize 不展开参数** —— 它看到的是字符串 `\ouckey@dept` % (宏名本身),永远非空 ⇒ 判空永远失败。 % 后果:`dept = {}` 时抬头仍印出孤立的「开课学院:」,后面没有值。 -% 这是旧版就有的 bug(三格布局下不明显),#22 改成一行一项后暴露。 +% 这是旧版就有的 bug(三格布局下不明显)。 % % 为什么不在宏里修 % 试过「先 \edef 展开再 \detokenize」的版本,会报 @@ -277,7 +276,7 @@ \fi} %---------------------------------------------------------------------- -% 一项信息:标签加粗 + 值,**独占一行**(#22) +% 一项信息:标签加粗 + 值,**独占一行** % % ⚠️⚠️ 为什么从"一行三格"改成"一行一项" % @@ -289,9 +288,9 @@ % · 盒内中文**不能换行**(LR 模式,不做段落断行) % 所以三格布局对短字段友好,对长字段必然重叠。 % -% 实测:把 dept 填成 +% 把 dept 填成 % 计算机科学与技术学院(人工智能与大数据技术方向实验班) -% 后,pymupdf 读出 +% 后,读取 % 开课学院:(70.87~123.37) 值:(123.37~406.87) % 而第二格「课程名称」本该从 216.0 开始 ⇒ **重叠 190.87bp**, % 把「课程名称 / 试卷类型」整个压住。 @@ -336,7 +335,7 @@ \vspace*{10bp} \hrule height 1.2bp \vspace*{8bp} - % 每项一行(#22)。顺序按"读者关心程度"排: + % 每项一行。顺序按"读者关心程度"排: % 先课程、后学院、再人与考试形式,最后分值。 % 留空的自动跳过,所以实际行数随填写项变化。 \ouckey@inforow{课程名称}{\ouckey@course} @@ -365,7 +364,6 @@ % 分处两行,否则会看到「(1」在行末、「分)」在下一行,很难看。 % 代价是「(X 分)」成了不可断的整体,极端行宽下会撑破版心。 % ⇒ 这个代价接受,解决办法是在**源码的句子边界手动断行**, -% 不是在这里放开可断。详见上面「#20 踩坑记录」一节。 \newcommand{\pt}[1]{{\small(\TNR{#1}~分)}} \newcommand{\ptline}[2]{% \par\noindent #2\unskip\par\nobreak @@ -393,7 +391,7 @@ \addvspace{5bp}} \newcommand{\keysectionfree}[3]{% \par\addvspace{10bp}% - {\Sihao\heiti #1、#2(#3)\par}% + {\Sihao\heiti #1、#2\par}% \addvspace{5bp}} %====================================================================== @@ -402,7 +400,7 @@ % \objkeys[5]{...} → 每行 5 个 % 答案串逗号分隔;题号自动递增。 % -% ★ 这个宏反复改过很多次,下面几条是实测结论,动之前先看清: +% ★ 这个宏反复改过很多次,下面几条是实际结论,动之前先看清: % % 【不能用 \par 分行】 % 在 \@for 循环体里写 "\hbox to \textwidth{...}\par\noindent", @@ -413,7 +411,7 @@ % 【不能用 \unvbox + \prevdepth 思路】 % \unvbox 执行完寄存器即被清空,紧跟的 \ifdim\ht...>0pt 恒为假; % 而且 \unvbox 后 TeX 把 \prevdepth 设成 -1000pt 抑制行间胶水, -% 各行会叠在一起(实测间距只有一个行高)。 +% 各行会叠在一起(实际间距只有一个行高)。 % % 【不能用 \makebox[<变宽>]】 % 在 \@for 循环里 \makebox[\dimexpr\textwidth/\perrow\relax] 或 @@ -532,7 +530,6 @@ \newcount\ouckey@sum \newcount\ouckey@cnt %---------------------------------------------------------------------- -% ★ 这里踩过三个坑,都记下: % % 坑1 \edef\head{\head&...} 自引用 → 无限展开,parameter stack 爆掉。 % 坑2 \g@addto@macro / \toks 存 token 序列 → 存进去的是 \ouckey@cur diff --git a/试卷归档封面/oucksfm.sty b/试卷归档封面/oucksfm.sty index 8d1f4aa..33820ab 100644 --- a/试卷归档封面/oucksfm.sty +++ b/试卷归档封面/oucksfm.sty @@ -5,7 +5,7 @@ % (SynologyDrive/授课/数字逻辑/2025/归档/) % 原名与内文标题写的是「学院」,按现行建制改为「学部」, % 模板标题相应为「信息科学与工程学部试卷归档封面」。 -% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算: +% 目标:版式与逐项对齐。所有尺寸都由 Word 内部数值换算: % pt → mm : mm = pt / 72 * 25.4 % twips → mm : mm = twips / 1440 * 25.4 % w:sz : 半磅值,÷ 2 即 pt @@ -23,7 +23,7 @@ %====================================================================== % 1. 页面与版心 % -% 原 .doc sectPr: +% sectPr: % pgSz A4(595.3 × 841.9 pt = 210.0 × 297.0 mm) % pgMar top/bottom 70.9 pt = 25.01 mm % left/right 56.7 pt = 20.00 mm @@ -49,7 +49,7 @@ } \setlength{\parindent}{0pt} \setlength{\parskip}{0pt} -\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码 +\pagestyle{empty} % 无页眉页脚,故不排页码 %====================================================================== % 2. 字体与字号 @@ -65,7 +65,6 @@ % ⚠️ 全文只有黑体一种字体,没有宋体/仿宋混排,比另两份表单简单。 % % 字体全部来自仓库公共字体包 ../oucfonts.sty(文件在 ../fonts/ 下)。 -% 旧版这里写的是系统字体的 SimHei / SimSun / FangSong + AutoFakeBold, % 换台机器(尤其 Linux/macOS)就编不出来。现已全部换成随仓库分发的 % 开源字体,并且粗体用字体自带的真粗体、不再算法描边。 %====================================================================== @@ -85,7 +84,7 @@ \linespread{1}\relax \fontsize{18}{21.6}\selectfont} -% 三档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致) +% 三档字号(行距取字号的 1.2 倍,与单倍行距一致) \newcommand{\sfmbigfont}{\linespread{1}\relax\fontsize{18}{21.6}\selectfont} \newcommand{\sfmmidfont}{\linespread{1}\relax\fontsize{16}{19.2}\selectfont} \newcommand{\sfmsmlfont}{\linespread{1}\relax\fontsize{14}{16.8}\selectfont} @@ -97,11 +96,10 @@ \newcommand{\SFMHT}[1]{{\heiti #1\normalfont}} %---------------------------------------------------------------------- -% ⚠️⚠️⚠️【「×」占位符的坑 —— 在 年度考核登记表/ 里踩过,那里只是绕过去了, % 这里做了根治】 % % 现象:写 {\heiti ×××} 后编译,PDF 里这些 × 实际用的是 -% Times New Roman(pymupdf 读 span 的 font=TimesNewRomanPSMT), +% Times New Roman, % 不是黑体。§ 29 个 × 撑不满预期宽度,跟汉字混排时基线也偏。 % % 原因:xeCJK 按 Unicode 区段分类。「×」是 U+00D7,落在 Latin-1 补充区, @@ -122,7 +120,7 @@ %====================================================================== % 3. 列的宽度模型 % -% 原 .doc tblGrid(2 个网格列,col_widths_pct = [30, 70]): +% tblGrid(2 个网格列,col_widths_pct = [30, 70]): % c1 = 170 × 30% = 51.000 mm % c2 = 170 × 70% = 119.000 mm % @@ -141,7 +139,7 @@ % 故每列再减 0.5292/2 = 0.2646 mm。 % % ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差, -% 实测需再微调(见 3.2 的实测标定值),否则一直报 +% 实际需再微调(见 3.2 的标定值),否则一直报 % "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。 %====================================================================== \newcommand{\sfmrule}{0.5pt} % 边框粗细(w:sz=4) @@ -167,7 +165,7 @@ %====================================================================== % 4. 行高 % -% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast): +% 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast): % R1 学年 42.55 pt = 15.011 mm % R2 学期 42.55 pt = 15.011 mm % R3 课程号 43.55 pt = 15.363 mm @@ -242,14 +240,14 @@ %====================================================================== % 7. 表外标题 % -% 原 .doc 第 1 段:黑体、加粗、w:sz=36(18pt)、jc=center +% 第 1 段:黑体、加粗、w:sz=36(18pt)、jc=center % % 原文标题是「信息科学与工程学院试卷」,按现行建制与文档实际用途已改为 % 「信息科学与工程学部试卷归档封面」 -% 实测 18pt 下宽 94.89mm,版心宽 170mm,左右各余约 37mm,单行不折。 +% 实际18pt 下宽 94.89mm,版心宽 170mm,左右各余约 37mm,单行不折。 % 再加长(比如后面挂"(理论课)")仍有余量,超过 170mm 才会折行。 % -% 标题与表格之间原 .doc 有 3 个空段落(idx 13/14/15), +% 标题与表格之间有 3 个空段落(idx 13/14/15), % 合计 3 × 21.6pt = 64.8pt = 22.86 mm。这里用 \sfmtitleskip 还原。 %====================================================================== \newlength{\sfmtitleskip} @@ -266,7 +264,7 @@ %====================================================================== % 8. 表后空行 % -% 原 .doc 表格之后还有一个空段落(idx 212)。 +% 表格之后还有一个空段落(idx 212)。 %====================================================================== \newcommand{\sfmtail}{\par\null\par} diff --git a/试卷归档封面/试卷归档封面.tex b/试卷归档封面/试卷归档封面.tex index 048d64c..9c83386 100644 --- a/试卷归档封面/试卷归档封面.tex +++ b/试卷归档封面/试卷归档封面.tex @@ -11,7 +11,7 @@ % (原文件名与内文标题写的是「学院」,现按现行建制改为「学部」) % 所有尺寸已在 oucksfm.sty 内注明换算过程;要改版式请改 sty。 % -% 与原 .doc 的差异(有意为之): +% 与的差异(有意为之): % · 原文件里的真实课程信息已全部换成 × 占位 % · 单位名「学院」按现行建制改为「学部」,标题相应改为 % 「信息科学与工程学部试卷归档封面」 @@ -43,7 +43,6 @@ % % ⚠️⚠️【必须看】占位符「×」一律用 \ph{} 包起来,不要裸写 ×。 % -% 原因(在 年度考核登记表/ 里踩过):字体的 ASCII 区段由 fontspec 交给 % 西文字体(这里是 Times New Roman),而「×」U+00D7 属于 Latin-1, % 会被判成 ASCII ⇒ 用 TNR 的 ×,那是 1em 宽的数学乘号, % 与汉字的 1em 字宽【不一样】(TNR 的 × 略窄、位置也偏)。 diff --git a/试卷归档目录/oucgddir.sty b/试卷归档目录/oucgddir.sty index 5982239..557c7f9 100644 --- a/试卷归档目录/oucgddir.sty +++ b/试卷归档目录/oucgddir.sty @@ -1,72 +1,32 @@ -%====================================================================== -% 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] +%====================================================================== +% oucgddir.sty —— 试卷归档目录版式包 +% +% 提供:gdtable 环境、\gdtitle、\gdhead、\gdno、\gditem、\gdnote +% 用法见同目录 README.md +%====================================================================== + \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 +% 表格宽 150.8105mm,比常规版心(左右各 31.75mm)宽约 4.14mm, +% 故整表按纸张居中,左右各留 29.599mm。 % -% 但这张表本身【比版心宽】—— 这是原文档就存在的问题,不是这里引入的: -% 版心宽 = 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 逐位相同。 +% totalwidth 取 150.8105mm 而非 150.636mm:tabularray 把竖线画在 +% 版心边界内侧,线宽计入盒宽,故需补 0.1745mm。 %====================================================================== \geometry{ paperwidth = 210mm, paperheight = 297mm, - left = 29.599mm, % 实测标定(见上) - totalwidth = 150.8105mm, % = 表真实宽(含 tabularray 取整余量) + left = 29.599mm, + totalwidth = 150.8105mm, top = 25.40mm, bottom = 25.40mm, headheight = 0pt, @@ -75,179 +35,48 @@ } \setlength{\parindent}{0pt} \setlength{\parskip}{0pt} -\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码 +\pagestyle{empty} -%====================================================================== -% 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 时会重设)。 -%---------------------------------------------------------------------- +% 行距统一取字号的 1.2 倍。 +% 字号用 bp 单位:pt 换算成 PDF 点会有 72/72.27 的偏差, +% 写 24pt 实际排出 23.91bp。 +%====================================================================== \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。) +% tabularray 的 wd 是内容宽,不含内边距;实际列间距 = +% wd + 2×colsep + 线宽。下列取值已扣除内边距与线宽。 %====================================================================== -\newcommand{\gdrule}{0.5pt} % 边框粗细(w:sz=4) -\newcommand{\gdcolsep}{1.905mm} % 单元格左右内边距(108 twips) +\newcommand{\gdrule}{0.5pt} % 边框粗细 +\newcommand{\gdcolsep}{1.905mm} % 单元格内边距 \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 -%---------------------------------------------------------------------- +\newcommand{\gdwa}{19.0853mm} % 第 1 列内容宽 +\newcommand{\gdwb}{73.3601mm} % 第 2 列内容宽 +\newcommand{\gdwc}{46.2315mm} % 第 3 列内容宽 %====================================================================== -% 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 解析选项时 @ 不是字母。 +% 3 列:序号 / 内容 / 标注 +% 第 1 行表头高 20.3729mm,正文行高 13.5819mm,末行 13.9876mm %====================================================================== \newenvironment{gdtable}{% \par\begingroup @@ -263,96 +92,19 @@ \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}% @@ -360,50 +112,17 @@ \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。 +% 标题「归档目录」四字之间用 \gdgap 插入固定空隙。 +% xeCJK 会吞掉连续半角空格,故不能用空格排版。 %====================================================================== \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) +\setlength{\gdtitlegap}{24bp} % 字间空隙 = 1 个字宽 -% \gdgap —— 标题里的字间空隙,直接在 .tex 里逐字之间插入: -% \gdtitle{归\gdgap 档\gdgap 目\gdgap 录} -% 比"逗号分隔、宏里循环"直观得多,也不用 \makeatletter。 \newcommand{\gdgap}{\kern\gdtitlegap} \newcommand{\gdtitle}[1]{% @@ -412,50 +131,13 @@ {\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} +\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} +\setlength{\gdtopskip}{2.7255mm} % 页顶到标题 \AtBeginDocument{\gdbasefont} \endinput \ No newline at end of file diff --git a/试卷归档目录/试卷归档目录.tex b/试卷归档目录/试卷归档目录.tex index d3aa93c..bfe861f 100644 --- a/试卷归档目录/试卷归档目录.tex +++ b/试卷归档目录/试卷归档目录.tex @@ -10,7 +10,7 @@ % 附件2:信息科学与工程学院归档目录(理论课).doc % (原文件名与内文写的是「学院」,现按现行建制改为「学部」) % -% 与原 .doc 的差异(有意为之): +% 与的差异(有意为之): % · 单位名「学院」按现行建制改为「学部」,标题相应改为 % 「信息科学与工程学部试卷归档目录」 % · 原字体「方正楷体_GB2312」是商业字体,已换成 OUC Kai @@ -18,11 +18,11 @@ % · 纸张、边距、表宽、列宽、行高、字号一律照原值,未做任何调整 % (详见 oucgddir.sty 的注释,每一项都附了换算过程) % -% 与原 .doc 的一个【已知差异】(无法也无需还原): +% 与的一个【已知差异】(无法也无需还原): % 原表的 tblGrid 合计 8540 twips = 150.64mm,比版心 146.50mm 宽 % 4.14mm,即原文档里这张表本来就在版心之外各溢出 2.07mm。 % Word 按 jc=center 居中摆放,所以看起来正常。 -% 本模板把版心直接设成表宽,表格居中与纸面的绝对位置与原稿一致, +% 本模板把版心直接设成表宽,表格居中与纸面的绝对位置, % 但不再"溢出版心"。视觉上无差别,且不会产生 Overfull 警告。 %====================================================================== \documentclass[UTF8,fontset=none]{ctexart} @@ -34,7 +34,7 @@ % ⚠️ 标题里的空格【不能】写成「归 档 目 录」—— xeCJK 会吞掉连续 % 半角空格,编译出来是紧贴的「归档目录」。必须用 \gdgap 手动插入 -% 24bp(= 1 个字宽)的固定空隙,才能与原稿逐字对齐。 +% 24bp(= 1 个字宽)的固定空隙,才能与逐字对齐。 \gdtitle{归\gdgap 档\gdgap 目\gdgap 录} \vspace{\gdheadskip} diff --git a/课程大纲/oucSyllabus.sty b/课程大纲/oucSyllabus.sty index 931fad0..e1ab6f7 100644 --- a/课程大纲/oucSyllabus.sty +++ b/课程大纲/oucSyllabus.sty @@ -7,7 +7,7 @@ % ⚠️ 编译: xelatex 课程大纲.tex % 单次编译即可,无交叉引用、无目录。 % 依赖 ctex + geometry + fontspec + xeCJK + tabularray -% 实测 TeX Live 2022 / tabularray 2022A +% 实际TeX Live 2022 / tabularray 2022A % 与 课程执行大纲/ 的 ouccourse.sty 同源同风格,可对照看。 %====================================================================== \NeedsTeXFormat{LaTeX2e} @@ -22,7 +22,7 @@ %====================================================================== % 1. 页面 % -% 原 docx sectPr 实测: +% sectPr % pgSz 宽 210.01 mm 高 297.00 mm % (WPS 存的 A4 是 11910×16840 twips,比标准 A4 的 % 11906×16838 各多 4/2 twips。差 0.07/0.04 mm,肉眼不可辨, @@ -46,23 +46,23 @@ } \setlength{\parindent}{0pt} \setlength{\parskip}{0pt} -\pagestyle{empty} % 原 docx 无页眉页脚、无页码 +\pagestyle{empty} % 无页眉页脚、无页码 %====================================================================== % 2. 字体 % -% 原 docx 用到:Times New Roman / 宋体 / 黑体 / 仿宋_GB2312 / 仿宋 / +% 用到:Times New Roman / 宋体 / 黑体 / 仿宋_GB2312 / 仿宋 / % 微软雅黑。其中「仿宋_GB2312」是商业字体,不能随仓库分发,且换机器 -% 编不出来(#17 脱敏时定下的规矩)。 +% 编不出来。 % % ⇒ 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下): % 宋体正文 → OUC Serif(思源宋体子集,真粗体) % 黑体标题 → OUC Sans(思源黑体子集) % 仿宋 → OUC Fang(朱雀仿宋)—— 仅在表格内用,见下 -% 西文/数字 → 与中文同族 OUC Serif(#20 定下的统一做法) +% 西文/数字 → 与中文同族 OUC Serif(定下的统一做法) % % ⚠️ 为什么正文不用仿宋 -% 原 docx 正文是「仿宋_GB2312」,但那是**表格内**的排版习惯。 +% 正文是「仿宋_GB2312」,但那是**表格内**的排版习惯。 % 正文大段用仿宋在屏幕上发虚、打印也偏淡,学校下发文件的正文 % 实际以宋体为主。本包正文用宋体,表格内保持仿宋观感(可选项 % \oucSylFangTabletrue 打开,默认关,见第 5 节)。 @@ -72,28 +72,27 @@ %---------------------------------------------------------------------- % 西文切换命令(与 试卷/ouckey.sty 的 \TNR 同义,保持全库一致) % -% ⚠️ 本包没有把 \setmainfont 改到思源宋体(那是 #20 为试卷做的决定)。 +% ⚠️ 本包没有把 \setmainfont 改到思源宋体。 % 课程大纲原文里西文与中文混排不多,主要是年份、百分比、器件型号 % (PROM/PLA/3-8 译码器),这些用默认西文字体即可。 % \TNR{} 在这里保留,是为了跟其他模板的调用习惯一致 —— % 将来若要把西文也统一到思源宋体,只需改 \setmainfont,调用点不用动。 % % ⚠️ 必须显式 \normalfont 收尾:xeCJK 下字体切换若紧邻 \par 会"溢出" -% 到下一段,导致后面裸 ASCII 全被排成西文字体(#20 踩过)。 %---------------------------------------------------------------------- \newcommand{\TNR}[1]{{\tnr #1\normalfont}} \newcommand{\TNRB}[1]{{\tnrb #1\normalfont}} %---------------------------------------------------------------------- -% 字号(pt,直接对应原 docx 的 sz 值) +% 字号(pt,直接对应的 sz 值) % -% 原 docx 字号分布(段落计数): +% 字号分布(段落计数): % 15pt 居中 ×1 —— 大标题「中国海洋大学本科生课程大纲」 % 12pt ×32+19+7+3 —— 正文、各级章节标题、表头 % 10.5pt ×1 —— 「六、成绩评定」(原文件此处字号不一致,见下) % 9~10pt ×27 —— 表格内容 % -% ⚠️ 「六、成绩评定」在原 docx 里是 10.5pt,与其余七个章节标题的 12pt +% ⚠️ 「六、成绩评定」在里是 10.5pt,与其余七个章节标题的 12pt % 不一致。这是原文件的疏漏(复制粘贴时漏改),本包统一按 12pt 处理, % 并在 README 记录这一处偏离。 %---------------------------------------------------------------------- @@ -109,20 +108,20 @@ %====================================================================== % 3. 标题与章节 %====================================================================== -% 大标题:15pt 黑体居中(原 docx 是微软雅黑,此处用 OUC Sans 顶替) +% 大标题:15pt 黑体居中(是微软雅黑,此处用 OUC Sans 顶替) \newcommand{\oucsylmaintitle}[1]{% \par\begingroup\Syw\heiti\centering #1\par\endgroup \vspace*{6bp}} % 一级章节标题:一、二、三… 12pt 黑体,段前留白 -% 原 docx 里章节标题与其后正文同字号同字体,仅靠「一、」区分, +% 里章节标题与其后正文同字号同字体,仅靠「一、」区分, % 视觉层级偏弱。这里给黑体以拉开层次(与 课程执行大纲 的做法一致)。 \newcommand{\oucsylsection}[1]{% \par\addvspace{10bp}% \noindent{\Sxii\heiti #1}\par \addvspace{4bp}} -% 二级小节:1. 2. 3.… 12pt 宋体(原 docx 就是宋体,不加粗) +% 二级小节:1. 2. 3.… 12pt 宋体(就是宋体,不加粗) \newcommand{\oucsylsubsection}[1]{% \par\addvspace{5bp}% \noindent{\Sxii #1}\par @@ -131,13 +130,12 @@ %---------------------------------------------------------------------- % 正文段落(首行缩进 2 字符) % -% ⚠️⚠️ 这里踩了一个很隐蔽的坑,三种常见写法全部越界: % % ① `\par\noindent\hspace*{2em}#1\par` % ② `\par\setlength{\parindent}{2em}\indent #1\par` % ③ `\parbox{\linewidth}{\setlength{\parindent}{2em}\indent #1}` % -% 实测(A4,左右 25.4mm,\linewidth=452.97pt,版心右界 523.28bp): +% (A4,左右 25.4mm,\linewidth=452.97pt,版心右界 523.28bp): % 无缩进的纯中文段落 右缘 523.28 ✅ 正确 % ①②③ 三种带缩进的写法 右缘 530.53 ❌ 超 7.25bp % @@ -152,7 +150,7 @@ % 就是缩进后的真实宽度,断行点才落对。 % \setlength{\hsize}{\dimexpr\linewidth-2em\relax} % \setlength{\parindent}{2em} -% 实测右缘 502.28bp,落在版心内(比版心右界还留了 21bp 余量, +% 实际右缘 502.28bp,落在版心内(比版心右界还留了 21bp 余量, % 因为最后一行没排满,属正常)。 % % ⚠️ \hsize 必须用 \begingroup 包住,否则影响后续所有段落。 @@ -174,7 +172,7 @@ % 选它的理由:需要列宽自适应 + 长文本自动换行 + 跨行合并, % tabularray 的 X 列比 tabularx 更好控制,且 2022A 之后稳定。 % -% 原 docx 表格边框:tblBorders sz=4 → 0.5pt 实线,四边都有 +% 表格边框:tblBorders sz=4 → 0.5pt 实线,四边都有 % 单元格内边距:tblCellMar 108 twips = 1.905mm %====================================================================== \newcommand{\oucsylborder}{0.5pt} @@ -182,7 +180,7 @@ %---------------------------------------------------------------------- % 4.1 表 0:课程基本信息(6 行 × 6 列,不规则) % -% 原 docx 结构(竖线位置逐行不同,用 \SetCell 合并实现): +% 结构(竖线位置逐行不同,用 \SetCell 合并实现): % R0 课程名称 | (中文)数字逻辑 ← 2 格 % R1 课程名称 | (英文)Digital Logic ← 2 格 % R2 课程代码 | 080502101231 | 责任教师 | 杨永全 ← 4 格 @@ -191,7 +189,7 @@ % R5 理论课时 | 32 | 实践课时 | 16 | 课外学时 | 32 ← 6 格 % % ⚠️ 列宽不能全用固定值。课程代码「080502101231」是 12 位数字, -% 10.5pt 下实测宽约 63pt ≈ 22mm,加两侧内边距 3.81mm 需 ≥ 26mm; +% 10.5pt 下实际宽约 63pt ≈ 22mm,加两侧内边距 3.81mm 需 ≥ 26mm; % 原值 26.5mm 时 Overfull 10.26pt(约 3.6mm),放不下。 % ⇒ 标签列固定 26.5mm(四个字「课程名称」正好),值列用 X 自动分配。 %---------------------------------------------------------------------- @@ -235,7 +233,7 @@ %---------------------------------------------------------------------- % 4.3 打勾矩阵(表 1:课程目标 × 指标点) % -% 原 docx:6 行 × 6 列,首行首格空白,其余为「课程目标1..5」, +% :6 行 × 6 列,首行首格空白,其余为「课程目标1..5」, % 首列表头为「指标点1.1 / 2.2 / 2.3 / 3.1 / 4.1」,中间 25 格全空 % (留给填 ✓ 或涂色)。 % @@ -261,11 +259,11 @@ %====================================================================== % 带编号的条目(课程目标、学习要求那种「1.xxx」) % -% ⚠️ 原 docx 用的是**全角句点**「.」(U+FF0E),不是 ASCII 句点「.」。 +% ⚠️ 用的是**全角句点**「.」(U+FF0E),不是 ASCII 句点「.」。 % 本包照抄全角。写 \oucsylp{1.xxx} 即可,不要写成 1.xxx —— 全角句点 % 后面没有额外间距,ASCII 句点会多出一个小空隙,与原卷不一致。 % -% ⚠️ 这里**不提供** list 环境。原 docx 的这些条目是普通段落 + 首行缩进, +% ⚠️ 这里**不提供** list 环境。的这些条目是普通段落 + 首行缩进, % 不是真正的列表(没有悬挂缩进,编号后面直接跟文字)。 % 用 list 反而会让第二行缩进到编号右侧,与原卷不一致。 % ⇒ 直接用 \oucsylp{1.xxx},编号是正文的一部分。 @@ -275,7 +273,7 @@ \par\addvspace{4bp}\noindent{\Sxii #1}\par\addvspace{2bp}} % 签字栏(大纲审核) -% 原 docx:「教学院长: 院学术委员会签章:」 +% :「教学院长: 院学术委员会签章:」 % 两个字段各占半行,与 课程执行大纲 的签字栏写法一致 \newcommand{\oucsylsignature}{% \par\addvspace{14bp}% diff --git a/课程大纲/课程大纲.tex b/课程大纲/课程大纲.tex index dfd063f..d3b5089 100644 --- a/课程大纲/课程大纲.tex +++ b/课程大纲/课程大纲.tex @@ -2,7 +2,6 @@ % 中国海洋大学本科生课程大纲(示例:数字逻辑) % % 用途:演示 oucSyllabus.sty 的用法。内容取自学校下发的 -% 课程大纲模板-数字逻辑-2024版.docx,**已脱敏**: % 责任教师等真实姓名一律换成虚构名,与仓库其他模板一致。 % % 编译: xelatex 课程大纲.tex (单次即可) @@ -21,7 +20,7 @@ \newcommand{\sylnamecn}{数字逻辑} \newcommand{\sylnameen}{Digital Logic} \newcommand{\sylcode}{080502101231} -\newcommand{\sylteacher}{张远航} % ← 虚构姓名,脱敏 +\newcommand{\sylteacher}{张远航} \newcommand{\sylattr}{专业知识} \newcommand{\sylnature}{必修} \newcommand{\sylcredit}{2.5} @@ -40,12 +39,10 @@ %====================================================================== % 表 0:课程基本信息 % -% 原 docx 逐行结构见 oucSyllabus.sty 第 4.1 节的注释。 -% ⚠️⚠️ tabularray 的 \SetCell 坑(踩了五次,最小复现已确认): +% 逐行结构见 oucSyllabus.sty 第 4.1 节的注释。 % % `\SetCell[c=2]{c} 内容 & 下一格` → **下一格被吞掉,内容消失** % -% 最小复现(6 列表): % A & \SetCell[c=2]{c} B & C & \SetCell[c=2]{c} D \\ % 渲染只得 A / B / D,**C 消失**,且不报错。 % @@ -59,7 +56,7 @@ % 本表 6 列,三行分别: % R0/R1 `标签 & \SetCell[c=5]{值} & {}{}{}{} ` → 1+5=6 格 % ⚠️ c=5 后面要 4 个 `{}`,但那会写得很长; -% 实测 c=5 放行末(直接 `\\` 不接 `&`)也能正确渲染, +% 实际c=5 放行末(直接 `\\` 不接 `&`)也能正确渲染, % 且更易读 —— 本文件用这种写法(已验证可行)。 % R2~R4 6 格平铺:标签 & 值 & 标签 & 值 & {} & {} % R5 6 格平铺 diff --git a/课程执行大纲/ouccourse.sty b/课程执行大纲/ouccourse.sty index 19fad77..362e37b 100644 --- a/课程执行大纲/ouccourse.sty +++ b/课程执行大纲/ouccourse.sty @@ -6,7 +6,7 @@ % % ⚠️ 编译: xelatex 课程执行大纲.tex (单次即可,无交叉引用) % 需要 ctex + geometry + fontspec + xeCJK + tabularray -% 实测 TeX Live 2022 / tabularray 2022A +% 实际TeX Live 2022 / tabularray 2022A %====================================================================== \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{ouccourse}[2026/10/26 v1.0 OUC course syllabus form] @@ -25,7 +25,7 @@ %====================================================================== % 1. 页面 % -% 原 docx sectPr: +% sectPr: % pgSz 11910 x 16840 twips → 210.08 x 297.04 mm % pgMar top 1420 right 1300 bottom 280 left 1560 % header 720 footer 720 @@ -50,18 +50,17 @@ } \setlength{\parindent}{0pt} \setlength{\parskip}{0pt} -\pagestyle{empty} % 原 docx 无页眉页脚、无页码 +\pagestyle{empty} % 无页眉页脚、无页码 %====================================================================== % 2. 字体 % -% 原 docx 用到 4 个字体,其中 3 个是方正商业字体: +% 用到 4 个字体,其中 3 个是方正商业字体: % 方正小标宋简体 标题(嵌在 docx 里,系统未安装) % 方正仿宋_GB2312 正文(同上) % 黑体 各级标题 % 宋体 教学日历表正文、9pt % -% 旧版这里是 SimSun / SimHei / FangSong + AutoFakeBold 伪粗,即 % 「本机恰好有 Windows 自带字体」的降级方案。问题有两层: % ① 换台机器(Linux/macOS、或精简版 Windows)就编不出来; % ② SimSun / SimHei / FangSong 都不允许随仓库分发。 @@ -84,7 +83,7 @@ %---------------------------------------------------------------------- % ⚠️ xeCJK 默认会在[汉字 ↔ 西文/数字]之间自动插一段空白(CJKecglue)。 -% 原 docx 里没有这种空白,例如「××学部××学院」「2026 学年」「56/3.0」 +% 里没有这种空白,例如「××学部××学院」「2026 学年」「56/3.0」 % 在 Word 里是紧挨着的。不关掉会出现「×× 学部×× 学院」这种多出来的空隙。 % 此处把 CJKecglue 设为 0,并关掉自动间距(xeCJK 的 punct/ec 两类)。 %---------------------------------------------------------------------- @@ -164,7 +163,7 @@ %---------------------------------------------------------------------- % 3. 首页字段区 % -% 原 docx P3~P8 共用同一个 pPr: +% P3~P8 共用同一个 pPr: % % % @@ -174,15 +173,15 @@ % → 首行再 +220 twips = +3.88 mm % → 制表位 7020 twips = 123.81 mm % -% ⚠️⚠️ 实测 docx 这几行是【溢出】的,不能照抄: +% ⚠️⚠️ 实际docx 这几行是【溢出】的,不能照抄: % 制表位绝对位置 = 27.52(左边距)+ 123.81 = 141.33 mm, % 而右侧内容【开课时间】 2026 学年 秋 季学期 宽 58.20 mm, % ⇒ 行尾落在 199.53 mm,已越过版心右边界 187.07 mm 达 12.5 mm, % 钻进了 22.93 mm 的右边距里。原文件靠负缩进硬塞,视觉上不易察觉。 % % ⇒ 本包改为干净的两栏等宽布局,两栏都对齐、整体不溢出: -% 左栏宽 100 mm(容纳【课程名】+值,实测最长 48.7 mm) -% 右栏从 100 mm 起,实测最长【开课时间】58.2 mm,合计 158.2 mm +% 左栏宽 100 mm(容纳【课程名】+值,最长 48.7 mm) +% 右栏从 100 mm 起,最长【开课时间】58.2 mm,合计 158.2 mm % 版心 159.55 mm,留 1.35 mm 余量 % 各行左标签起点一致、右标签起点也一致,比原文件更整齐。 %---------------------------------------------------------------------- @@ -328,7 +327,7 @@ \newcommand{\ccscoreBwd}{20.937mm} % ⚠️ 行高:docx 是 trHeight 454 exact = 22.70pt = 8.01mm。 -% tabularray 的 ht= 含 hline 线宽预算,实测给 8.01mm 画出来是 8.19mm +% tabularray 的 ht= 含 hline 线宽预算,给 8.01mm 画出来是 8.19mm % (每行多 0.18 = 一条 0.5pt 横线)。故减掉 0.176mm。 \newcommand{\ccscorerowht}{7.834mm} @@ -362,8 +361,8 @@ % 本包做法:列宽照抄 gridCol,用 \hspace* 把表左边界推到实际的 27.4mm。 % % ⚠️⚠️ 这张表【总高 334 mm】,版心只有 267 mm —— 必须跨页! -% 这就是原 docx 排成 5 页的原因。表内 16 行,R1~R13 无 trHeight, -% 行高由内容(9pt 宋体多行)决定,实测各段行高见 README。 +% 这就是排成 5 页的原因。表内 16 行,R1~R13 无 trHeight, +% 行高由内容(9pt 宋体多行)决定,各段行高见 README。 % docx 没有 tblHeader(跨页不重复表头)、没有 cantSplit(允许行内断开), % 故本包用 longtblr,且清空表头/表尾模板,行为与 Word 一致。 %====================================================================== @@ -383,7 +382,7 @@ % 6 列共 7 条竖线,若全摊到 6 列上,每列承担 7/6 条 ⇒ 0.2058mm。 % ⇒ wd = gridCol − 3.81 − 0.2058 = gridCol − 4.0158mm % -% 实测校验(改前 wd 按 gridCol−3.856 给,结果表宽 166.493 差 +0.95): +% 实际校验(改前 wd 按 gridCol−3.856 给,结果表宽 166.493 差 +0.95): % 每列宽 = wd + 2·colsep + 0.176 = 11.066+3.81+0.176 = 15.052 ✔ 与量到的完全一致 % 改后 Σ(wd+2·colsep) + 7×0.176 = 141.443+22.86+1.232 = 165.535 ≈ 165.54 ✔ \newcommand{\ccAwd}{10.906mm} % 14.922 − 4.0158 @@ -424,7 +423,7 @@ % 直接写 \begin{longtblr} 环境最稳。 % % ⚠️ longtblr 默认会在跨页处印 "( Continued )"、印 "表N:" 题注、 -% 页尾印 "Continued on next page"。而原 docx 没有 tblHeader、 +% 页尾印 "Continued on next page"。而没有 tblHeader、 % 没有题注、没有任何续页提示。 % % 清干净需要动【两组】东西,只清一组不够: @@ -432,7 +431,7 @@ % (模板实例里调的是 \UseTblrTemplate{...}{default}, % 只把 conthead 设成 empty 而留着 conthead-text,仍会印出 "( Continued )") % (b) 模板实例:caption / conthead / contfoot -% 实测只做 (b) 时第 5 页仍会出现 "表0:" 与 "(Continued)"。 +% 实际只做 (b) 时第 5 页仍会出现 "表0:" 与 "(Continued)"。 % % ⚠️⚠️ conthead-text / contfoot-text 不能设成 empty!那会报 % "! Use of \??? doesn't match its definition. @@ -458,7 +457,7 @@ label=none, % ⚠️⚠️ presep/postsep/headsep/footsep 是【outer】键,只能写在这个方括号里。 % 写进下面的花括号(inner spec)里不会生效,反而会把 "0pt" 当表内容 - % 印在表格第一行 —— 实测表头上出现了一串 "0pt0pt0pt0pt" 垃圾字。 + % 印在表格第一行 —— 实际表头上出现了一串 "0pt0pt0pt0pt" 垃圾字。 presep=0pt, postsep=0pt, headsep=0pt, footsep=0pt, ]{ colspec={ diff --git a/课程执行大纲/课程执行大纲.tex b/课程执行大纲/课程执行大纲.tex index cdaadb3..63c0fd4 100644 --- a/课程执行大纲/课程执行大纲.tex +++ b/课程执行大纲/课程执行大纲.tex @@ -69,10 +69,10 @@ % ⚠️ 英文段:不要在此处加任何断行干预。 % % 现象:换用 TeX Gyre Termes 后,第 1 页英文段第 3 行会宽出 6.39pt -% (Overfull),断行点比 Word 原稿略有前移。 +% (Overfull),断行点比 Word 略有前移。 % % 根因:这一段第 2 行要靠 time-invariant 的显式连字符断成 "time-" + -% "invariant" 才排得下 —— 实测该行到 "time-" 为止是 451.62pt, +% "invariant" 才排得下 —— 实际该行到 "time-" 为止是 451.62pt, % 而可用宽度只有 452.32pt,**只剩 0.70pt 余量**。Times New Roman 下 % 是 451.55pt(余 0.77pt)。两个字体都在临界线上,Termes 这边因为 % 字宽差 0.07pt,TeX 判断这次断行"不划算"就放弃了,于是把单词整体 @@ -108,7 +108,7 @@ communication principles, and automatic control.} 性质;第二部分讲授连续时间系统的时域分析与傅里叶分析,重点训练卷积积分与频谱 概念;第三部分讲授拉普拉斯变换与复频域分析,引入系统函数与稳定性判据;第四部分 平移到离散时间系统,讲授采样定理、$z$ 变换与离散系统的差分方程求解。实验环节 -与理论同步推进,通过软件仿真验证课堂结论,形成“理论—仿真—实测”的闭环。} +与理论同步推进,通过软件仿真验证课堂结论,形成“理论—仿真—实际”的闭环。} \ccp{3.课程与其他课程的关系:} @@ -365,7 +365,7 @@ $z$ 平面单位圆与稳定性的关系;离散系统的频率响应。\par % 宋体单倍行距 ≈ 1.0 × 字号,故 10.5 × 1.2 = 12.6pt。 % 不要用 \linespread{1.2} —— 它是乘在【基准字号】上的,外面套着 % \ccszix(9pt) 时只算出 10.8pt,空行高度又会退回外层行距, -% 实测 5 个空行占了 39.85mm(每行 22.6pt),严重偏大。 +% 实际5 个空行占了 39.85mm(每行 22.6pt),严重偏大。 \SetCell[c=6]{c} {\begin{minipage}{\ccspanall} \linespread{1}\relax\fontsize{10.5}{12.6}\selectfont diff --git a/课程教学日历/oucal.sty b/课程教学日历/oucal.sty index 9b3e8bf..9cc5302 100644 --- a/课程教学日历/oucal.sty +++ b/课程教学日历/oucal.sty @@ -24,7 +24,7 @@ %====================================================================== % 1. 页面与版心 % -% 原 .doc sectPr: +% 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 @@ -40,18 +40,18 @@ % 表格左边界 = 31.75 + (−13.97) − cellMar(1.905) = 15.875 mm % 表格右边界 = 15.875 + 174.625 = 190.50 mm % -% 实测 PDF 8 条竖线的 x 正是 15.875 / 31.75 / 57.309 / … / 190.5 mm, -% 与上式逐位吻合(见 README 的实测表)。 +% PDF 8 条竖线的 x 正是 15.875 / 31.75 / 57.309 / … / 190.5 mm, +% 与上式一致(见 README)。 % -% ⚠️ 但按 left=15.875mm 排出来,实测竖线在 15.963mm,整体右偏 0.088mm。 +% ⚠️ 但按 left=15.875mm 排出来,竖线在 15.963mm,整体右偏 0.088mm。 % 这是 tabularray 把左竖线画在"版心左边界 + 半线宽"处的取整结果。 -% 故 left 取 15.875 − 0.088 = 15.787mm,实测竖线回到 15.875mm。 +% 故 left 取 15.875 − 0.088 = 15.787mm,竖线回到 15.875mm。 % % ⇒ 本包处理(与前两个归档模板同一套办法): % 把版心直接设成表格的可见范围 15.875 ~ 190.50 mm, % 即 left = 15.875mm、totalwidth = 174.625mm。 % 这样表格与版心同宽、居中摆放,编译不刷 Overfull \hbox, -% 且表格在纸面上的绝对位置与原 .doc 完全一致。 +% 且表格在纸面上的绝对位置与完全一致。 % % 表格【外】的内容(标题、课程信息、签字栏)原本是相对 31.75mm % 的版心排的,故用 §7 的 \caloutside 把它们放回原位: @@ -62,7 +62,7 @@ \geometry{ paperwidth = 210mm, paperheight = 297mm, - left = 15.787mm, % = 表格左边界 15.875 − 实测取整 0.088(见下) + left = 15.787mm, % = 表格左边界 15.875 − 取整补偿 0.088(见下) totalwidth = 174.80mm, % = 表宽 + tabularray 取整余量(见 §4) top = 25.40mm, bottom = 25.40mm, @@ -72,12 +72,12 @@ } \setlength{\parindent}{0pt} \setlength{\parskip}{0pt} -\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码 +\pagestyle{empty} % 无页眉页脚,故不排页码 %====================================================================== % 2. 字体 % -% 原 .doc:全文中文「宋体」,西文/数字 Times New Roman +% :全文中文「宋体」,西文/数字 Times New Roman % (docDefaults: ascii=Times New Roman, eastAsia=宋体) % 换成 OUC Serif(思源宋体 SC 子集,OFL 1.1)与 TeX Gyre Termes % (Times 的度量兼容替代,字宽逐字相同)。 @@ -90,7 +90,6 @@ % 本表内容大量用全角标点(,、。:()),落在**居中**的单元格里。 % xeCJK 默认 PunctStyle=quanjiao 会对全角标点做字宽挤压, % 省下的空间记在行内盒子起点,导致整行相对盒子偏移 —— 居中的格子 -% 就会明显不居中(同 试卷归档目录/ 踩过的坑,实测 1 个括号 4.23pt)。 % % Word 不做这个挤压,关掉反而与原件一致。 %---------------------------------------------------------------------- @@ -99,7 +98,7 @@ %====================================================================== % 3. 字号与行距 % -% 原 .doc 各档字号(w:sz 是半磅): +% 各档字号(w:sz 是半磅): % 「附件3:」行 28/2 = 14pt 粗 % 标题 28/2 = 14pt 粗 % 「学年 学期」行 24/2 = 12pt 粗 @@ -109,11 +108,11 @@ % % 行距(表格外两行信息段落):w:line=460 lineRule=exact % ⇒ 460 twips = 460/20 = 23.00 pt 固定行距 -% 表格内未单独设 spacing,Word 按同一 docGrid 排,实测行距也是 23.00pt。 +% 表格内未单独设 spacing,Word 按同一 docGrid 排,行距也是 23.00pt。 % % ⚠️ 所有字号必须用 bp,不能用默认 pt:Word 的 pt 是 PostScript point % (1/72 英寸),TeX 默认 pt 是 TeX point(1/72.27 英寸),大 0.36%。 -% 写 10.5 会排出 10.45(= 10.5 × 72/72.27),与原稿对不上。 +% 写 10.5 会排出 10.45(= 10.5 × 72/72.27),。 %====================================================================== \newcommand{\cal@ls}{\linespread{1}\relax} @@ -124,7 +123,7 @@ %====================================================================== % 4. 列的宽度模型 % -% 原 .doc tblGrid 七列(twips → mm): +% tblGrid 七列(twips → mm): % c1 周次 900 = 15.8750 mm % c2 日期 1449 = 25.5587 mm % c3 学时 1029 = 18.1504 mm @@ -141,7 +140,7 @@ % ⚠️⚠️ 列宽 = gridCol − 2×colsep − 线宽,不是"按竖线根数分摊"。 % tabularray 把边框线宽算进列宽里(相邻竖线中心距 = wd + 2×colsep % + 线宽)。按分摊算每列会窄 0.154mm,整表窄 0.47mm —— 这在 -% 试卷归档目录/ 里实测验证过,本包直接沿用正确式。 +% 试卷归档目录/ 里实际验证过,本包直接沿用正确式。 % % c1: 15.8750 − 3.8100 − 0.1764 = 11.8886 mm % c2: 25.5587 − 3.8100 − 0.1764 = 21.5723 mm @@ -177,11 +176,11 @@ % % ⚠️ 用 longtblr(可跨页),不用 tblr:本表 18 行、约 604mm 高, % 一页装不下(版心高 297 − 2×25.40 = 246.2 mm),必然跨两页。 -% 原 .doc 也是 2 页。 +% 也是 2 页。 % % ⚠️ 行高用**显式的 ht**(见 §5b),不用 rowsep / strut。 % -% ⚠️ 不设 head/foot 重复表头:原 .doc 跨页时**不重复表头** +% ⚠️ 不设 head/foot 重复表头:跨页时**不重复表头** % (P2 顶部直接从第六周续排),故保持一致。 % % ⚠️ colspec 必须字面写在环境里,不能先存宏再展开 —— tabularray @@ -196,7 +195,7 @@ Q[l,t,wd=18.2915mm]}, colsep=1.905mm, rowsep=0pt, stretch=0, hline{1-Z}={\calrule}, vline{1-Z}={\calrule}, - % ---- 逐行行高:ht = 内容行数 × 23pt(详见 §5b 的推导与实测表)---- + % ---- 逐行行高:ht = 内容行数 × 23pt(见 §5b)---- row{1}={ht=115.50pt}, % 表头 5 行(c7 折成 5 行) row{2}={ht= 69.00pt}, % 第一周 3 行 row{3}={ht= 46.00pt}, % 第二周 2 行 @@ -219,64 +218,35 @@ \end{longtblr}\par\endgroup} %====================================================================== -% 5b. 行高为什么是这些数 —— 实测推导 +% 5b. 行高 % -% 原 .doc 的表格段落有两种行距来源,**混用**: -% · 表头 7 格 + 第 3~18 行:w:line=460 lineRule=exact ⇒ 23.00 pt -% · 第 2 行(第一周):段落没写 w:spacing,随 docGrid -% (docGrid linePitch=312 twips)⇒ 15.60 pt -% 并且**每个单元格都多带一个空段落**(Word 表格格的固有尾巴), -% 故任何一行最少 2 行。 +% 单行行距 23.00pt。表格每行的实际高度 = 整数行数 × 23pt + 0.5pt 边框。 +% 常见的行数与对应高度: +% 2 行 → 46.5pt 3 行 → 69.5pt +% 4 行 → 92.5pt 5 行 → 115.5pt % -% 于是原稿每行的真实高度 = 整数行 × 行距 + 0.5pt 边框线: -% 46.5 = 2×23 + 0.5 92.5 = 4×23 + 0.5 -% 69.5 = 3×23 + 0.5 115.5 = 5×23 + 0.5 -% 47.3 = 3×15.6 + 0.5 ← 只有第一周是 15.6 +% ht 取「(行数 − 1) × 23pt」,tabularray 会自行加上内容首行与边框, +% 最终高度与上表一致。 % -% 原稿 18 行实测(pymupdf 读横线,见 README): -% 115.5 47.3 46.5 92.5 115.5 69.5 46.94 92.5 -% 46.5 ×9 69.5 +% ⚠️ 不用 rowsep:自动折行的行间距会被 xeCJK 的 \CJKglue 与 \lineskip +% 扰动,不是线性的,单一 padding 无法同时满足 1/2/4/5 行。 % -% ⇒ 本包把 ht 设成「(行数 − 1) × 23」,让 tabularray 自己加上内容 -% 首行与边框线 —— 实测加上后正好等于上表,误差 ≤ 0.5pt。 +% ⚠️ 不用 \rule 做 strut:h = 23pt 超过 \baselineskip 22.9pt 会触发 +% \lineskip,每行多 1pt,且首行基线会跑到表格顶线上方。 % -% ⚠️ 为什么不用 rowsep: -% 实测 rowsep=6.6pt 时 1 行格 23.0、2 行格 **39.3**,斜率 16.4 而非 -% 23 —— 自动折行的行间距离被 xeCJK 的 \CJKglue 与 \lineskip 扰动, -% 不是线性的,无法用单一 padding 同时满足 1/2/4/5 行。 -% -% ⚠️ 为什么不用 \rule[−d]{0pt}{h} 的 strut: -% h = 23pt 超过 \baselineskip 22.9pt 会触发 \lineskip,每行再多 1pt, -% 且首行基线会跑到表格顶线**上方**(实测表头第一个字压到框外)。 -% -% ⚠️ 为什么不复制第一周的 15.6pt 行距: -% 那是原件的疏漏(同一张表里 17 行 23pt、1 行 15.6pt)。本模板全表 -% 统一 23pt,该行比原稿高 22.2pt(69.5 而原 47.3)。 -% -% ⇒ 后果:表格总高 1132.3pt,版心只有 246.2mm×2 = 1395pt,本应够, -% 但加上表头前的抬头(216pt)与签字栏,最终排出 3 页(原稿 2 页)。 -% 这是**有意取舍**:保真列宽/字号/行距,但不复制原件的疏漏。 -% 理由记在 README「原件的不一致之处」第 1 条;页面数差异也记在那里。 -% -% ⇒ 若你确实要压回 2 页,有两条路: -% · 把这一行的 3 个段落合并成自动折行(\calfall 系列宏对 \par -% 分段无效,只对自动折行有效,详见 §6 末尾的实测说明); -% · 或把 row{2} 的 ht 改成 24.30pt 并给该行单独换 15.6pt 行距的字号 -% 命令 —— 但那样等于把一个已知的疏漏重新引入。 -% -% ⚠️ ht 是**最小**高度:内容多了会顶高、少了不会压缩。故上面 18 个 -% 行数必须与 .tex 里每行的实际内容对得上。改了字号或列宽导致折行 -% 数变化时,ht 要跟着改(README 有一节讲怎么重新标定)。 +% ⚠️ ht 是最小高度:内容多了会顶高,少了不压缩。故各行行数必须与 +% .tex 里该行的实际内容对得上。改字号或列宽导致折行数变化时, +% ht 要跟着改(README 有重新标定的方法)。 %====================================================================== \newcommand{\calrowsep}{0pt} % 保留名字,向后兼容(本包不用它) %====================================================================== % 6. 单元格内容包装 % -% 对齐方式照原 .doc: +% 对齐方式照: % · 表头 7 格全部 jc=center % · 周次列:前 10 行 jc=left,第 11~16 行 jc=center(原件就不统一, -% 照抄;见 README「原件的不一致之处」) +% 照抄;见 README「已知差异」) % · 其余各列 jc=left % · 垂直对齐:表头与周次/日期/学时/教学方式为 vAlign=center, % 教学内容/课堂讨论/课下作业为 vAlign=top @@ -290,7 +260,7 @@ %---------------------------------------------------------------------- -% ⚠️ 表头**不加粗**:原 .doc 表头格只有 jc=center,没有 。 +% ⚠️ 表头**不加粗**:表头格只有 jc=center,没有 。 % 视觉上表头看起来醒目,是因为表头行高、字号与正文相同、且居中, % 并非加粗。照抄原件,不加粗。 % (\calhead 保留 \bfseries 的开关能力,但实际不启用 —— 若你想 @@ -306,7 +276,7 @@ % ⚠️⚠️ \leftskip 会与 geometry 的 left 边距**叠加**,不是覆盖。 % 初版取 15.875mm 时,段落实际起点 = 15.787 + 15.875 = 31.662mm, % 比目标 31.75mm 左移 0.088mm。更要命的是它让所有"按原版心再 -% 做负缩进"的段落全部错位(【开课单位】一行实测偏右 16.3pt)。 +% 做负缩进"的段落全部错位(【开课单位】一行实际偏右 16.3pt)。 % % ⇒ \leftskip 必须取 31.75 − 15.787 = 15.963mm,段落起点才回到 % 原版心的 31.75mm。此时行宽 = 174.80 − 15.963 − 12.25 = 146.587mm, @@ -332,14 +302,14 @@ %====================================================================== % 8. 表头两格的折行 % -% 原 .doc 的表头第 6、7 格各是**两个段落**: +% 的表头第 6、7 格各是**两个段落**: % c6: 「课堂讨论内容及」+「其它教学环节」 % c7: 「课下作业及课后必读」+「教材或参考书章节」 % 但 PDF 里它们分别显示成 4 行与 5 行 —— 说明每个段落都在格内 % **又自动折行**了一次(c6: 2+2,c7: 2+3)。 % % ⇒ 本包源码里把整句直接写进一格,由 tabularray 按列宽自动折行, -% 不插 \par。实测列宽下 c6 折成 4 行、c7 折成 5 行,与原稿一致, +% 不插 \par。实际列宽下 c6 折成 4 行、c7 折成 5 行,, % 表头行高 115.5pt = 5×23pt 就是这么来的。 % % ⚠️ 若改了字号或列宽导致折行数变化,表头行高会跟着变 —— 这是 @@ -365,12 +335,12 @@ %====================================================================== % 10. 表格跨页 % -% 原 .doc 在「第六周」这一行中间分页(P1 底 752.84pt / P2 顶 72.24pt), +% 在「第六周」这一行中间分页(P1 底 752.84pt / P2 顶 72.24pt), % 该行被切成两半,**没有任何跨页提示**。 % % ⇒ 本模板不强行复刻这个断点(断点位置取决于运行环境的行高取整, % 不可靠)。改为让 longtblr 自然跨页,并在表格后留出签字栏的 -% 固定距离。实测本模板自然跨页后同样是 2 页。 +% 固定距离。实际本模板自然跨页后同样是 2 页。 % % 若需要断在特定行,在该行前插 % \SetTblrTemplate{...} diff --git a/课程教学日历/课程教学日历.tex b/课程教学日历/课程教学日历.tex index ada25d4..58cb994 100644 --- a/课程教学日历/课程教学日历.tex +++ b/课程教学日历/课程教学日历.tex @@ -6,11 +6,11 @@ % 这是学校下发的**通用空白表**(附件3),本模板只复刻版式。 % % ⚠️ 模板里的课程信息、周次、日期、教学内容**全部是虚构占位**, -% 与原 .doc 里的真实课程无关。填自己的课时请改【第 1 节】与表格。 +% 与里的真实课程无关。填自己的课时请改【第 1 节】与表格。 % % 版式来源:学校下发的《附件3:中国海洋大学课程教学日历(理论课程)》.doc % -% 与原 .doc 的差异(有意为之): +% 与的差异(有意为之): % · 原字体「宋体 + Times New Roman」换成 OUC Serif + TeX Gyre Termes % (全部开源可商用,字宽逐字相同) % · 纸张、页边距、表宽、列宽、字号、行距、对齐一律照原值 @@ -43,18 +43,17 @@ %====================================================================== % 【第 2 节】表格上方的抬头 % -% ⚠️ 下面每个 \calskip{} 的数值都是**实测标定**的结果,不是估的。 -% 原 .doc 只有「460 twips 固定行距」,段与段之间没有段前/段后间距, -% 段距完全由行盒的 ascent/descent 自然堆出来。TeX 的行盒模型与之 -% 不同(同样是单行段落,TeX 的盒子比 Word 矮),所以逐段补差。 +% ⚠️ 下面每个 \calskip{} 的数值都是标定值。 % -% 标定方法:分别导出原稿与本版的 PDF,用 pymupdf 读每个 span 的 -% origin[1](基线 y,原点在左上),逐段比对差值,把差值直接加到 +% 正文用 460 twips 固定行距,段与段之间没有段前/段后间距,段距完全 +% 由行盒的 ascent/descent 堆出来。TeX 的行盒模型与之不同(同样单行 +% 段落,TeX 的盒子更矮),故逐段补差。 +% +% 调整方法:导出 PDF 后读每行基线 y,与目标位置逐段比对,把差值加到 % 对应的 \calskip 上。响应是线性的,一轮即收敛。 -% 实测数据见 README「纵向实测校验」。 %====================================================================== \begin{caloutside} -\calskip{-4.330mm} % 顶端补偿:原稿首行基线距版心顶 20.69pt +\calskip{-4.330mm} % 顶端补偿:首行基线距版心顶 20.69pt \calfontA\bfseries \calcno:\par \calskip{2.894mm} {\calfontA\bfseries \centering 中国海洋大学 \calcname 课程教学日历(理论课程)\par} @@ -65,14 +64,14 @@ %---- 课程信息:两行 ---- % ⚠️ 原件这两段带 w:ind left="-540"(−9.525mm) firstLine="210"(+3.704mm), % 相对原版心 31.75mm 的净起点 = 31.75 − 9.525 + 3.704 = 25.929mm -% = 73.48pt,与原稿实测 x=73.44pt 吻合。 +% = 73.48pt,与实际x=73.44pt 吻合。 % caloutside 已把段落起点放回 31.75mm,故此处只需再左移 5.821mm。 % % ⚠️ 两行之间用 \newline 而不是 \par —— 这是关键。 % 原件的两行是 460 twips 固定行距、段距 0,基线相差 23.04pt。 % 若用 \par 分成两段,**\baselineskip 不跨段落**,两段的间距变成 % 「上段末行深度 + \parskip(0) + 下段首行高度」≈ 20.9pt,短 2.1pt, -% 而且这个缺口**补不上**:实测 \vspace*{-2.11pt} 与 \calskip{-0.734mm} +% 而且这个缺口**补不上**:实际\vspace*{-2.11pt} 与 \calskip{-0.734mm} % 都会被 TeX 在 \par 处丢弃(负的垂直胶不能压缩已有间距)。 % \newline 让两行落在同一段落里,\baselineskip = 23bp 直接生效。 \calfontC @@ -94,7 +93,7 @@ % \calweek{第X周} & \caldate{日期} & \calhourn{学时} & 教学内容 & 教学方式 & 课堂讨论/其它环节 & 课下作业/必读章节 \\ % % · 周次列前 10 行原件是左对齐、第 11 行起居中 —— 照抄原件这个不一致 -% (见 README「原件的不一致之处」)。若想全列统一,把 \calctr 换 \calcell。 +% (见 README「已知差异」)。若想全列统一,把 \calctr 换 \calcell。 % · 空格用 \\ 前的最后一个 & 结束;内容为空就留空。 %====================================================================== \begin{caltable} @@ -108,9 +107,9 @@ % docGrid(linePitch=312 twips)排,行距 15.6pt,而其余 17 行都是 % 23pt。**本模板不复制这个不一致**,全表统一 23pt。 % -% 后果:这一行比原稿高 22.2pt(69.5 → 46.5),总高多 22pt,表格 +% 后果:这一行比常规高 22.2pt(69.5 → 46.5),总高多 22pt,表格 % 从 2 页变 3 页。这是有意取舍 —— 保真版式的同时不复制原件的疏漏, -% 理由记在 README「原件的不一致之处」第 1 条。 +% 理由记在 README「已知差异」第 1 条。 % (若你确实要 2 页,把这一行改成 \calfall 系列宏、并把 sty 里 % row{2} 的 ht 改回 24.30pt。注意 \calfall 对 \par 分段无效, % 只对自动折行有效,改之前先读 sty §6 的说明。) @@ -186,22 +185,22 @@ %====================================================================== % 【第 4 节】签字栏 % -% 原 .doc 的这两段(P008/P009): +% 的这两段(P008/P009): % 「院(系)负责人签字:」 w:ind firstLine=4515 firstLineChars=2150 % 「××××年 月 日」 无 ind,用空格顶到位置 % % firstLine = 4515 twips = 4515/1440×25.4 = 79.6396 mm % ⇒ 相对原版心左边界 31.75mm,起点 = 31.75 + 79.6396 = 111.3896 mm = 315.75 pt -% 原稿实测 x = 321.00pt —— 差 5.25pt,因为第一个字「院」的左边界 +% 实际x = 321.00pt —— 差 5.25pt,因为第一个字「院」的左边界 % 与盒子起点之间还有字形的左边距(word 的 4515 是"首行缩进",量的 -% 是盒子起点,不是字形起点)。故按实测 321.00pt 反解: +% 是盒子起点,不是字形起点)。故按实际321.00pt 反解: % 缩进 = 321.00 − (31.75mm→89.999pt) = 231.00 pt = 81.49 mm % % ⚠️ 两行的水平位置**不一样**: % 「院(系)」x=321.00 年份 x=352.50 % 原件第二行是用空格顶的(不是缩进),照抄即可。 % -% ⚠️ 第二行的三个锚点(逐字符实测原件 PDF,10.45pt 宋体): +% ⚠️ 第二行的三个锚点(逐字符实际原件 PDF,10.45pt 宋体): % 年字形 x = 355.08 月 x = 376.08 日 x = 397.08 % 年→月 21.00pt,月→日 21.00pt(都是一个全角字 + 10.55pt 空档) % @@ -213,7 +212,6 @@ % 这样打出来的表格与学校原表逐字对齐,手写填空处一目了然。 % % ⚠️ 不要用负 \hspace 去挪:它只能压缩后续间距,减到负数就是重叠。 -% (曾经为了塞进 \calgrade 占位符,用 \hspace{-8.35mm} 拽「月」, % 结果三个字叠成一个墨团。现已彻底去掉年份占位符,问题不存在了。) %====================================================================== \begin{caloutside}