清理代码库中的开发过程内容
- 删除 WORKFLOW.md(开发流程文档,已移入记忆库) - build.sh 去掉 WSL 相关说明 - 33 个源文件的注释:去掉踩坑记录、实测推导、原文件对比、工单号引用 - 保留技术参数、约束说明、命令含义 净删 399 行。全库 16/16 编译通过。
This commit is contained in:
-99
@@ -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
|
|
||||||
```
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# 在 WSL 内编译模板(WSL 原生版,无需 ssh/scp)
|
# 编译模板
|
||||||
#
|
|
||||||
# 这套仓库的全部工作都在 WSL 内完成:编辑、编译、查看、提交、提工单。
|
|
||||||
# Windows 侧只通过 \\wsl$\<发行版>\... 这个 UNC 路径读取文件(只读浏览)。
|
|
||||||
#
|
#
|
||||||
# 用法:
|
# 用法:
|
||||||
# bash build.sh 特殊事项说明表 # 编译该目录下默认主文件
|
# bash build.sh 特殊事项说明表 # 编译该目录下默认主文件
|
||||||
@@ -17,7 +14,7 @@
|
|||||||
# ⚠️ 三条务必注意
|
# ⚠️ 三条务必注意
|
||||||
#
|
#
|
||||||
# 1) **PDF 不要提交**。同源码编两次,页面一致但内嵌 CreationDate 不同,
|
# 1) **PDF 不要提交**。同源码编两次,页面一致但内嵌 CreationDate 不同,
|
||||||
# git 会认为文件变了(全库 13 个 PDF 全变 M)。提交前:
|
# git 会认为文件变了(全库 16 个 PDF 全变 M)。提交前:
|
||||||
# git checkout -- '*.pdf'
|
# git checkout -- '*.pdf'
|
||||||
# 或者用 git status 确认只 add 了源码。
|
# 或者用 git status 确认只 add 了源码。
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -223,10 +223,8 @@
|
|||||||
% 本来也没有大小写),而 \textsc{English} 里的西文仍然走 \setmainfont
|
% 本来也没有大小写),而 \textsc{English} 里的西文仍然走 \setmainfont
|
||||||
% 的 Termes 小型大写,行为正确。
|
% 的 Termes 小型大写,行为正确。
|
||||||
%
|
%
|
||||||
% 为什么不写 SmallCapsFont —— 这里踩了整整一轮坑,结论留下免得重来:
|
|
||||||
%
|
%
|
||||||
% 1) SmallCapsFont 这个选项**与本文件上面的 ItalicFeatures /
|
% 1) SmallCapsFont 这个选项**与本文件上面的 ItalicFeatures /
|
||||||
% BoldItalicFeatures 互斥**。最小复现实测:
|
|
||||||
% 只有 SmallCapsFont + SmallCapsFeatures → 通过
|
% 只有 SmallCapsFont + SmallCapsFeatures → 通过
|
||||||
% 再加 ItalicFeatures(带跨目录 Path) → 立刻报
|
% 再加 ItalicFeatures(带跨目录 Path) → 立刻报
|
||||||
% Package fontspec Error:
|
% Package fontspec Error:
|
||||||
@@ -306,11 +304,11 @@
|
|||||||
]{ZhuqueFangsong}
|
]{ZhuqueFangsong}
|
||||||
\def\fangsong{\CJKfamily{OUCFang}}
|
\def\fangsong{\CJKfamily{OUCFang}}
|
||||||
|
|
||||||
% 西文:显式取 Times 形态(原模板里 \tnr / \tnrb / \sunfont 的替代)
|
% 西文:显式取 Times 形态
|
||||||
%
|
%
|
||||||
% ⚠️ 四个档位必须全给。只给 UprightFont 的话,在 \bfseries 环境里会落到
|
% ⚠️ 四个档位必须全给。只给 UprightFont 的话,在 \bfseries 环境里会落到
|
||||||
% "Font shape `TU/texgyretermes/b/n' undefined" 并静默替换,
|
% "Font shape `TU/texgyretermes/b/n' undefined" 并静默替换,
|
||||||
% 表现为加粗失效(试卷的 \TNRB 与 \qnum 都会踩到)。
|
% 表现为加粗失效(试卷的 \TNRB 与 \qnum 需要用到)。
|
||||||
\newfontfamily\tnr{texgyretermes}[
|
\newfontfamily\tnr{texgyretermes}[
|
||||||
Extension = .otf,
|
Extension = .otf,
|
||||||
Path = ../fonts/tex-gyre-termes/,
|
Path = ../fonts/tex-gyre-termes/,
|
||||||
@@ -381,7 +379,7 @@
|
|||||||
%
|
%
|
||||||
% 这里不全局改 \linespread,因为各模板需求不同(科技报告依赖 ctex
|
% 这里不全局改 \linespread,因为各模板需求不同(科技报告依赖 ctex
|
||||||
% 默认值,试卷归档封面/课程执行大纲/年度考核登记表必须归 1 才能
|
% 默认值,试卷归档封面/课程执行大纲/年度考核登记表必须归 1 才能
|
||||||
% 还原 docx 的精确行高)。只提供工具命令,由各模板自行调用。
|
% 还的精确行高)。只提供工具命令,由各模板自行调用。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\ouclinespread}[1]{\linespread{#1}\relax}
|
\newcommand{\ouclinespread}[1]{\linespread{#1}\relax}
|
||||||
|
|
||||||
|
|||||||
+19
-21
@@ -17,12 +17,12 @@
|
|||||||
\RequirePackage{xeCJK}
|
\RequirePackage{xeCJK}
|
||||||
\RequirePackage{tabularray}
|
\RequirePackage{tabularray}
|
||||||
% 注:不再需要 graphicx。早期版本用 \rotatebox 做「其他费用」竖排,
|
% 注:不再需要 graphicx。早期版本用 \rotatebox 做「其他费用」竖排,
|
||||||
% 现已改为 \shortstack 逐字竖排(#24 按用户意见修正),不再依赖 graphicx。
|
% 现已改为 \shortstack 逐字竖排(修正),不再依赖 graphicx。
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面
|
% 1. 页面
|
||||||
%
|
%
|
||||||
% 原 docx sectPr 实测(11906 x 16838 twips):
|
% sectPr (11906 x 16838 twips):
|
||||||
% 宽 210.01 mm 高 297.00 mm ← 标准 A4
|
% 宽 210.01 mm 高 297.00 mm ← 标准 A4
|
||||||
% top 2155 twips = 38.01 mm
|
% top 2155 twips = 38.01 mm
|
||||||
% bottom 1985 twips = 35.01 mm
|
% bottom 1985 twips = 35.01 mm
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
%
|
%
|
||||||
% ⚠️ 版心宽 = 210 - 28.01 - 26.00 = 155.99 mm
|
% ⚠️ 版心宽 = 210 - 28.01 - 26.00 = 155.99 mm
|
||||||
% 而原表宽 169.12 mm,**超宽 13.12 mm**。
|
% 而原表宽 169.12 mm,**超宽 13.12 mm**。
|
||||||
% 原 docx 用 tblLayout=fixed 硬撑,实际会压进右侧页边距。
|
% 用 tblLayout=fixed 硬撑,实际会压进右侧页边距。
|
||||||
% ⇒ 本包把表格等比缩到 155.99 mm(系数 0.9224),
|
% ⇒ 本包把表格等比缩到 155.99 mm(系数 0.9224),
|
||||||
% 列宽按比例重算,见第 3 节。这是唯一一处主动偏离原文件的地方。
|
% 列宽按比例重算,见第 3 节。这是唯一一处主动偏离原文件的地方。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -53,15 +53,15 @@
|
|||||||
}
|
}
|
||||||
\setlength{\parindent}{0pt}
|
\setlength{\parindent}{0pt}
|
||||||
\setlength{\parskip}{0pt}
|
\setlength{\parskip}{0pt}
|
||||||
\pagestyle{empty} % 原 docx 无页眉页脚页码
|
\pagestyle{empty} % 无页眉页脚页码
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 2. 字体
|
% 2. 字体
|
||||||
%
|
%
|
||||||
% 原 docx 用宋体 / 黑体。仓库规矩(#17):不用商业字体,
|
% 用宋体 / 黑体。仓库规矩:不用商业字体,
|
||||||
% 全部取自公共字体包 ../fonts.tex。
|
% 全部取自公共字体包 ../fonts.tex。
|
||||||
%
|
%
|
||||||
% ⚠️ 原表字号分布实测:
|
% ⚠️ 原表字号分布
|
||||||
% 22pt ×1 —— 标题「中国海洋大学会议预算表」
|
% 22pt ×1 —— 标题「中国海洋大学会议预算表」
|
||||||
% 9pt ×47 —— 表格内全部文字 + 三条说明
|
% 9pt ×47 —— 表格内全部文字 + 三条说明
|
||||||
% 无 12pt 段落,与课程大纲那套不同,别照抄那边的字号命令。
|
% 无 12pt 段落,与课程大纲那套不同,别照抄那边的字号命令。
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 3. 表格列宽
|
% 3. 表格列宽
|
||||||
%
|
%
|
||||||
% 原 docx 网格(tblGrid,单位 twips):
|
% 网格(tblGrid,单位 twips):
|
||||||
% [424, 2054, 790, 1262, 2056, 209, 2793] 合计 9588
|
% [424, 2054, 790, 1262, 2056, 209, 2793] 合计 9588
|
||||||
% 换算 mm(×25.4/1440):
|
% 换算 mm(×25.4/1440):
|
||||||
% [7.48, 36.23, 13.93, 22.26, 36.27, 3.69, 49.27] 合计 169.12
|
% [7.48, 36.23, 13.93, 22.26, 36.27, 3.69, 49.27] 合计 169.12
|
||||||
@@ -92,19 +92,19 @@
|
|||||||
% ⚠️ 列定义**不能**放进宏再用 \OucMeetColspec 引用 —— tabularray 的
|
% ⚠️ 列定义**不能**放进宏再用 \OucMeetColspec 引用 —— tabularray 的
|
||||||
% colspec 解析器要求字面量,报
|
% colspec 解析器要求字面量,报
|
||||||
% Package tabularray Error: Unexpandable command ... inside Column type
|
% 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。
|
% 其余 27 行都没设 —— 行高由内容自然撑开,9pt 字约 4.5~5mm。
|
||||||
%
|
%
|
||||||
% 第一版我给所有行硬设 ht=7.4mm(自己拍的数),结果:
|
% 第一版我给所有行硬设 ht=7.4mm(自己拍的数),结果:
|
||||||
% 28 × 7.4 = 207.2mm,加标题区约 30mm + 说明约 25mm = 262mm
|
% 28 × 7.4 = 207.2mm,加标题区约 30mm + 说明约 25mm = 262mm
|
||||||
% 而版心只有 224mm ⇒ **必然溢出一页**,说明文字被推到第 3 页。
|
% 而版心只有 224mm ⇒ **必然溢出一页**,说明文字被推到第 3 页。
|
||||||
%
|
%
|
||||||
% ⇒ 改为 row{2-Z} 不设 ht,让内容撑开(与原 docx 一致);
|
% ⇒ 改为 row{2-Z} 不设 ht,让内容撑开(与一致);
|
||||||
% 表头行(R6/R14 分节标题)和签署行(R26/R27)单独给最小高度,
|
% 表头行(R6/R14 分节标题)和签署行(R26/R27)单独给最小高度,
|
||||||
% 保证印章框有空间。
|
% 保证印章框有空间。
|
||||||
%
|
%
|
||||||
@@ -126,7 +126,6 @@
|
|||||||
% ! Illegal unit of measure (pt inserted.)
|
% ! Illegal unit of measure (pt inserted.)
|
||||||
% \__dim_eval_end:
|
% \__dim_eval_end:
|
||||||
% 且**全部错误都定位到 \end{tblr}**,根本看不出是哪个格。
|
% 且**全部错误都定位到 \end{tblr}**,根本看不出是哪个格。
|
||||||
% 最小复现(已验证):
|
|
||||||
% \begin{tblr}{colspec={Q[c,m,wd=21mm] ...7列..., colsep=0.8mm}}
|
% \begin{tblr}{colspec={Q[c,m,wd=21mm] ...7列..., colsep=0.8mm}}
|
||||||
% \SetCell[c=2]{c} A & \SetCell[c=5]{l} B \\
|
% \SetCell[c=2]{c} A & \SetCell[c=5]{l} B \\
|
||||||
% \end{tblr}
|
% \end{tblr}
|
||||||
@@ -136,7 +135,7 @@
|
|||||||
% cell{行}{列}={c=n}{对齐}
|
% 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} 声明纵向合并,
|
% 写法:cell{21}{1}={r=5}{c} 声明纵向合并,
|
||||||
% 内容用 \shortstack{其\\他\\费\\用} 逐字堆叠。
|
% 内容用 \shortstack{其\\他\\费\\用} 逐字堆叠。
|
||||||
% ⚠️ 不能用 \rotatebox{90} —— 那只是把整行文字旋转,
|
% ⚠️ 不能用 \rotatebox{90} —— 那只是把整行文字旋转,
|
||||||
% 仍然是"横向一句转个角度",不是你要的上下排列(#24 修正)。
|
% 仍然是"横向一句转个角度",不是你要的上下排列(修正)。
|
||||||
% ⚠️ 纵向合并也必须用 cell{} 矩阵语法。写成 \SetCell[r=5] 在
|
% ⚠️ 纵向合并也必须用 cell{} 矩阵语法。写成 \SetCell[r=5] 在
|
||||||
% 内容里,会与同行的 \SetCell[c=n] 冲突报 Missing number。
|
% 内容里,会与同行的 \SetCell[c=n] 冲突报 Missing number。
|
||||||
cell{21}{1}={r=5}{c},
|
cell{21}{1}={r=5}{c},
|
||||||
@@ -203,7 +202,7 @@
|
|||||||
% ⚠️⚠️ 为什么把签字栏从主表里拆出来
|
% ⚠️⚠️ 为什么把签字栏从主表里拆出来
|
||||||
%
|
%
|
||||||
% 主表 R27/R28(意见+签字)无论怎么调都无法同时满足"不多列"和
|
% 主表 R27/R28(意见+签字)无论怎么调都无法同时满足"不多列"和
|
||||||
% "内容不丢失"。实测四种组合全失败:
|
% "内容不丢失"。实际四种组合全失败:
|
||||||
% 内容 8 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)
|
% 内容 8 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)
|
||||||
% 内容 7 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)
|
% 内容 7 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)
|
||||||
% 内容 2 段 + cell{27}{4}={c=4} → 列数对,但第 2 段内容被合并盖住消失
|
% 内容 2 段 + cell{27}{4}={c=4} → 列数对,但第 2 段内容被合并盖住消失
|
||||||
@@ -238,7 +237,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 6. 标题与页首
|
% 6. 标题与页首
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 左上角「附件1」小字(原 docx 无字号设置,随正文 9pt)
|
% 左上角「附件1」小字(无字号设置,随正文 9pt)
|
||||||
\newcommand{\oucmeetattach}[1]{%
|
\newcommand{\oucmeetattach}[1]{%
|
||||||
\par\noindent{\Mn #1}\par\vspace*{4bp}}
|
\par\noindent{\Mn #1}\par\vspace*{4bp}}
|
||||||
|
|
||||||
@@ -248,16 +247,16 @@
|
|||||||
\vspace*{8bp}}
|
\vspace*{8bp}}
|
||||||
|
|
||||||
% 填表日期 / 金额单位 那一行(左右分列,中间留白)
|
% 填表日期 / 金额单位 那一行(左右分列,中间留白)
|
||||||
% 原 docx 用一串空格撑开,这里用 \hfill 更稳
|
% 用一串空格撑开,这里用 \hfill 更稳
|
||||||
\newcommand{\oucmeetdateline}[1]{%
|
\newcommand{\oucmeetdateline}[1]{%
|
||||||
\par\noindent{\Mn #1}\par\vspace*{4bp}}
|
\par\noindent{\Mn #1}\par\vspace*{4bp}}
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 6. 表尾说明
|
% 6. 表尾说明
|
||||||
%
|
%
|
||||||
% ⚠️ 悬挂缩进不能用 \leftmargin=2em —— 实测报
|
% ⚠️ 悬挂缩进不能用 \leftmargin=2em —— 实际报
|
||||||
% Overfull \hbox (26.71pt too wide)
|
% Overfull \hbox (26.71pt too wide)
|
||||||
% 因为「1、」「2、」是**全角字符 + 顿号**,9pt 下实测宽约 2.4em,
|
% 因为「1、」「2、」是**全角字符 + 顿号**,9pt 下实际宽约 2.4em,
|
||||||
% 比 2em 宽,标签凸出到左边界外。⇒ \labelwidth 要给足 2.5em。
|
% 比 2em 宽,标签凸出到左边界外。⇒ \labelwidth 要给足 2.5em。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ \itemindent 不能设负值!
|
% ⚠️⚠️ \itemindent 不能设负值!
|
||||||
@@ -276,7 +275,6 @@
|
|||||||
% 单条说明
|
% 单条说明
|
||||||
%
|
%
|
||||||
% ⚠️ 为什么不用 list 环境:list 的 \leftmargin / \itemindent 组合极易
|
% ⚠️ 为什么不用 list 环境:list 的 \leftmargin / \itemindent 组合极易
|
||||||
% 把内容推出边界,而且**不报 Overfull**(踩过一次,文字跑到版心
|
|
||||||
% 左外 13.45bp,日志里只有个无关的 5.1pt)。
|
% 左外 13.45bp,日志里只有个无关的 5.1pt)。
|
||||||
%
|
%
|
||||||
% ⚠️ 也不要用 \hangindent 悬挂缩进。「2、」后面直接接正文,续行不需要
|
% ⚠️ 也不要用 \hangindent 悬挂缩进。「2、」后面直接接正文,续行不需要
|
||||||
@@ -285,7 +283,7 @@
|
|||||||
% ⇒ 就是普通的 \noindent + 段落,什么都不设。
|
% ⇒ 就是普通的 \noindent + 段落,什么都不设。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ \tolerance / \emergencystretch 必须在**段落开始前**设置。
|
% ⚠️⚠️ \tolerance / \emergencystretch 必须在**段落开始前**设置。
|
||||||
% 写成 `\noindent` 之后再改无效(\noindent 已开段落,实测 5.1pt
|
% 写成 `\noindent` 之后再改无效(\noindent 已开段落, 5.1pt
|
||||||
% 的 Overfull 纹丝不动)。
|
% 的 Overfull 纹丝不动)。
|
||||||
% ⇒ 这里用 \sloppy,它在内部改 \tolerance 和 \emergencystretch,
|
% ⇒ 这里用 \sloppy,它在内部改 \tolerance 和 \emergencystretch,
|
||||||
% 且必须在 \par 之前调用 —— 下面 #1#2 之前就调了,有效。
|
% 且必须在 \par 之前调用 —— 下面 #1#2 之前就调了,有效。
|
||||||
|
|||||||
+12
-17
@@ -10,7 +10,6 @@
|
|||||||
% ⚠️⚠️ 本文件的表格**只写内容,不写任何 \SetCell**。
|
% ⚠️⚠️ 本文件的表格**只写内容,不写任何 \SetCell**。
|
||||||
% 所有合并规则都在 oucmeeting.sty 的 oucmeettable 环境里,
|
% 所有合并规则都在 oucmeeting.sty 的 oucmeettable 环境里,
|
||||||
% 用 cell{行}{列}={c=n}{对齐} 矩阵式声明。
|
% 用 cell{行}{列}={c=n}{对齐} 矩阵式声明。
|
||||||
% 原因(踩了两小时):在这套 7 列 Q[c,m,wd=…] + colsep 配置下,
|
|
||||||
% 一写 \SetCell 就报一串 Missing number,且错误全指向 \end{tblr}。
|
% 一写 \SetCell 就报一串 Missing number,且错误全指向 \end{tblr}。
|
||||||
% 详见 sty 第 4 节的记录。
|
% 详见 sty 第 4 节的记录。
|
||||||
%
|
%
|
||||||
@@ -62,7 +61,6 @@
|
|||||||
% ---- R1~R6 基本信息 ----
|
% ---- R1~R6 基本信息 ----
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 每行必须写满 7 段(6 个 `&`),被 cell{} 合并掉的格**留空**。
|
% ⚠️⚠️ 每行必须写满 7 段(6 个 `&`),被 cell{} 合并掉的格**留空**。
|
||||||
% 实测(最小复现):同样的 cell{} 配置下
|
|
||||||
% 写 7 段 `甲 & & 乙 & & 丙 & & 丁` → 四个字全部正确
|
% 写 7 段 `甲 & & 乙 & & 丙 & & 丁` → 四个字全部正确
|
||||||
% 写 4 段 `甲 & 乙 & 丙 & 丁` → **乙、丁 被吞掉**
|
% 写 4 段 `甲 & 乙 & 丙 & 丁` → **乙、丁 被吞掉**
|
||||||
% ⇒ 段数 ≠ 列数时,多出来的内容会静默丢失,不报错。
|
% ⇒ 段数 ≠ 列数时,多出来的内容会静默丢失,不报错。
|
||||||
@@ -71,12 +69,11 @@
|
|||||||
% R2 的 cell 配置是 2+2+2+1,即
|
% R2 的 cell 配置是 2+2+2+1,即
|
||||||
% 格1(列1-2)=会议时间 格3(列3-4)=空值 格5(列5-6)=会议地点 格7(列7)=空值
|
% 格1(列1-2)=会议时间 格3(列3-4)=空值 格5(列5-6)=会议地点 格7(列7)=空值
|
||||||
% 所以「会议地点」必须写在**第 5 段**,写在第 3 段就会挤到左边、
|
% 所以「会议地点」必须写在**第 5 段**,写在第 3 段就会挤到左边、
|
||||||
% 与「会议时间」贴在一起(踩过)。
|
|
||||||
会议名称 & & & & & & \\
|
会议名称 & & & & & & \\
|
||||||
会议时间 & & & & 会议地点 & & \\
|
会议时间 & & & & 会议地点 & & \\
|
||||||
% ⚠️ R3/R4 的填空横线用 \hspace 撑,宽度必须控制。
|
% ⚠️ R3/R4 的填空横线用 \hspace 撑,宽度必须控制。
|
||||||
% 跨 5 列约 122mm,三个选项各带一对(\hspace{3em})就要 6×3em=18em
|
% 跨 5 列约 122mm,三个选项各带一对(\hspace{3em})就要 6×3em=18em
|
||||||
% 再加文字,实测撑到 529.7bp(版心止于 521.57),超 8bp。
|
% 再加文字,撑到 529.7bp(版心止于 521.57),超 8bp。
|
||||||
% ⇒ 单个填空收到 2.2em(约 7mm,手写两三个字够用)。
|
% ⇒ 单个填空收到 2.2em(约 7mm,手写两三个字够用)。
|
||||||
会议类型 & & 国内业务会议(\hspace*{2.2em})\hspace*{1em}%
|
会议类型 & & 国内业务会议(\hspace*{2.2em})\hspace*{1em}%
|
||||||
国内管理会议(\hspace*{2.2em})\hspace*{1em}%
|
国内管理会议(\hspace*{2.2em})\hspace*{1em}%
|
||||||
@@ -109,24 +106,23 @@
|
|||||||
% 纵向合并由 sty 里的 cell{21}{1}={r=5}{c} 声明,
|
% 纵向合并由 sty 里的 cell{21}{1}={r=5}{c} 声明,
|
||||||
% 这里用 \shortstack 让四个字上下堆叠。
|
% 这里用 \shortstack 让四个字上下堆叠。
|
||||||
% ⚠️ 不能用 \rotatebox{90}:那只是把横排整句转个角度,
|
% ⚠️ 不能用 \rotatebox{90}:那只是把横排整句转个角度,
|
||||||
% 不是"上下排列"(#24 按用户意见修正)。
|
% 不是"上下排列"(修正)。
|
||||||
% ⚠️ \shortstack 里的 \\ 是**普通换行**,tabularray 在 cell{} 语法下
|
% ⚠️ \shortstack 里的 \\ 是**普通换行**,tabularray 在 cell{} 语法下
|
||||||
% 不会把它误当行结束(旧版 \SetCell 语法下会崩,那是另一个坑)。
|
% 不会把它误当行结束(旧版 \SetCell 语法下会崩,那是另一个坑)。
|
||||||
%
|
%
|
||||||
% ★ 字距取 4bp:文字块约 56bp,格高 82bp → **上下各留 13bp**,
|
% ★ 字距取 4bp:文字块约 56bp,格高 82bp → **上下各留 13bp**,
|
||||||
% 既不贴格线,也能看出竖排拉开的效果。
|
% 既不贴格线,也能看出竖排拉开的效果。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 字距不能给太大,会顶到格线。实测(9pt 字、格高 82bp):
|
% ⚠️⚠️ 字距不能给太大,会顶到格线。(9pt 字、格高 82bp):
|
||||||
% \\[17bp] → 文字块 94bp,**比格高还高**,头尾字距格线只有
|
% \\[17bp] → 文字块 94bp,**比格高还高**,头尾字距格线只有
|
||||||
% 2.5bp,视觉上字和表格线连成一片(用户指出过)
|
|
||||||
% \\[8bp] → 文字块 67bp,上下各留 7.4bp ← 仍偏挤
|
% \\[8bp] → 文字块 67bp,上下各留 7.4bp ← 仍偏挤
|
||||||
% \\[4bp] → 文字块 56bp,上下各留 13bp ← 采用
|
% \\[4bp] → 文字块 56bp,上下各留 13bp ← 采用
|
||||||
% 不加参数 → 文字块 43bp,上下各留 19bp(字挤成一小团,不算竖排)
|
% 不加参数 → 文字块 43bp,上下各留 19bp(字挤成一小团,不算竖排)
|
||||||
%
|
%
|
||||||
% ⚠️ 不能靠局部设 \baselineskip —— \shortstack 内部会重置它,
|
% ⚠️ 不能靠局部设 \baselineskip —— \shortstack 内部会重置它,
|
||||||
% 实测设 19bp 无效(字距仍是 11.6bp)。必须在 \\ 上给可选参数。
|
% 实际设 19bp 无效(字距仍是 11.6bp)。必须在 \\ 上给可选参数。
|
||||||
% ⚠️ 也不能用 \parbox{}{其\\他\\费\\用} —— 会变成 4 个独立行盒子,
|
% ⚠️ 也不能用 \parbox{}{其\\他\\费\\用} —— 会变成 4 个独立行盒子,
|
||||||
% tabularray 排版错乱,四个字跑到不同段落(实测)。
|
% tabularray 排版错乱,四个字跑到不同段落(实际)。
|
||||||
\shortstack{其\\[4bp]他\\[4bp]费\\[4bp]用} & 交通费 & & & & & \\
|
\shortstack{其\\[4bp]他\\[4bp]费\\[4bp]用} & 交通费 & & & & & \\
|
||||||
& 会议资料印刷费 & & & & & \\
|
& 会议资料印刷费 & & & & & \\
|
||||||
& 会议室使用费 & & & & & \\
|
& 会议室使用费 & & & & & \\
|
||||||
@@ -138,8 +134,8 @@
|
|||||||
% R27~R28 意见与签字(跨 3+4)
|
% R27~R28 意见与签字(跨 3+4)
|
||||||
% ⚠️⚠️ 这里的 \hspace 会把**单元格撑宽,进而把表格右边框推出纸外**,
|
% ⚠️⚠️ 这里的 \hspace 会把**单元格撑宽,进而把表格右边框推出纸外**,
|
||||||
% 而且文字本身仍在版心内 —— 所以逐 span 查文字查不出来,
|
% 而且文字本身仍在版心内 —— 所以逐 span 查文字查不出来,
|
||||||
% 只有查竖线坐标才能发现(实测最右竖线跑到 526.40,版心止于 521.57)。
|
% 只有查竖线坐标才能发现(实际最右竖线跑到 526.40,版心止于 521.57)。
|
||||||
% 实测数据:\hspace*{7em} → 超 4.83bp;4.5em → 仍超 4.83bp(跨列宽度已定死,
|
% 实际数据:\hspace*{7em} → 超 4.83bp;4.5em → 仍超 4.83bp(跨列宽度已定死,
|
||||||
% hspace 只是让内容溢出单元格,不改列宽)。
|
% hspace 只是让内容溢出单元格,不改列宽)。
|
||||||
% ⇒ 该单元格内容必须能在一行内放下。「(签字) (盖章)」共 9 个全角字符
|
% ⇒ 该单元格内容必须能在一行内放下。「(签字) (盖章)」共 9 个全角字符
|
||||||
% ≈ 9×9bp = 81bp,跨 4 列约 96mm = 272bp,够放,只要 hspace 不太大。
|
% ≈ 9×9bp = 81bp,跨 4 列约 96mm = 272bp,够放,只要 hspace 不太大。
|
||||||
@@ -148,7 +144,7 @@
|
|||||||
% ⚠️ 关于「校级领导意见」:源 .doc 的 R26 第二格里确实有**两个段落** ——
|
% ⚠️ 关于「校级领导意见」:源 .doc 的 R26 第二格里确实有**两个段落** ——
|
||||||
% 「所在单位负责人意见:」和「校级领导意见:」,不是转换时多出来的
|
% 「所在单位负责人意见:」和「校级领导意见:」,不是转换时多出来的
|
||||||
% (用 LibreOffice 直接转 txt 核过,原文件就有)。
|
% (用 LibreOffice 直接转 txt 核过,原文件就有)。
|
||||||
% 但用户确认这份表不需要校级领导,故按用户意见删除。
|
% 但用户确认这份表不需要校级领导,故删除。
|
||||||
% ⚠️ 要恢复就把它加回来,且必须单独一行(源文件是两段,不是一行):
|
% ⚠️ 要恢复就把它加回来,且必须单独一行(源文件是两段,不是一行):
|
||||||
% 所在单位负责人意见:\\ 校级领导意见:
|
% 所在单位负责人意见:\\ 校级领导意见:
|
||||||
%
|
%
|
||||||
@@ -159,9 +155,8 @@
|
|||||||
%
|
%
|
||||||
% ⚠️⚠️ 为什么拆出去(很重要,别又改回主表里)
|
% ⚠️⚠️ 为什么拆出去(很重要,别又改回主表里)
|
||||||
%
|
%
|
||||||
% 这两行放在主表里,无论怎么写都会出问题。四种组合全部实测过:
|
% 这两行放在主表里,无论怎么写都会出问题。四种组合全部实际过:
|
||||||
% 内容 8 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)❌
|
% 内容 8 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)❌
|
||||||
% ← 用户指出的"多出一列"
|
|
||||||
% 内容 7 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)❌
|
% 内容 7 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)❌
|
||||||
% 内容 2 段 + cell{27}{4}={c=4} → 列数对了,但第 2 段落进第 2 列
|
% 内容 2 段 + cell{27}{4}={c=4} → 列数对了,但第 2 段落进第 2 列
|
||||||
% 被 c=4 的合并盖住,内容消失 ❌
|
% 被 c=4 的合并盖住,内容消失 ❌
|
||||||
@@ -180,14 +175,14 @@
|
|||||||
% 前 3 列 6.10+29.65+11.43 = 47.18mm(+colsep 4mm)
|
% 前 3 列 6.10+29.65+11.43 = 47.18mm(+colsep 4mm)
|
||||||
% 后 4 列 18.18+29.65+3.00+40.10 = 91.02mm(+colsep 4mm)
|
% 后 4 列 18.18+29.65+3.00+40.10 = 91.02mm(+colsep 4mm)
|
||||||
% ⚠️ 两列各自的 colsep 各算 2 个(左右各 1),所以实际宽度 = wd + 4mm
|
% ⚠️ 两列各自的 colsep 各算 2 个(左右各 1),所以实际宽度 = wd + 4mm
|
||||||
% ⚠️⚠️ 第 1 格不要用 \hfill 推「(签字)」到右边 —— 实测会溢出格子:
|
% ⚠️⚠️ 第 1 格不要用 \hfill 推「(签字)」到右边 —— 实际会溢出格子:
|
||||||
% 第 1 格宽 51.71mm=146bp,「(签字)」36bp,\hfill 推到格尾后
|
% 第 1 格宽 51.71mm=146bp,「(签字)」36bp,\hfill 推到格尾后
|
||||||
% 文字自身**超出单元格右边界**(tabularray 的格内容不自动裁剪),
|
% 文字自身**超出单元格右边界**(tabularray 的格内容不自动裁剪),
|
||||||
% 结果第一个「(签字)」跑到 199~265,跨过 232 的分界线,
|
% 结果第一个「(签字)」跑到 199~265,跨过 232 的分界线,
|
||||||
% 和第二个「(签字)」在 pymupdf 里连成一串(看着像只有一个)。
|
% 和第二个「(签字)」连成一串(看着像只有一个)。
|
||||||
% ⇒ 直接顶着格左边界排,前面补一点 \hspace 抵消全角括号的字形左空白。
|
% ⇒ 直接顶着格左边界排,前面补一点 \hspace 抵消全角括号的字形左空白。
|
||||||
% (全角「(」的 ink 起点比盒起点靠左约 2.5bp,不加会略微超出
|
% (全角「(」的 ink 起点比盒起点靠左约 2.5bp,不加会略微超出
|
||||||
% 版心左界 79.40 —— 实测 x=76.9)
|
% 版心左界 79.40 —— 实际x=76.9)
|
||||||
\begin{oucmeetsign}
|
\begin{oucmeetsign}
|
||||||
经费(项目)负责人意见: & 所在单位负责人意见: \\
|
经费(项目)负责人意见: & 所在单位负责人意见: \\
|
||||||
\hspace*{1mm}(签字) & \hspace*{1mm}(签字)\hspace*{5em}(盖章) \\
|
\hspace*{1mm}(签字) & \hspace*{1mm}(签字)\hspace*{5em}(盖章) \\
|
||||||
|
|||||||
+16
-18
@@ -2,7 +2,7 @@
|
|||||||
% ouclw.sty — 中国海洋大学 劳务发放说明表 版式包
|
% ouclw.sty — 中国海洋大学 劳务发放说明表 版式包
|
||||||
%
|
%
|
||||||
% 依据:实验室管理/劳务补贴/劳务发放说明表.docx(Word 2007+ 保存)
|
% 依据:实验室管理/劳务补贴/劳务发放说明表.docx(Word 2007+ 保存)
|
||||||
% 目标:版式与原 docx 逐项对齐。所有尺寸都由 docx 内部数值换算:
|
% 目标:版式与逐项对齐。所有尺寸都由 docx 内部数值换算:
|
||||||
% twips → mm : mm = twips / 1440 * 25.4
|
% twips → mm : mm = twips / 1440 * 25.4
|
||||||
% twips → pt : pt = twips / 20 (1 pt = 1/72 in)
|
% twips → pt : pt = twips / 20 (1 pt = 1/72 in)
|
||||||
% w:sz : 半磅值,÷ 2 即 pt
|
% w:sz : 半磅值,÷ 2 即 pt
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面与版心
|
% 1. 页面与版心
|
||||||
%
|
%
|
||||||
% 原 docx sectPr:
|
% sectPr:
|
||||||
% pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4
|
% pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4
|
||||||
% pgMar top/bottom 1361 = 24.01 mm
|
% pgMar top/bottom 1361 = 24.01 mm
|
||||||
% left/right 1797 = 31.70 mm
|
% left/right 1797 = 31.70 mm
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
% 原表 tblW 8522 twips = 150.32 mm,比 docx 版心(146.68 mm)宽 3.71 mm。
|
% 原表 tblW 8522 twips = 150.32 mm,比 docx 版心(146.68 mm)宽 3.71 mm。
|
||||||
% docx 的 tblPr 里【没有 jc】,tblInd = 0 ⇒ Word 是按左对齐处理的:
|
% docx 的 tblPr 里【没有 jc】,tblInd = 0 ⇒ Word 是按左对齐处理的:
|
||||||
% 表从左边距 31.70 mm 起排,右端溢出到右侧页边距里 3.71 mm。
|
% 表从左边距 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)
|
% left = 31.70 mm (= docx pgMar left)
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
}
|
}
|
||||||
\setlength{\parindent}{0pt}
|
\setlength{\parindent}{0pt}
|
||||||
\setlength{\parskip}{0pt}
|
\setlength{\parskip}{0pt}
|
||||||
\pagestyle{empty} % 原 docx 无页眉页脚,故不排页码
|
\pagestyle{empty} % 无页眉页脚,故不排页码
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 2. 字体与字号
|
% 2. 字体与字号
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
% ⚠️⚠️⚠️【最要命的一条】ctex 默认 \linespread 约 1.3,会把
|
% ⚠️⚠️⚠️【最要命的一条】ctex 默认 \linespread 约 1.3,会把
|
||||||
% \fontsize{14}{15.6} 的 15.6pt 行距放大成 20.28pt!
|
% \fontsize{14}{15.6} 的 15.6pt 行距放大成 20.28pt!
|
||||||
%
|
%
|
||||||
% 实测:
|
%
|
||||||
% \fontsize{14}{15.6}\selectfont → \baselineskip = 20.28pt ✗
|
% \fontsize{14}{15.6}\selectfont → \baselineskip = 20.28pt ✗
|
||||||
% 加 \linespread{1} 之后 → \baselineskip = 15.60pt ✓
|
% 加 \linespread{1} 之后 → \baselineskip = 15.60pt ✓
|
||||||
%
|
%
|
||||||
@@ -85,7 +85,6 @@
|
|||||||
% 归 1。这一步不能省,也必须在 \AtBeginDocument 之后再设一次
|
% 归 1。这一步不能省,也必须在 \AtBeginDocument 之后再设一次
|
||||||
% (ctex 在 begin document 时会重设)。
|
% (ctex 在 begin document 时会重设)。
|
||||||
%
|
%
|
||||||
% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的
|
|
||||||
% SimSun / SimHei / FangSong + AutoFakeBold,换台机器(尤其 Linux/macOS)
|
% SimSun / SimHei / FangSong + AutoFakeBold,换台机器(尤其 Linux/macOS)
|
||||||
% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。
|
% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -106,7 +105,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 3. 列的宽度模型
|
% 3. 列的宽度模型
|
||||||
%
|
%
|
||||||
% 原 docx tblGrid(4 个网格列,twips → mm):
|
% tblGrid(4 个网格列,twips → mm):
|
||||||
% c1 1384 → 24.4122 c2 1418 → 25.0119
|
% c1 1384 → 24.4122 c2 1418 → 25.0119
|
||||||
% c3 2883 → 50.8529 c4 2837 → 50.0415
|
% c3 2883 → 50.8529 c4 2837 → 50.0415
|
||||||
% 合计 8522 twips = 150.3186 mm(与 tblW 一致)
|
% 合计 8522 twips = 150.3186 mm(与 tblW 一致)
|
||||||
@@ -134,11 +133,10 @@
|
|||||||
% wd = gridCol(mm) − 3.81 − 0.2204
|
% wd = gridCol(mm) − 3.81 − 0.2204
|
||||||
%
|
%
|
||||||
% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
|
% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
|
||||||
% 实测需再微调(见 3.2 的实测标定值),否则一直报
|
% 实际需再微调(见 3.2 的标定值),否则一直报
|
||||||
% “Table width is too small, need 0.45pt more!” 外加一条 Overfull \hbox。
|
% “Table width is too small, need 0.45pt more!” 外加一条 Overfull \hbox。
|
||||||
%
|
%
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% ⚠️ 两条通用结论(在 年度考核登记表/ 里踩过,这里同样适用):
|
|
||||||
%
|
%
|
||||||
% (a) 合并单元格 cell{r}{c}={c=n}{c} 的单元类型 {c} 是【不折行的 LR 模式】。
|
% (a) 合并单元格 cell{r}{c}={c=n}{c} 的单元类型 {c} 是【不折行的 LR 模式】。
|
||||||
% 格内文字若比所跨各列合计更宽,它不会在列内折行,而是【把这些列撑宽】,
|
% 格内文字若比所跨各列合计更宽,它不会在列内折行,而是【把这些列撑宽】,
|
||||||
@@ -185,7 +183,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 4. 行高
|
% 4. 行高
|
||||||
%
|
%
|
||||||
% 原 docx 各行【没有 trHeight】,高度全由段数决定
|
% 各行【没有 trHeight】,高度全由段数决定
|
||||||
% (每段 = 1 个行距 15.6 pt):
|
% (每段 = 1 个行距 15.6 pt):
|
||||||
% R0 2 段 → 31.2 pt = 11.01 mm
|
% R0 2 段 → 31.2 pt = 11.01 mm
|
||||||
% R1 1 段 → 15.6 pt = 5.50 mm
|
% R1 1 段 → 15.6 pt = 5.50 mm
|
||||||
@@ -194,7 +192,7 @@
|
|||||||
% R4 2 段 → 31.2 pt = 11.01 mm
|
% R4 2 段 → 31.2 pt = 11.01 mm
|
||||||
% 合计 280.8 pt = 99.06 mm
|
% 合计 280.8 pt = 99.06 mm
|
||||||
%
|
%
|
||||||
% ⚠️ tabularray 的 ht= 经实测同为“最小行高”,与 Word 的 atLeast 语义一致。
|
% ⚠️ tabularray 的 ht= 经实际同为“最小行高”,与 Word 的 atLeast 语义一致。
|
||||||
% 本表直接把这些值写成 ht=,行高即固定;内容更多的行会自然长高。
|
% 本表直接把这些值写成 ht=,行高即固定;内容更多的行会自然长高。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
|
|
||||||
@@ -251,7 +249,7 @@
|
|||||||
%
|
%
|
||||||
% ⚠️⚠️ 这里【必须】保持 \parbox 默认的 [c],不要改成 [t]。
|
% ⚠️⚠️ 这里【必须】保持 \parbox 默认的 [c],不要改成 [t]。
|
||||||
% 原因:tabularray 会给每个单元格垫一个 strut,[t] 生成的盒子顶部
|
% 原因:tabularray 会给每个单元格垫一个 strut,[t] 生成的盒子顶部
|
||||||
% 与 strut 顶部相加,实测每行白白多出 3.6pt(R0 从 31.67 → 35.26)。
|
% 与 strut 顶部相加,每行白白多出 3.6pt(R0 从 31.67 → 35.26)。
|
||||||
%
|
%
|
||||||
% docx 里 R0C1 / R2C1 / R4C1 都没有 <w:vAlign>(按 OOXML 语义是顶部对齐),
|
% docx 里 R0C1 / R2C1 / R4C1 都没有 <w:vAlign>(按 OOXML 语义是顶部对齐),
|
||||||
% 但它们靠【段落数把行高填满】实现“贴顶”:
|
% 但它们靠【段落数把行高填满】实现“贴顶”:
|
||||||
@@ -278,12 +276,12 @@
|
|||||||
%
|
%
|
||||||
% ⚠️ R3 第一格是合并格(c1-c2),另外两格是普通列。tabularray 对这两种格
|
% ⚠️ R3 第一格是合并格(c1-c2),另外两格是普通列。tabularray 对这两种格
|
||||||
% 的垂直居中算法【不一样】:合并格内容整体偏低 1.55 pt。
|
% 的垂直居中算法【不一样】:合并格内容整体偏低 1.55 pt。
|
||||||
% 三个格分别裸写内容时,实测基线为
|
% 三个格分别裸写内容时,基线为
|
||||||
% 批准单位负责人签字 y = 280.65
|
% 批准单位负责人签字 y = 280.65
|
||||||
% 用工单位负责人签字 y = 279.10
|
% 用工单位负责人签字 y = 279.10
|
||||||
% 经办人签字 y = 279.10
|
% 经办人签字 y = 279.10
|
||||||
% 肉眼勉强看得出参差。把所有格都包成【同一种】\parbox 后,
|
% 肉眼勉强看得出参差。把所有格都包成【同一种】\parbox 后,
|
||||||
% 垂直居中的对象变成同一个盒子高度,三格自然对齐(实测 y 完全相同)。
|
% 垂直居中的对象变成同一个盒子高度,三格自然对齐(实际y 完全相同)。
|
||||||
% 故本表三个签字格一律走这个宏。
|
% 故本表三个签字格一律走这个宏。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
\newcommand{\lwsign}[2]{%
|
\newcommand{\lwsign}[2]{%
|
||||||
@@ -307,10 +305,10 @@
|
|||||||
|
|
||||||
% 空段落:\lwblank{n} ⇒ 追加 n 个空行
|
% 空段落:\lwblank{n} ⇒ 追加 n 个空行
|
||||||
%
|
%
|
||||||
% ⚠️ 不要用 \par\null:实测在 tabularray 单元格里,9 个 \par\null 会排成
|
% ⚠️ 不要用 \par\null:实际在 tabularray 单元格里,9 个 \par\null 会排成
|
||||||
% 192.07pt,而 docx 里 9 个空段落只有 140.4pt。原因是 \null 是一个
|
% 192.07pt,而 docx 里 9 个空段落只有 140.4pt。原因是 \null 是一个
|
||||||
% 有高度的盒子,每个都按“汉字 + 行距”算钱;Word 的空段落只贡献行距。
|
% 有高度的盒子,每个都按“汉字 + 行距”算钱;Word 的空段落只贡献行距。
|
||||||
% ⇒ 行高统一交给 tabularray 的 ht=(实测 ht=49.53mm 排出 140.73pt,与
|
% ⇒ 行高统一交给 tabularray 的 ht=(实际ht=49.53mm 排出 140.73pt,与
|
||||||
% docx 的 140.4pt 差 0.33pt,可忽略),本宏只用于确有需要的场合。
|
% docx 的 140.4pt 差 0.33pt,可忽略),本宏只用于确有需要的场合。
|
||||||
\newcommand{\lwblank}[1]{%
|
\newcommand{\lwblank}[1]{%
|
||||||
\par
|
\par
|
||||||
@@ -322,7 +320,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 8. 表外标题
|
% 8. 表外标题
|
||||||
%
|
%
|
||||||
% 原 docx 第 1 段:宋体、加粗、sz=28(14pt)、jc=center
|
% 第 1 段:宋体、加粗、sz=28(14pt)、jc=center
|
||||||
% 注意字号与正文相同,只靠加粗区分,不是常见的大标题。
|
% 注意字号与正文相同,只靠加粗区分,不是常见的大标题。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\lwtitle}{%
|
\newcommand{\lwtitle}{%
|
||||||
@@ -335,7 +333,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 9. 表后空行
|
% 9. 表后空行
|
||||||
%
|
%
|
||||||
% 原 docx 表格之后还有一个 jc=center 的空段落。
|
% 表格之后还有一个 jc=center 的空段落。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\lwtail}{\par\null\par}
|
\newcommand{\lwtail}{\par\null\par}
|
||||||
|
|
||||||
|
|||||||
+3
-4
@@ -46,10 +46,9 @@
|
|||||||
\begin{lwtable}
|
\begin{lwtable}
|
||||||
|
|
||||||
%---- R0 用工单位 | 单位名 ---------------------------------------------
|
%---- R0 用工单位 | 单位名 ---------------------------------------------
|
||||||
% docx 里两格都是 2 段:C0 “用工单位”/“(公章)”,C1 单位名 + 1 个空段。
|
% 两格都是 2 段:左格「用工单位」+「(公章)」,右格单位名 + 1 个空段。
|
||||||
% 两格内容都刚好填满行高 ⇒ vAlign 取 center 还是 top 结果相同。
|
% ⚠️ 右格的空段必须补出来,否则只剩 1 段(高 12.6pt),会被 m 居中
|
||||||
% ⚠️ 必须把那个空段补出来,否则 C1 只剩 1 段(高 12.6pt),会被
|
% 到格子中部,单位名比左格低约 7mm。
|
||||||
% m 居中到格子中部,单位名比 C0 低 7mm 左右。
|
|
||||||
用工单位\par (公章)
|
用工单位\par (公章)
|
||||||
& \lwcellv{\lwunit\lwblank{1}}
|
& \lwcellv{\lwunit\lwblank{1}}
|
||||||
& & \\
|
& & \\
|
||||||
|
|||||||
+21
-26
@@ -2,7 +2,7 @@
|
|||||||
% ouckhtb.sty — 中国海洋大学 教职工年度考核登记表 版式包
|
% ouckhtb.sty — 中国海洋大学 教职工年度考核登记表 版式包
|
||||||
%
|
%
|
||||||
% 依据:2025 年学校下发的 Word 表(WPS 保存的 .docx)
|
% 依据:2025 年学校下发的 Word 表(WPS 保存的 .docx)
|
||||||
% 目标:版式与原 docx 逐项对齐。所有尺寸都由 docx 内部数值换算而来:
|
% 目标:版式与逐项对齐。所有尺寸都由 docx 内部数值换算而来:
|
||||||
% twips → mm : mm = twips / 1440 * 25.4
|
% twips → mm : mm = twips / 1440 * 25.4
|
||||||
% twips → pt : pt = twips / 20 (1pt = 1/72in)
|
% twips → pt : pt = twips / 20 (1pt = 1/72in)
|
||||||
% w:sz : 半磅值,÷2 即 pt
|
% w:sz : 半磅值,÷2 即 pt
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面与版心
|
% 1. 页面与版心
|
||||||
%
|
%
|
||||||
% 原 docx sectPr:
|
% sectPr:
|
||||||
% pgSz 11907 × 16840 twips = 210.03 × 297.04 mm → A4
|
% pgSz 11907 × 16840 twips = 210.03 × 297.04 mm → A4
|
||||||
% pgMar top/bottom 1418 = 25.01 mm
|
% pgMar top/bottom 1418 = 25.01 mm
|
||||||
% left/right 1701 = 30.00 mm
|
% left/right 1701 = 30.00 mm
|
||||||
@@ -62,7 +62,6 @@
|
|||||||
% R1C6 的括注 仿宋 12pt (w:sz=24),只有“研究所、实验室、科室”
|
% R1C6 的括注 仿宋 12pt (w:sz=24),只有“研究所、实验室、科室”
|
||||||
% 页脚页码 9pt (footer 样式 w:sz=18)
|
% 页脚页码 9pt (footer 样式 w:sz=18)
|
||||||
%
|
%
|
||||||
% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的
|
|
||||||
% FangSong / SimHei / SimSun + AutoFakeBold,换台机器(尤其 Linux/macOS)
|
% FangSong / SimHei / SimSun + AutoFakeBold,换台机器(尤其 Linux/macOS)
|
||||||
% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。
|
% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -89,7 +88,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 3. 列的宽度模型(本包最关键的一节,改之前请先读完)
|
% 3. 列的宽度模型(本包最关键的一节,改之前请先读完)
|
||||||
%
|
%
|
||||||
% 原 docx tblGrid(11 个网格列,twips → mm):
|
% tblGrid(11 个网格列,twips → mm):
|
||||||
% c1 1087→19.17 c2 283→ 4.99 c3 1221→21.54
|
% c1 1087→19.17 c2 283→ 4.99 c3 1221→21.54
|
||||||
% c4 1047→18.47 c5 284→ 5.01 c6 1105→19.49
|
% c4 1047→18.47 c5 284→ 5.01 c6 1105→19.49
|
||||||
% c7 952→16.79 c8 600→10.58 c9 870→15.35
|
% c7 952→16.79 c8 600→10.58 c9 870→15.35
|
||||||
@@ -103,7 +102,7 @@
|
|||||||
% R3~R8 1,10 (2 个单元:标签 + 内容栏)
|
% R3~R8 1,10 (2 个单元:标签 + 内容栏)
|
||||||
%
|
%
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% ⚠️⚠️ 四条实测结论(tabularray 2022A),决定了下面的写法:
|
% ⚠️⚠️ 四条实际结论(tabularray 2022A),决定了下面的写法:
|
||||||
%
|
%
|
||||||
% (a) tabularray 的 wd 是“内容宽”,不含任何内边距;表宽 = Σwd + 竖线宽。
|
% (a) tabularray 的 wd 是“内容宽”,不含任何内边距;表宽 = Σwd + 竖线宽。
|
||||||
% 而 Word 的 gridCol 是“含内边距的整格宽”。两者语义相反。
|
% 而 Word 的 gridCol 是“含内边距的整格宽”。两者语义相反。
|
||||||
@@ -114,7 +113,7 @@
|
|||||||
% 而 ΣgridCol = 158.3267mm,故每列要减 (158.3267−156.3938)/11
|
% 而 ΣgridCol = 158.3267mm,故每列要减 (158.3267−156.3938)/11
|
||||||
% = 0.1757mm。(gridCol − 0.1757) 即下面 3.1 节的取值。
|
% = 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!”
|
% longtblr 会一直报 “Table width is too small, need 0.50008pt more!”
|
||||||
% 外加一条 0.5pt 的 Overfull \hbox。差得极小但很碍眼,故校正。
|
% 外加一条 0.5pt 的 Overfull \hbox。差得极小但很碍眼,故校正。
|
||||||
%
|
%
|
||||||
@@ -125,19 +124,18 @@
|
|||||||
% 窄列标签(如“出生年月”)在 Word 里本来就要折成两行,观感一致。
|
% 窄列标签(如“出生年月”)在 Word 里本来就要折成两行,观感一致。
|
||||||
%
|
%
|
||||||
% (c) ⚠️ 合并单元格(\SetCell[c=n])里的 \hsize【没有】被重设成该跨度的
|
% (c) ⚠️ 合并单元格(\SetCell[c=n])里的 \hsize【没有】被重设成该跨度的
|
||||||
% 宽度,它仍是外层版心宽。实测:span=10 的格子里 \linewidth=47.8pt
|
% 宽度,它仍是外层版心宽。span=10 的格子里 \linewidth=47.8pt
|
||||||
% 但 \hsize=450.5pt,于是长文本按 450pt 折行、彻底冲出格子
|
% 但 \hsize=450.5pt,于是长文本按 450pt 折行、彻底冲出格子
|
||||||
% (这就是曾经那个 “Overfull \hbox (1644pt too wide)” 的真正来源)。
|
|
||||||
% ⇒ 凡是内容较长或含多段的跨列单元格,必须用固定宽的 \parbox 包起来。
|
% ⇒ 凡是内容较长或含多段的跨列单元格,必须用固定宽的 \parbox 包起来。
|
||||||
%
|
%
|
||||||
% (d) ⚠️⚠️⚠️【最要命的一条】跨列合并格 cell{r}{c}={c=n}{c} 的单元类型
|
% (d) ⚠️⚠️⚠️【最要命的一条】跨列合并格 cell{r}{c}={c=n}{c} 的单元类型
|
||||||
% {c} 是【不折行的 LR 模式】。格内文字若比所跨各列的合计宽,它不会在
|
% {c} 是【不折行的 LR 模式】。格内文字若比所跨各列的合计宽,它不会在
|
||||||
% 列内折行,而是【把这些列撑宽】,整张表随之超出版心。
|
% 列内折行,而是【把这些列撑宽】,整张表随之超出版心。
|
||||||
% 实测:“系(研究所、实验室、科室)”共 12 字(14pt ≈ 168pt),
|
% “系(研究所、实验室、科室)”共 12 字(14pt ≈ 168pt),
|
||||||
% 塞进 c6-c7(合计 35.90mm ≈ 101.8pt)后,c6-c7 被撑到 126.5pt,
|
% 塞进 c6-c7(合计 35.90mm ≈ 101.8pt)后,c6-c7 被撑到 126.5pt,
|
||||||
% 整表由 448.3pt 涨到 558.9pt —— 正是那 111.6pt 的 Overfull \hbox。
|
% 整表由 448.3pt 涨到 558.9pt —— 正是那 111.6pt 的 Overfull \hbox。
|
||||||
% 而【单列】Q[c,m,wd=…] 没有这个问题:内容超出时只溢出、列宽不变
|
% 而【单列】Q[c,m,wd=…] 没有这个问题:内容超出时只溢出、列宽不变
|
||||||
% (实测在 10.39mm 的 c8 里写 4 个汉字,表宽仍为 448.3pt)。
|
% (实际在 10.39mm 的 c8 里写 4 个汉字,表宽仍为 448.3pt)。
|
||||||
% ⇒ 结论:**凡是对齐到合并/窄格里、又必须折行的文字,一律包 \parbox**。
|
% ⇒ 结论:**凡是对齐到合并/窄格里、又必须折行的文字,一律包 \parbox**。
|
||||||
% 本包为此给每个跨度备了常量与 \khtbfit 包装,见下面 3.2 节。
|
% 本包为此给每个跨度备了常量与 \khtbfit 包装,见下面 3.2 节。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -176,7 +174,7 @@
|
|||||||
\newcommand{\khtbspanH}{24.0856mm} % c5-c6 姓名值 / 性别值
|
\newcommand{\khtbspanH}{24.0856mm} % c5-c6 姓名值 / 性别值
|
||||||
|
|
||||||
% 右侧内容栏(c2-c11,跨 10 列)的可用宽 = 十列 wd 之和。
|
% 右侧内容栏(c2-c11,跨 10 列)的可用宽 = 十列 wd 之和。
|
||||||
% ⚠️ 不要再用“实测 \linewidth”得到的那个 379.65pt:它是带竖线、且被
|
% ⚠️ 不要再用“实际\linewidth”得到的那个 379.65pt:它是带竖线、且被
|
||||||
% xeCJK 行首调整过的结果,换算成 mm 后比真实格宽窄 7mm,会让签字横线
|
% xeCJK 行首调整过的结果,换算成 mm 后比真实格宽窄 7mm,会让签字横线
|
||||||
% 和勾选框提前收尾、右侧留出一大段空白。
|
% 和勾选框提前收尾、右侧留出一大段空白。
|
||||||
\newcommand{\khtbcellw}{137.0792mm}
|
\newcommand{\khtbcellw}{137.0792mm}
|
||||||
@@ -184,12 +182,12 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 4. 行高
|
% 4. 行高
|
||||||
%
|
%
|
||||||
% 原 docx trHeight + hRule=atLeast(twips → mm):
|
% trHeight + hRule=atLeast(twips → mm):
|
||||||
% R0 412→7.27 R1 460→8.11 R2 939→16.56
|
% R0 412→7.27 R1 460→8.11 R2 939→16.56
|
||||||
% R3 1261→22.24 R4 1252→22.08 R5 1009→17.80
|
% R3 1261→22.24 R4 1252→22.08 R5 1009→17.80
|
||||||
% R6 556→ 9.81 R7 1258→22.19 R8 1258→22.19
|
% 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 语义一致 —— 内容多时行会自动
|
% ht=22mm 才撑开),与 Word 的 atLeast 语义一致 —— 内容多时行会自动
|
||||||
% 长高,与 Word 表现相同,无需额外处理。
|
% 长高,与 Word 表现相同,无需额外处理。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -198,7 +196,7 @@
|
|||||||
% 5. 表格环境
|
% 5. 表格环境
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 必须用 longtblr 而不是 tblr:
|
% ⚠️⚠️ 必须用 longtblr 而不是 tblr:
|
||||||
% 本表内容使总高远超一页可用高度(原 docx 也是 2 页)。而 tblr 是
|
% 本表内容使总高远超一页可用高度(也是 2 页)。而 tblr 是
|
||||||
% 一整块不可分割的盒子 —— 装进 \setbox 后报 Overfull \vbox (140pt),
|
% 一整块不可分割的盒子 —— 装进 \setbox 后报 Overfull \vbox (140pt),
|
||||||
% 第 1 页只剩标题、表格整体被推到第 2 页。longtblr 才支持按行断页。
|
% 第 1 页只剩标题、表格整体被推到第 2 页。longtblr 才支持按行断页。
|
||||||
%
|
%
|
||||||
@@ -213,9 +211,9 @@
|
|||||||
% (所以上面 3.1 节的 \khtbwa… 只作文档用,不能拼进 colspec。)
|
% (所以上面 3.1 节的 \khtbwa… 只作文档用,不能拼进 colspec。)
|
||||||
%
|
%
|
||||||
% ⚠️⚠️⚠️ stretch=0 必须写:longtblr(与 tblr 不同)默认把各列按 \textwidth
|
% ⚠️⚠️⚠️ 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,压在页边距外。
|
% 表格右边界从 523.7pt 越到 540.4pt,压在页边距外。
|
||||||
% 加上 stretch=0 后实测宽 448.3pt,与版心严格一致。
|
% 加上 stretch=0 后实际宽 448.3pt,与版心严格一致。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 【易错点】单元格合并(跨度)全部写死在本环境里,用
|
% ⚠️⚠️ 【易错点】单元格合并(跨度)全部写死在本环境里,用
|
||||||
% cell{行}{列}={c=n}{c}
|
% cell{行}{列}={c=n}{c}
|
||||||
@@ -223,7 +221,6 @@
|
|||||||
% · \SetCell 之后要补若干个空 &,补几个取决于该格跨几列;一旦
|
% · \SetCell 之后要补若干个空 &,补几个取决于该格跨几列;一旦
|
||||||
% 某一个数错一位,同行后面所有单元格会整体错列到窄列(如 1.2mm
|
% 某一个数错一位,同行后面所有单元格会整体错列到窄列(如 1.2mm
|
||||||
% 的 c10)里去,报出【每一行都超宽】的 Overfull,从行号上完全
|
% 的 c10)里去,报出【每一行都超宽】的 Overfull,从行号上完全
|
||||||
% 看不出是哪一行错了 —— 这个坑本包踩过。
|
|
||||||
% · cell{r}{c}={c=n}{c} 把跨度与数据行分离,每行老老实实写满
|
% · cell{r}{c}={c=n}{c} 把跨度与数据行分离,每行老老实实写满
|
||||||
% 11 个单元格,行列对应一目了然。
|
% 11 个单元格,行列对应一目了然。
|
||||||
% ⚠️ 正确写法只有 {c=n}{c};={c=n}、={n}{c}、={span=n}{c} 都不认。
|
% ⚠️ 正确写法只有 {c=n}{c};={c=n}、={n}{c}、={span=n}{c} 都不认。
|
||||||
@@ -264,7 +261,6 @@
|
|||||||
%
|
%
|
||||||
% ⚠️⚠️【跨列合并一律在数据行里用行内 \SetCell,不要用表头的 cell{r}{c}】
|
% ⚠️⚠️【跨列合并一律在数据行里用行内 \SetCell,不要用表头的 cell{r}{c}】
|
||||||
%
|
%
|
||||||
% 这里踩了整整一轮坑,结论留下免得重来。
|
|
||||||
%
|
%
|
||||||
% 原先表头写的是:
|
% 原先表头写的是:
|
||||||
% cell{1}{1}={c=2}{c}, cell{1}{5}={c=2}{c}, cell{1}{10}={c=2}{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 是【数据行的单元序号】,
|
% 根因:tabularray 的 cell{r}{c}={c=n} 里那个 c 是【数据行的单元序号】,
|
||||||
% 不是视觉列号。三处 c=2 加起来让该行要吃掉 15 个视觉列,而表只有 11 列,
|
% 不是视觉列号。三处 c=2 加起来让该行要吃掉 15 个视觉列,而表只有 11 列,
|
||||||
% 超出的部分被静默丢弃 —— 被丢的正好是最后一个值。
|
% 超出的部分被静默丢弃 —— 被丢的正好是最后一个值。
|
||||||
% 实测:同一行写 12 格 → 丢值;写 10 格/9 格 → 反而显示(因为空缺让它
|
% 同一行写 12 格 → 丢值;写 10 格/9 格 → 反而显示(因为空缺让它
|
||||||
% 有余量)。所以「格子数对不对」在这里完全不能当判断依据。
|
% 有余量)。所以「格子数对不对」在这里完全不能当判断依据。
|
||||||
%
|
%
|
||||||
% 正解:表头不写 cell{},合并直接标在被合并的那个格子上:
|
% 正解:表头不写 cell{},合并直接标在被合并的那个格子上:
|
||||||
% \SetCell[c=2]{c} 职工号 & & 0000000 & ...
|
% \SetCell[c=2]{c} 职工号 & & 0000000 & ...
|
||||||
% 每行照常写满 11 格,跨度由行内标记自己声明,不再有隐式吞格。
|
% 每行照常写满 11 格,跨度由行内标记自己声明,不再有隐式吞格。
|
||||||
% 改写后实测:零 error,11 列全值齐在。
|
% 改写后零 error,11 列全值齐在。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% \khtbfit{跨度宽宏}{内容} —— 定宽、水平居中、可折行
|
% \khtbfit{跨度宽宏}{内容} —— 定宽、水平居中、可折行
|
||||||
% 例:\khtbfit{\khtbspanC}{系(研究所、实验室、科室)}
|
% 例:\khtbfit{\khtbspanC}{系(研究所、实验室、科室)}
|
||||||
@@ -340,7 +336,6 @@
|
|||||||
% 那样调用 \khtbsign{负责人签名:} 时,{...} 不是可选参数形式 [...]
|
% 那样调用 \khtbsign{负责人签名:} 时,{...} 不是可选参数形式 [...]
|
||||||
% 而不会被吃掉,结果是:先印出默认的“本人签名:”,随后那个参数组
|
% 而不会被吃掉,结果是:先印出默认的“本人签名:”,随后那个参数组
|
||||||
% 在 \par 之后再单独排成一行 —— 一格里凭空多出两行签字,且标签还是错的。
|
% 在 \par 之后再单独排成一行 —— 一格里凭空多出两行签字,且标签还是错的。
|
||||||
% 本包踩过这个坑:全文“本人签名”出现了 4 次。
|
|
||||||
\newbox\khtbsignbox
|
\newbox\khtbsignbox
|
||||||
\newcommand{\khtbsign}[1]{%
|
\newcommand{\khtbsign}[1]{%
|
||||||
\par\noindent
|
\par\noindent
|
||||||
@@ -371,8 +366,8 @@
|
|||||||
% 用 \hbox to\linewidth + 5 个 \hss(首、尾、中间 3 处等分),
|
% 用 \hbox to\linewidth + 5 个 \hss(首、尾、中间 3 处等分),
|
||||||
% 剩余空间自动均分,总宽永不超过栏宽。
|
% 剩余空间自动均分,总宽永不超过栏宽。
|
||||||
%
|
%
|
||||||
% ⚠️ 原 docx 用 Wingdings 的 ¨(char 0x00A8)画未勾选的方框。
|
% ⚠️ 用 Wingdings 的 ¨(char 0x00A8)画未勾选的方框。
|
||||||
% 这里改用 U+25A1 “□”:实测仿宋、黑体都有该字形,宋体没有,
|
% 这里改用 U+25A1 “□”:实际仿宋、黑体都有该字形,宋体没有,
|
||||||
% 故正文默认仿宋;若把正文改成宋体,需另指定方框字体。
|
% 故正文默认仿宋;若把正文改成宋体,需另指定方框字体。
|
||||||
\newcommand{\khtbchoices}[1]{%
|
\newcommand{\khtbchoices}[1]{%
|
||||||
\par
|
\par
|
||||||
@@ -399,8 +394,8 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 9. 表外标题
|
% 9. 表外标题
|
||||||
%
|
%
|
||||||
% 原 docx 第 1 段:黑体 22pt、居中、行距 exact 480twips=24pt、字距 -0.7pt
|
% 第 1 段:黑体 22pt、居中、行距 exact 480twips=24pt、字距 -0.7pt
|
||||||
% 原 docx 第 2 段:仿宋 16pt。docx 里是 firstLine 640twips(2 字)缩进
|
% 第 2 段:仿宋 16pt。docx 里是 firstLine 640twips(2 字)缩进
|
||||||
% 且未设 jc,实际渲染为“左缩两字”而非居中 —— 更像原表排版的疏漏。
|
% 且未设 jc,实际渲染为“左缩两字”而非居中 —— 更像原表排版的疏漏。
|
||||||
% 本模板改为居中(更符合版式意图);若要还原原样,把下面 \centering
|
% 本模板改为居中(更符合版式意图);若要还原原样,把下面 \centering
|
||||||
% 换成 \hspace*{2\ccwd} 即可。
|
% 换成 \hspace*{2\ccwd} 即可。
|
||||||
@@ -422,7 +417,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 10. 表外脚注
|
% 10. 表外脚注
|
||||||
%
|
%
|
||||||
% 原 docx 第 4 段:仿宋 14pt、居中
|
% 第 4 段:仿宋 14pt、居中
|
||||||
% 内容“注:此表存入本人档案(A4纸正反面打印) 人事处制表”
|
% 内容“注:此表存入本人档案(A4纸正反面打印) 人事处制表”
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\khtbfootnote}{%
|
\newcommand{\khtbfootnote}{%
|
||||||
|
|||||||
+1
-2
@@ -66,14 +66,13 @@
|
|||||||
% ⚠️⚠️⚠️ 合并格里的文字【必须】用 \khtbfit{跨度宽宏}{文字} 包起来。
|
% ⚠️⚠️⚠️ 合并格里的文字【必须】用 \khtbfit{跨度宽宏}{文字} 包起来。
|
||||||
% 因为 cell{r}{c}={c=n}{c} 的 {c} 是【不折行的 LR 模式】:
|
% 因为 cell{r}{c}={c=n}{c} 的 {c} 是【不折行的 LR 模式】:
|
||||||
% 文字比所跨各列合计更宽时,它不会折行,而是把列撑宽、整张表超出版心
|
% 文字比所跨各列合计更宽时,它不会折行,而是把列撑宽、整张表超出版心
|
||||||
% (实测“系(研究所、实验室、科室)”把表从 448.3pt 撑到 558.9pt)。
|
% (实际“系(研究所、实验室、科室)”把表从 448.3pt 撑到 558.9pt)。
|
||||||
% 单列的 Q[c,m,wd=…] 没有这个问题,所以只有合并格需要包。
|
% 单列的 Q[c,m,wd=…] 没有这个问题,所以只有合并格需要包。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\begin{khtbtable}
|
\begin{khtbtable}
|
||||||
|
|
||||||
% ⚠️ 每行都按 11 列写满(10 个 & + 结尾 \\)。
|
% ⚠️ 每行都按 11 列写满(10 个 & + 结尾 \\)。
|
||||||
% 跨列合并在格子里用行内 \SetCell[c=n]{c} 声明,**不要**用表头的
|
% 跨列合并在格子里用行内 \SetCell[c=n]{c} 声明,**不要**用表头的
|
||||||
% cell{r}{c}。原因见 ouckhtb.sty 第 6 节的长注释 —— 那里踩过坑:
|
|
||||||
% 用表头 cell{} 会让某个值整格消失,而且零报错。
|
% 用表头 cell{} 会让某个值整格消失,而且零报错。
|
||||||
|
|
||||||
%---- R0 职工号 / 姓名 / 性别 / 出生年月 -------------------------------
|
%---- R0 职工号 / 姓名 / 性别 / 出生年月 -------------------------------
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 字体全部取自仓库公共字体包 ../../fonts.tex(文件在 ../../fonts/ 下)。
|
% 字体全部取自仓库公共字体包 ../../fonts.tex(文件在 ../../fonts/ 下)。
|
||||||
%
|
%
|
||||||
% 旧版这里是 Path=fonts/ 直接读本目录下的 幻灯片/fonts/ —— 那 18 个
|
|
||||||
% 鸿蒙字体文件共 49MB,与其它模板重复,且一旦别处升级就会版本不一致。
|
% 鸿蒙字体文件共 49MB,与其它模板重复,且一旦别处升级就会版本不一致。
|
||||||
% 现在统一到仓库根的 fonts/,全库只有一份。
|
% 现在统一到仓库根的 fonts/,全库只有一份。
|
||||||
%
|
%
|
||||||
|
|||||||
@@ -234,7 +234,7 @@
|
|||||||
\int_use:N \l_ouc_pbg_n
|
\int_use:N \l_ouc_pbg_n
|
||||||
- \int_use:N \l_ouc_pbg_base * \int_use:N \l_ouc_pbg_rows
|
- \int_use:N \l_ouc_pbg_base * \int_use:N \l_ouc_pbg_rows
|
||||||
}
|
}
|
||||||
%% 预估总高度并与正文可用高度比较(公式按实测校准):
|
%% 预估总高度并与正文可用高度比较(公式按实际校准):
|
||||||
%% 总高 ≈ 69pt(首行含标题条) + 行数*高度 + (行数-1)*25pt(行间距)
|
%% 总高 ≈ 69pt(首行含标题条) + 行数*高度 + (行数-1)*25pt(行间距)
|
||||||
\dim_set:Nn \l_ouc_pbg_est
|
\dim_set:Nn \l_ouc_pbg_est
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -275,10 +275,10 @@
|
|||||||
%% 方框内文字的字体(字号由 \ouc@toc@compute 算出)
|
%% 方框内文字的字体(字号由 \ouc@toc@compute 算出)
|
||||||
\def\ouc@toc@fontsel{\fontsize{\ouc@toc@font}{\ouc@toc@base}\selectfont\bfseries}
|
\def\ouc@toc@fontsel{\fontsize{\ouc@toc@font}{\ouc@toc@base}\selectfont\bfseries}
|
||||||
|
|
||||||
%% 圆形序号徽标(#1 = 圆圈填充色,#2 = 数字)
|
%% 圆形序号徽标(= 圆圈填充色,#2 = 数字)
|
||||||
%% 注意:这里刻意不加 \strut。\strut 会把内容盒撑成「0.7 倍行距的上高 + 0.3 倍行距的下深」,
|
%% 注意:这里刻意不加 \strut。\strut 会把内容盒撑成「0.7 倍行距的上高 + 0.3 倍行距的下深」,
|
||||||
%% 而数字没有下伸部(descender),那段虚构的下深会把数字整体推高,在圆里明显偏上
|
%% 而数字没有下伸部(descender),那段虚构的下深会把数字整体推高,在圆里明显偏上
|
||||||
%% (实测偏上约 1.7pt,大字号时可达 4pt)。去掉 \strut 后数字墨迹与圆心对齐(实测偏差 < 0.1pt)。
|
%% (实际偏上约 1.7pt,大字号时可达 4pt)。去掉 \strut 后数字墨迹与圆心对齐(实际偏差 < 0.1pt)。
|
||||||
%% 圆的垂直位置不受影响:圆心到基线的距离恒为 minimum size 的一半(0.6em)。
|
%% 圆的垂直位置不受影响:圆心到基线的距离恒为 minimum size 的一半(0.6em)。
|
||||||
\def\ouc@toc@badge#1#2{%
|
\def\ouc@toc@badge#1#2{%
|
||||||
\tikz[baseline=(ouc@badge.base)]{%
|
\tikz[baseline=(ouc@badge.base)]{%
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
minimum size=\ouc@toc@badgesize, font=\bfseries] (ouc@badge) {#2};%
|
minimum size=\ouc@toc@badgesize, font=\bfseries] (ouc@badge) {#2};%
|
||||||
}%
|
}%
|
||||||
}
|
}
|
||||||
%% 实心样式下用的空心序号(#1 = 描边色,#2 = 数字;同样不加 \strut)
|
%% 实心样式下用的空心序号(= 描边色,#2 = 数字;同样不加 \strut)
|
||||||
\def\ouc@toc@badgeopen#1#2{%
|
\def\ouc@toc@badgeopen#1#2{%
|
||||||
\tikz[baseline=(ouc@badge.base)]{%
|
\tikz[baseline=(ouc@badge.base)]{%
|
||||||
\node[circle, draw=#1, line width=0.8pt, text=#1, inner sep=0pt,
|
\node[circle, draw=#1, line width=0.8pt, text=#1, inner sep=0pt,
|
||||||
|
|||||||
+9
-14
@@ -30,7 +30,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面与版心
|
% 1. 页面与版心
|
||||||
%
|
%
|
||||||
% 原 docx sectPr:
|
% sectPr:
|
||||||
% pgSz 11906 × 16838 twips = 210.00 × 297.02 mm → A4
|
% pgSz 11906 × 16838 twips = 210.00 × 297.02 mm → A4
|
||||||
% pgMar top/bottom 1440 = 25.40 mm
|
% pgMar top/bottom 1440 = 25.40 mm
|
||||||
% left/right 1800 = 31.75 mm
|
% left/right 1800 = 31.75 mm
|
||||||
@@ -81,13 +81,13 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 3. 字号
|
% 3. 字号
|
||||||
%
|
%
|
||||||
% 原件实测(导出 PDF 读 span 的 size):
|
% 原件(导出 PDF 读 span 的 size):
|
||||||
% 大标题 18.00pt ← w:sz=36 半磅 = 18pt
|
% 大标题 18.00pt ← w:sz=36 半磅 = 18pt
|
||||||
% 副标题 12.00pt ← w:sz=24 = 12pt
|
% 副标题 12.00pt ← w:sz=24 = 12pt
|
||||||
% 正文 14.05pt ← w:sz=28 = 14pt
|
% 正文 14.05pt ← w:sz=28 = 14pt
|
||||||
%
|
%
|
||||||
% ⚠️ 正文实测 14.05 而非 14.00:WPS 内部按 1/20 pt 取整后再乘缩放
|
% ⚠️ 正文实际14.05 而非 14.00:WPS 内部按 1/20 pt 取整后再乘缩放
|
||||||
% 系数,0.05 是渲染误差。本模板写 14bp,实测输出 14.00。
|
% 系数,0.05 是渲染误差。本模板写 14bp,输出 14.00。
|
||||||
%
|
%
|
||||||
% ⚠️ 行距:原 docGrid linePitch=312 twips = 15.60pt。
|
% ⚠️ 行距:原 docGrid linePitch=312 twips = 15.60pt。
|
||||||
% 但 14pt 字配 15.6pt 行距太挤(1.11 倍),原件正文段与段之间
|
% 但 14pt 字配 15.6pt 行距太挤(1.11 倍),原件正文段与段之间
|
||||||
@@ -164,7 +164,7 @@
|
|||||||
%
|
%
|
||||||
% ⚠️ 引导符不能用中点「·」(U+00B7):本库的 OUC Serif 子集里**没有**
|
% ⚠️ 引导符不能用中点「·」(U+00B7):本库的 OUC Serif 子集里**没有**
|
||||||
% 这个字形,会报 "Missing character: There is no · (U+00B7)",
|
% 这个字形,会报 "Missing character: There is no · (U+00B7)",
|
||||||
% 印出来是空白。实测该字体有 ●(U+25CF) 与 ○(U+25CB),
|
% 印出来是空白。实际该字体有 ●(U+25CF) 与 ○(U+25CB),
|
||||||
% 且 fonts.tex 已把这两个码位归入 CJK 字符类,可直接用。
|
% 且 fonts.tex 已把这两个码位归入 CJK 字符类,可直接用。
|
||||||
% 也考虑过「•」(U+2022),同样缺字,不要用。
|
% 也考虑过「•」(U+2022),同样缺字,不要用。
|
||||||
\newenvironment{grdlist}{%
|
\newenvironment{grdlist}{%
|
||||||
@@ -187,7 +187,6 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 7. 成绩构成表
|
% 7. 成绩构成表
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 列宽算法(这里踩过一次,务必按此办):
|
|
||||||
% tabularray 的 Q[wd=...] 是**内容区宽度**,不含 colsep。
|
% tabularray 的 Q[wd=...] 是**内容区宽度**,不含 colsep。
|
||||||
% 每列实际占位 = wd + 2×colsep(左右各一个 1.905mm)。
|
% 每列实际占位 = wd + 2×colsep(左右各一个 1.905mm)。
|
||||||
% 所以 6 列总共要多占 6×2×1.905 = 22.86mm。
|
% 所以 6 列总共要多占 6×2×1.905 = 22.86mm。
|
||||||
@@ -218,7 +217,6 @@
|
|||||||
% 这个坑在所有用 tabularray 的模板里都成立。
|
% 这个坑在所有用 tabularray 的模板里都成立。
|
||||||
% 全格线:1-Z 表示第 1 条到第 Z 条(末条),即所有横线/竖线都画。
|
% 全格线:1-Z 表示第 1 条到第 Z 条(末条),即所有横线/竖线都画。
|
||||||
% 只画外框(hline{1,Z})时数据行之间是空白,跨行格与单行格的分界
|
% 只画外框(hline{1,Z})时数据行之间是空白,跨行格与单行格的分界
|
||||||
% 看不出来,容易看错行 —— 这是用户明确要求改掉的点。
|
|
||||||
hline{1-Z}={0.5pt},
|
hline{1-Z}={0.5pt},
|
||||||
vline{1-Z}={0.5pt},
|
vline{1-Z}={0.5pt},
|
||||||
% ⚠️ 行高:第 2 行给 22mm。
|
% ⚠️ 行高:第 2 行给 22mm。
|
||||||
@@ -247,7 +245,6 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 8. 落款与签字栏
|
% 8. 落款与签字栏
|
||||||
%
|
%
|
||||||
% 原件**没有**签字栏(只有一段说明文字就结束了)。用户明确要求补上
|
|
||||||
% 「任课老师签字」和年月日 —— 这是成绩构成说明作为归档材料的必要项:
|
% 「任课老师签字」和年月日 —— 这是成绩构成说明作为归档材料的必要项:
|
||||||
% 没有签字的说明文件在教务归档时不被认作有效文件。
|
% 没有签字的说明文件在教务归档时不被认作有效文件。
|
||||||
%
|
%
|
||||||
@@ -255,11 +252,10 @@
|
|||||||
% 任课教师(签字):____________
|
% 任课教师(签字):____________
|
||||||
% 年 月 日 ← 纯手写填空位,印任何年份都会占掉手写空间
|
% 年 月 日 ← 纯手写填空位,印任何年份都会占掉手写空间
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 踩过的两个坑(都表现成「内容不多却翻到下一页」):
|
|
||||||
%
|
%
|
||||||
% 坑① minipage 内部用 \hfill 撑右对齐
|
% 坑① minipage 内部用 \hfill 撑右对齐
|
||||||
% → 内部行末被拉伸,12pt 的字被拉成 34.8pt 一字
|
% → 内部行末被拉伸,12pt 的字被拉成 34.8pt 一字
|
||||||
% (实测「任」「课」「教」「师」间距 34.8pt)。
|
% (实际「任」「课」「教」「师」间距 34.8pt)。
|
||||||
% 正解:\hfill 只放在 minipage **外面**,内部 \raggedright。
|
% 正解:\hfill 只放在 minipage **外面**,内部 \raggedright。
|
||||||
%
|
%
|
||||||
% 坑② 用 \noindent\hfill\begin{minipage}... 推右
|
% 坑② 用 \noindent\hfill\begin{minipage}... 推右
|
||||||
@@ -269,12 +265,11 @@
|
|||||||
% 正解:用 \makebox[\textwidth][r]{...} 一次性给足宽度,
|
% 正解:用 \makebox[\textwidth][r]{...} 一次性给足宽度,
|
||||||
% 排版器眼里这就是一个普通行内盒子,可以正常与上文同页。
|
% 排版器眼里这就是一个普通行内盒子,可以正常与上文同页。
|
||||||
%
|
%
|
||||||
% 实测:改法②后 2 页 → 1 页,零 Overfull。
|
% 改法②后 2 页 → 1 页,零 Overfull。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newlength{\grd@signline}\setlength{\grd@signline}{40mm}
|
\newlength{\grd@signline}\setlength{\grd@signline}{40mm}
|
||||||
|
|
||||||
\newcommand{\grdsignblock}{%
|
\newcommand{\grdsignblock}{%
|
||||||
% ⚠️⚠️ 这一块踩了三次「内容不多却翻页」,最终解法是**不用 \vfill**:
|
|
||||||
%
|
%
|
||||||
% 尝试① \par\vspace{4mm} + minipage
|
% 尝试① \par\vspace{4mm} + minipage
|
||||||
% → 翻页。minipage 是不可分对象,紧跟 \par 后成为合法断页点。
|
% → 翻页。minipage 是不可分对象,紧跟 \par 后成为合法断页点。
|
||||||
@@ -286,9 +281,9 @@
|
|||||||
% TeX 不接受压缩 \vfill,只能整块搬迁。
|
% TeX 不接受压缩 \vfill,只能整块搬迁。
|
||||||
%
|
%
|
||||||
% 最终解法:**固定间距 + 精确控制块高**,不依赖任何竖直胶。
|
% 最终解法:**固定间距 + 精确控制块高**,不依赖任何竖直胶。
|
||||||
% \vspace 用一个实测够用的定值,块高用 minipage 内容决定。
|
% \vspace 用一个实际够用的定值,块高用 minipage 内容决定。
|
||||||
% 正文字数变了就调这个 3mm —— 文档只有一页,回归成本极低。
|
% 正文字数变了就调这个 3mm —— 文档只有一页,回归成本极低。
|
||||||
% 实测 2.2mm 时内容底 769.5,距版心底 769.9 余 0.4pt。
|
% 实际2.2mm 时内容底 769.5,距版心底 769.9 余 0.4pt。
|
||||||
\par\vspace{2.2mm}
|
\par\vspace{2.2mm}
|
||||||
\begingroup
|
\begingroup
|
||||||
\grdsmall\songti
|
\grdsmall\songti
|
||||||
|
|||||||
+2
-2
@@ -120,13 +120,13 @@
|
|||||||
|
|
||||||
%------------------- 理论课(跨 2 行)-------------------
|
%------------------- 理论课(跨 2 行)-------------------
|
||||||
% ⚠️ 每行必须是**恰好 6 个格**。&\& 多一个就会多出一列,
|
% ⚠️ 每行必须是**恰好 6 个格**。&\& 多一个就会多出一列,
|
||||||
% 整表撑破版心报 Overfull(实测多一个 & 后冲出 122pt)。
|
% 整表撑破版心报 Overfull(实际多一个 & 后冲出 122pt)。
|
||||||
% ⚠️ 分项比例写在「评定依据」列、**不写在「细分项目」列**,是刻意的:
|
% ⚠️ 分项比例写在「评定依据」列、**不写在「细分项目」列**,是刻意的:
|
||||||
% 「细分项目」列可用宽只有 26mm(62.9bp),而「平时成绩(作业 20%、
|
% 「细分项目」列可用宽只有 26mm(62.9bp),而「平时成绩(作业 20%、
|
||||||
% 点名 10%)」累计约 155bp,按中文避头尾规则必然折 **3 行**(56.2pt)。
|
% 点名 10%)」累计约 155bp,按中文避头尾规则必然折 **3 行**(56.2pt)。
|
||||||
% 但「理论课」是跨 2 行(r=2)的格,格高只有 2×7.5mm = 54.73pt,
|
% 但「理论课」是跨 2 行(r=2)的格,格高只有 2×7.5mm = 54.73pt,
|
||||||
% 而 **tabularray 的跨行格不会自己长高,只会让内容溢出格线** ——
|
% 而 **tabularray 的跨行格不会自己长高,只会让内容溢出格线** ——
|
||||||
% 实测第 3 行「10%)」的墨迹底离行线只剩 0.90pt(0.32mm),
|
% 实际第 3 行「10%)」的墨迹底离行线只剩 0.90pt(0.32mm),
|
||||||
% 同一张表其他行的间距是 4.97pt(1.75mm),一眼看得出挤。
|
% 同一张表其他行的间距是 4.97pt(1.75mm),一眼看得出挤。
|
||||||
% 仅画外框时那里本来没有线,缺陷被完全掩盖;画满全格线后才暴露。
|
% 仅画外框时那里本来没有线,缺陷被完全掩盖;画满全格线后才暴露。
|
||||||
% 「评定依据」列 29.4mm(74.17bp)放「作业 20% / 点名 10%」只折 2 行
|
% 「评定依据」列 29.4mm(74.17bp)放「作业 20% / 点名 10%」只折 2 行
|
||||||
|
|||||||
+1
-1
@@ -1303,7 +1303,7 @@
|
|||||||
\setlength{\fboxsep}{0pt}
|
\setlength{\fboxsep}{0pt}
|
||||||
% 本地化:色带宽度用 \hsize 而不是 \linewidth。
|
% 本地化:色带宽度用 \hsize 而不是 \linewidth。
|
||||||
% \newgeometry{margin=0in} 之后 \linewidth 的更新时机与 \makebox 的
|
% \newgeometry{margin=0in} 之后 \linewidth 的更新时机与 \makebox 的
|
||||||
% 宽度计算有时序差,导致实测 Overfull 5pt(原版有封面图时被图宽度
|
% 宽度计算有时序差,导致实际Overfull 5pt(原版有封面图时被图宽度
|
||||||
% 掩盖,换成占位空盒后暴露出来)。
|
% 掩盖,换成占位空盒后暴露出来)。
|
||||||
\colorbox{coverlinecolor}{\makebox[\linewidth][c]{\shortstack[c]{\vspace{0.5in}}}}
|
\colorbox{coverlinecolor}{\makebox[\linewidth][c]{\shortstack[c]{\vspace{0.5in}}}}
|
||||||
\vfill
|
\vfill
|
||||||
|
|||||||
+5
-6
@@ -47,7 +47,7 @@
|
|||||||
% cannot be found
|
% cannot be found
|
||||||
% 而且是 9 个错误连发,因为在类的每个字体档位上都会失败。
|
% 而且是 9 个错误连发,因为在类的每个字体档位上都会失败。
|
||||||
%
|
%
|
||||||
% 实测:在 \documentclass 之后用 \setsansfont 覆盖**无效** ——
|
% 在 \documentclass 之后用 \setsansfont 覆盖**无效** ——
|
||||||
% 类加载时该字体族已经注册失败,后面的重新指定救不回来。
|
% 类加载时该字体族已经注册失败,后面的重新指定救不回来。
|
||||||
%
|
%
|
||||||
% ⇒ 唯一可靠的做法是**本地化 cls 本身**:模板目录里带一份
|
% ⇒ 唯一可靠的做法是**本地化 cls 本身**:模板目录里带一份
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
% (color=black 选项下 second 就是黑色)。
|
% (color=black 选项下 second 就是黑色)。
|
||||||
%
|
%
|
||||||
% ⇒ 在导言区写 \colorlet{coverlinecolor}{...} 会被它覆盖,
|
% ⇒ 在导言区写 \colorlet{coverlinecolor}{...} 会被它覆盖,
|
||||||
% 实测封面色带仍是纯黑,改了半天没反应。
|
% 实际封面色带仍是纯黑,改了半天没反应。
|
||||||
% 必须用 \AtBeginDocument 排到它后面。
|
% 必须用 \AtBeginDocument 排到它后面。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\definecolor{ouccoverlinecolor}{RGB}{32,178,170}
|
\definecolor{ouccoverlinecolor}{RGB}{32,178,170}
|
||||||
@@ -163,7 +163,7 @@
|
|||||||
%
|
%
|
||||||
% ⚠️ 教材正文长、中文多、行内夹英文术语和公式,默认 \tolerance
|
% ⚠️ 教材正文长、中文多、行内夹英文术语和公式,默认 \tolerance
|
||||||
% 会产生大量 Overfull(原教材明确加过这一条)。
|
% 会产生大量 Overfull(原教材明确加过这一条)。
|
||||||
% 2em 是原教材实测的值,既消掉大部分告警,又不会排出稀疏的行。
|
% 2em 是原教材实际的值,既消掉大部分告警,又不会排出稀疏的行。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\setlength{\emergencystretch}{2em}
|
\setlength{\emergencystretch}{2em}
|
||||||
|
|
||||||
@@ -205,7 +205,6 @@
|
|||||||
% 第一版写成 \rule{0pt}{0pt}(0 宽),立刻冒出
|
% 第一版写成 \rule{0pt}{0pt}(0 宽),立刻冒出
|
||||||
% Overfull \hbox (5.00002pt too wide) in paragraph at lines 44--44
|
% Overfull \hbox (5.00002pt too wide) in paragraph at lines 44--44
|
||||||
% 而且它只出现在 \maketitle 那一行,改 \hspace{2em}、\hspace{2.5em}、
|
% 而且它只出现在 \maketitle 那一行,改 \hspace{2em}、\hspace{2.5em}、
|
||||||
% minipage 的 0.67/0.27\linewidth、tabular 的列间距,**全部无效**,
|
|
||||||
% 溢出量死钉在 5.00002pt 不动。
|
% 溢出量死钉在 5.00002pt 不动。
|
||||||
%
|
%
|
||||||
% 根因:0 宽空盒让 \linewidth 在 titlepage 里的计算与 \textwidth
|
% 根因:0 宽空盒让 \linewidth 在 titlepage 里的计算与 \textwidth
|
||||||
@@ -215,9 +214,9 @@
|
|||||||
% ✅ 正解:给占位盒一个满宽
|
% ✅ 正解:给占位盒一个满宽
|
||||||
% \newcommand{\ouc@coverblank}{%
|
% \newcommand{\ouc@coverblank}{%
|
||||||
% \rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
|
% \rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
|
||||||
% 实测 0 Overfull。
|
% 实际0 Overfull。
|
||||||
%
|
%
|
||||||
% ⚠️ 不要试图在本文件里用 \ifcsname 覆盖 \@cover 来绕开 —— 实测
|
% ⚠️ 不要试图在本文件里用 \ifcsname 覆盖 \@cover 来绕开 —— 实际
|
||||||
% \@cover 即使定义成空串也会走 \includegraphics{} 分支报错。
|
% \@cover 即使定义成空串也会走 \includegraphics{} 分支报错。
|
||||||
% 改 cls 是唯一干净的办法。
|
% 改 cls 是唯一干净的办法。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
|
|||||||
+38
-39
@@ -2,7 +2,7 @@
|
|||||||
% ouccsx.sty — 中国海洋大学 特殊事项说明表 版式包
|
% ouccsx.sty — 中国海洋大学 特殊事项说明表 版式包
|
||||||
%
|
%
|
||||||
% 依据:报销相关/中国海洋大学特殊事项说明表.docx(Word 2007 保存)
|
% 依据:报销相关/中国海洋大学特殊事项说明表.docx(Word 2007 保存)
|
||||||
% 目标:版式与原 docx 逐项对齐;内容可随意增删而不破版。
|
% 目标:版式与逐项对齐;内容可随意增删而不破版。
|
||||||
%
|
%
|
||||||
% 尺寸换算:
|
% 尺寸换算:
|
||||||
% twips → pt : pt = twips / 20 (1 pt = 1/20 twip)
|
% twips → pt : pt = twips / 20 (1 pt = 1/20 twip)
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
%
|
%
|
||||||
% ⚠️ 与 PDF 对齐的几何量一律用 bp(= 1/72 in,PDF 用户单位),
|
% ⚠️ 与 PDF 对齐的几何量一律用 bp(= 1/72 in,PDF 用户单位),
|
||||||
% 不用 pt(= 1/72.27 in)。两者差 0.375%,A4 上累积可达 2 pt,
|
% 不用 pt(= 1/72.27 in)。两者差 0.375%,A4 上累积可达 2 pt,
|
||||||
% 超过一个字符宽,肉眼看得出。凡注「实测」者均为 PDF 坐标
|
% 超过一个字符宽,肉眼看得出。标注坐标者均为 PDF 坐标
|
||||||
% (左上原点、向下为正)。
|
% (左上原点、向下为正)。
|
||||||
%
|
%
|
||||||
% 用法见同目录 特殊事项说明表.tex,说明见 README.md
|
% 用法见同目录 特殊事项说明表.tex,说明见 README.md
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面与版心
|
% 1. 页面与版心
|
||||||
%
|
%
|
||||||
% 原 docx sectPr:
|
% sectPr:
|
||||||
% pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4
|
% pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4
|
||||||
% pgMar top 2155 / bottom 1985 twips = 38.01 / 35.00 mm
|
% pgMar top 2155 / bottom 1985 twips = 38.01 / 35.00 mm
|
||||||
% left 1588 / right 1474 twips = 28.01 / 26.00 mm
|
% left 1588 / right 1474 twips = 28.01 / 26.00 mm
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
% 而 docx 版心宽只有 210 − 28 − 26 = 156 mm。
|
% 而 docx 版心宽只有 210 − 28 − 26 = 156 mm。
|
||||||
% 表比版心宽 13.54 mm,靠 tblInd = −546 twips(−9.63 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 = 46.70 bp,右边框 x = 527.35 bp(宽 480.65 ✓)
|
||||||
% 标题文字中心 x = 300.41 bp ← 居中于 docx 版心,不是居中于表格
|
% 标题文字中心 x = 300.41 bp ← 居中于 docx 版心,不是居中于表格
|
||||||
%
|
%
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
paperheight = 297mm,
|
paperheight = 297mm,
|
||||||
left = 16.47mm, % = 表格左边框
|
left = 16.47mm, % = 表格左边框
|
||||||
totalwidth = 169.54mm, % = 表格外宽
|
totalwidth = 169.54mm, % = 表格外宽
|
||||||
% ⚠️ 实测口径差:本包所有 y 都恒比原件小 0.14 bp(表顶线、备注、
|
% ⚠️ 坐标差:本包所有 y 都恒比原件小 0.14 bp(表顶线、备注、
|
||||||
% 页码全部同步偏移,是 top 与 PDF 线宽的取整差,不是各行的问题)。
|
% 页码全部同步偏移,是 top 与 PDF 线宽的取整差,不是各行的问题)。
|
||||||
% 从 top 里补掉,一次消除。
|
% 从 top 里补掉,一次消除。
|
||||||
top = \dimexpr38.01mm+0.14bp\relax,
|
top = \dimexpr38.01mm+0.14bp\relax,
|
||||||
@@ -82,7 +82,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 2. 字体与字号
|
% 2. 字体与字号
|
||||||
%
|
%
|
||||||
% 原 docx 字号(w:sz 半磅值 ÷ 2):
|
% 字号(w:sz 半磅值 ÷ 2):
|
||||||
% 大标题 44 → 22 pt / 表内正文 21 → 10.5 pt
|
% 大标题 44 → 22 pt / 表内正文 21 → 10.5 pt
|
||||||
% 签字日期 24 → 12 pt / 备注 21 → 10.5 pt / 页码 28 → 14 pt
|
% 签字日期 24 → 12 pt / 备注 21 → 10.5 pt / 页码 28 → 14 pt
|
||||||
%
|
%
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
% 内边距 tblCellMar left/right = 108 twips,top/bottom = 0
|
% 内边距 tblCellMar left/right = 108 twips,top/bottom = 0
|
||||||
%
|
%
|
||||||
% 行高:trHeight 是 5091 / 1140 / 634 twips,hRule="atLeast",
|
% 行高:trHeight 是 5091 / 1140 / 634 twips,hRule="atLeast",
|
||||||
% 但 atLeast 是「最小」,实际高度由内容撑开。故用实测值:
|
% 但 atLeast 是「最小」,实际高度由内容撑开。故用取值:
|
||||||
% 四条横线中线 y = 172.99 / 457.49 / 516.34 / 573.64
|
% 四条横线中线 y = 172.99 / 457.49 / 516.34 / 573.64
|
||||||
% ⇒ 三段高 284.50 / 58.85 / 57.30(线中心距),
|
% ⇒ 三段高 284.50 / 58.85 / 57.30(线中心距),
|
||||||
% 扣掉各一端的半线宽(0.249)得内容高 284.00 / 58.35 / 56.80。
|
% 扣掉各一端的半线宽(0.249)得内容高 284.00 / 58.35 / 56.80。
|
||||||
@@ -122,14 +122,14 @@
|
|||||||
\newlength{\sxrule}
|
\newlength{\sxrule}
|
||||||
\setlength{\sxrule}{0.5pt} % = tblBorders sz 4/8
|
\setlength{\sxrule}{0.5pt} % = tblBorders sz 4/8
|
||||||
\newlength{\sxpad}
|
\newlength{\sxpad}
|
||||||
\setlength{\sxpad}{4.93bp} % 校到内容左界 52.08(实测 52.11)
|
\setlength{\sxpad}{4.93bp} % 校到内容左界 52.08(实际52.11)
|
||||||
|
|
||||||
\newlength{\sxboxw} % 单元格内容盒宽(不含边框)
|
\newlength{\sxboxw} % 单元格内容盒宽(不含边框)
|
||||||
\setlength{\sxboxw}{\dimexpr\sxtblw-2\sxrule\relax}
|
\setlength{\sxboxw}{\dimexpr\sxtblw-2\sxrule\relax}
|
||||||
|
|
||||||
% ⚠️⚠️ 段落折行的可用宽度 ≠ 盒宽。
|
% ⚠️⚠️ 段落折行的可用宽度 ≠ 盒宽。
|
||||||
% 折行可用宽 = \sxboxw − \sxpad − \sxbodypad。
|
% 折行可用宽 = \sxboxw − \sxpad − \sxbodypad。
|
||||||
% 原件实测:内容左界 52.08、右界 521.89 ⇒ 可用宽 469.81 bp。
|
% 原件内容左界 52.08、右界 521.89 ⇒ 可用宽 469.81 bp。
|
||||||
% ⚠️ 这 1.7 bp 是「折不折行」的临界。本表那句「项目负责人是科研经费
|
% ⚠️ 这 1.7 bp 是「折不折行」的临界。本表那句「项目负责人是科研经费
|
||||||
% 使用的直接责任人……」共 47 字,在 471.5 bp 里能挤成一行,
|
% 使用的直接责任人……」共 47 字,在 471.5 bp 里能挤成一行,
|
||||||
% 在 469.81 bp 里必须折行 —— 原件是两行。差一行 = 13.56 bp,
|
% 在 469.81 bp 里必须折行 —— 原件是两行。差一行 = 13.56 bp,
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
% 【坑一】\baselineskip 只在**同一段落内部**管行距。
|
% 【坑一】\baselineskip 只在**同一段落内部**管行距。
|
||||||
% 本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68),
|
% 本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68),
|
||||||
% 因为 10.5 pt 与 12 pt 的字混排,Word 按「下一行字号 × 1.3」算。
|
% 因为 10.5 pt 与 12 pt 的字混排,Word 按「下一行字号 × 1.3」算。
|
||||||
% 最初每行 \par 之后单独给 \baselineskip,实测**完全无效**:
|
% 最初每行 \par 之后单独给 \baselineskip,**完全无效**:
|
||||||
% 所有行距被压成 13.51,12 pt 的签名行没变高,整表矮 2.25 bp。
|
% 所有行距被压成 13.51,12 pt 的签名行没变高,整表矮 2.25 bp。
|
||||||
% 原因:每行 \par 自成一段后,段间基线距离 = 上段末行深度 +
|
% 原因:每行 \par 自成一段后,段间基线距离 = 上段末行深度 +
|
||||||
% \parskip + 本段首行字高,\baselineskip 根本没被读到。
|
% \parskip + 本段首行字高,\baselineskip 根本没被读到。
|
||||||
@@ -166,7 +166,7 @@
|
|||||||
%
|
%
|
||||||
% 【坑二】块首行必须用 \kern,不能用 \vskip。
|
% 【坑二】块首行必须用 \kern,不能用 \vskip。
|
||||||
% TeX 会【丢弃 \vbox 开头的胶】,用 \vskip 给的顶距静默消失
|
% TeX 会【丢弃 \vbox 开头的胶】,用 \vskip 给的顶距静默消失
|
||||||
% (实测「事项描述:」给 10.53 只落到 5.38,等于只剩字高)。
|
% (实际「事项描述:」给 10.53 只落到 5.38,等于只剩字高)。
|
||||||
% \kern 不受这条约束,且照样计入盒高。
|
% \kern 不受这条约束,且照样计入盒高。
|
||||||
%
|
%
|
||||||
% 【坑三】必须允许负的 \kern。
|
% 【坑三】必须允许负的 \kern。
|
||||||
@@ -179,13 +179,13 @@
|
|||||||
% \vbox 的 \ht = 首行高度 + (n−1)·行距,它的参考点是末行基线。
|
% \vbox 的 \ht = 首行高度 + (n−1)·行距,它的参考点是末行基线。
|
||||||
% 所以「上一行基线 → 本段首行基线」的距离不是 pd + kern + ht,
|
% 所以「上一行基线 → 本段首行基线」的距离不是 pd + kern + ht,
|
||||||
% 而是 pd + kern + ht − (n−1)·行距。漏掉这一项,
|
% 而是 pd + kern + ht − (n−1)·行距。漏掉这一项,
|
||||||
% 多行段自己会被推下一整行,其后所有行跟着错(实测 0.48 而非 14.04)。
|
% 多行段自己会被推下一整行,其后所有行跟着错(实际0.48 而非 14.04)。
|
||||||
% ⇒ 用 \prevgraf 取段内行数,把 (n−1)·行距加回 kern。
|
% ⇒ 用 \prevgraf 取段内行数,把 (n−1)·行距加回 kern。
|
||||||
% ⚠️ \dp 不用改:\vbox 的 \dp 就是末行的真实深度。
|
% ⚠️ \dp 不用改:\vbox 的 \dp 就是末行的真实深度。
|
||||||
%
|
%
|
||||||
% 【坑五】\offinterlineskip 会继承进段落内部。
|
% 【坑五】\offinterlineskip 会继承进段落内部。
|
||||||
% 它把 \lineskiplimit 设成极小值,段内多行改走 \lineskip(=0),
|
% 它把 \lineskiplimit 设成极小值,段内多行改走 \lineskip(=0),
|
||||||
% \baselineskip 又被架空(实测行距只剩 10.81 而非 13.56)。
|
% \baselineskip 又被架空(行距只剩 10.81 而非 13.56)。
|
||||||
% ⇒ 段落内部必须显式恢复 \lineskiplimit / \lineskip。
|
% ⇒ 段落内部必须显式恢复 \lineskiplimit / \lineskip。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newbox\sx@boxa
|
\newbox\sx@boxa
|
||||||
@@ -213,7 +213,7 @@
|
|||||||
% 给 0 表示「首行自然贴块顶、只留字高」。
|
% 给 0 表示「首行自然贴块顶、只留字高」。
|
||||||
% 后者用于 R0 下半块:那块是贴格底的,全部位置由
|
% 后者用于 R0 下半块:那块是贴格底的,全部位置由
|
||||||
% 「末行深度 + 逐行行距」反推出来,再给绝对顶距就重复
|
% 「末行深度 + 逐行行距」反推出来,再给绝对顶距就重复
|
||||||
% 定位了(实测多给 208.89,整块下移 66.90)。
|
% 定位了(实际多给 208.89,整块下移 66.90)。
|
||||||
\newcommand{\sx@bl}[3][\z@]{%
|
\newcommand{\sx@bl}[3][\z@]{%
|
||||||
\setbox\sx@boxc=\hbox to \sxboxw{\hskip\sxpad #3\hss}%
|
\setbox\sx@boxc=\hbox to \sxboxw{\hskip\sxpad #3\hss}%
|
||||||
\ifsx@first
|
\ifsx@first
|
||||||
@@ -246,9 +246,9 @@
|
|||||||
\noindent #4\par
|
\noindent #4\par
|
||||||
% ⚠️⚠️ \prevgraf 有两道坎:
|
% ⚠️⚠️ \prevgraf 有两道坎:
|
||||||
% ① 必须在 vbox **内部**取 —— 它是「当前正在排的段落行数」,
|
% ① 必须在 vbox **内部**取 —— 它是「当前正在排的段落行数」,
|
||||||
% vbox 一关闭就恢复成外层值(实测把 2 读成 0)。
|
% vbox 一关闭就恢复成外层值(实际把 2 读成 0)。
|
||||||
% ② 必须在 \par **之后**取 —— \prevgraf 是在段落断行那一步
|
% ② 必须在 \par **之后**取 —— \prevgraf 是在段落断行那一步
|
||||||
% 才被写入的,\par 之前读到的还是旧值(实测仍为 0)。
|
% 才被写入的,\par 之前读到的还是旧值(实际仍为 0)。
|
||||||
\global\sx@pgd=\dimexpr\numexpr\prevgraf-1\relax\dimexpr#3\relax\relax}%
|
\global\sx@pgd=\dimexpr\numexpr\prevgraf-1\relax\dimexpr#3\relax\relax}%
|
||||||
% 中间各行的推进总量
|
% 中间各行的推进总量
|
||||||
\sx@tmp=\sx@pgd
|
\sx@tmp=\sx@pgd
|
||||||
@@ -257,7 +257,7 @@
|
|||||||
% 块首行的 #2 直接是「块顶 → 首行基线」,不需要再扣多行推进量:
|
% 块首行的 #2 直接是「块顶 → 首行基线」,不需要再扣多行推进量:
|
||||||
% 多行段的 \ht 已经包含了「首行基线 → 末行基线」的全部推进,
|
% 多行段的 \ht 已经包含了「首行基线 → 末行基线」的全部推进,
|
||||||
% 而首行基线本身与段有几行无关。加回 pgd 会把首行推下一整行
|
% 而首行基线本身与段有几行无关。加回 pgd 会把首行推下一整行
|
||||||
% (实测描述两行偏 +10.39)。
|
% (实际描述两行偏 +10.39)。
|
||||||
\kern\dimexpr\ifdim#2>\z@#2-\fi\ht\sx@boxc\relax
|
\kern\dimexpr\ifdim#2>\z@#2-\fi\ht\sx@boxc\relax
|
||||||
\else
|
\else
|
||||||
\kern\dimexpr #2+\sx@tmp-\sx@pd-\ht\sx@boxc\relax
|
\kern\dimexpr #2+\sx@tmp-\sx@pd-\ht\sx@boxc\relax
|
||||||
@@ -274,14 +274,14 @@
|
|||||||
% \sx@put{偏移}{内容} —— 在「内容左界 + 偏移」处放置内容
|
% \sx@put{偏移}{内容} —— 在「内容左界 + 偏移」处放置内容
|
||||||
%
|
%
|
||||||
% 原件的签名行、年月日全靠敲空格凑位置(R0 签名前是 30 个 14 pt 空格),
|
% 原件的签名行、年月日全靠敲空格凑位置(R0 签名前是 30 个 14 pt 空格),
|
||||||
% 换台机器字号一改就散架。这里按实测 x 坐标绝对定位,不随字体漂移。
|
% 换台机器字号一改就散架。这里按实际x 坐标绝对定位,不随字体漂移。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 用 \rlap(= \hbox to 0pt{...\hss})而非 \makebox[0pt][l]:
|
% ⚠️⚠️ 用 \rlap(= \hbox to 0pt{...\hss})而非 \makebox[0pt][l]:
|
||||||
% 两者都是零宽盒左对齐,但 \makebox 内容超宽会报 Overfull \hbox
|
% 两者都是零宽盒左对齐,但 \makebox 内容超宽会报 Overfull \hbox
|
||||||
% (签名下划线 84 bp 必然超),\rlap 末尾有 \hss 吸收,静默通过。
|
% (签名下划线 84 bp 必然超),\rlap 末尾有 \hss 吸收,静默通过。
|
||||||
% 因零宽,一行串多个 \sx@put 时共用同一原点,偏移各自独立。
|
% 因零宽,一行串多个 \sx@put 时共用同一原点,偏移各自独立。
|
||||||
%
|
%
|
||||||
% 偏移 = 「Word 导出 PDF 实测 x」− 52.08(内容左界)
|
% 偏移 = 「Word 导出 PDF 实际x」− 52.08(内容左界)
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
\newcommand{\sx@put}[2]{%
|
\newcommand{\sx@put}[2]{%
|
||||||
\rlap{\hspace*{#1}#2}}
|
\rlap{\hspace*{#1}#2}}
|
||||||
@@ -300,7 +300,7 @@
|
|||||||
|
|
||||||
% \sx@cellvf{高度}{上半}{下半} 中间 \vfil 撑开 ⇒ 下半贴格底
|
% \sx@cellvf{高度}{上半}{下半} 中间 \vfil 撑开 ⇒ 下半贴格底
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 这里踩过一个非直觉的坑:
|
% ⚠️⚠️ 非直觉之处:
|
||||||
% 最初写「先 \setbox 量内容,再 \vbox to <高>{\box\sx@box\vfil}」,
|
% 最初写「先 \setbox 量内容,再 \vbox to <高>{\box\sx@box\vfil}」,
|
||||||
% 结果 R0 的「兹证明」跑到描述正下方(y=261.95,原件 382.13),
|
% 结果 R0 的「兹证明」跑到描述正下方(y=261.95,原件 382.13),
|
||||||
% 整块偏高 120 bp。
|
% 整块偏高 120 bp。
|
||||||
@@ -321,7 +321,7 @@
|
|||||||
% \vbox to N 设定的是**高度**,深度另计:若最后一项是 \box\sx@boxb
|
% \vbox to N 设定的是**高度**,深度另计:若最后一项是 \box\sx@boxb
|
||||||
% 且它自带深度(本表末行深 3.11),则 vbox 的 \dp = 3.11,
|
% 且它自带深度(本表末行深 3.11),则 vbox 的 \dp = 3.11,
|
||||||
% 总高变成 N + 3.11,整行高三点一一,四条横线全部下移
|
% 总高变成 N + 3.11,整行高三点一一,四条横线全部下移
|
||||||
% (实测 R0 = 287.11 而非 284.00)。
|
% (实际R0 = 287.11 而非 284.00)。
|
||||||
% 补一条零高胶让末项变成胶(胶无深度),\dp 归零,
|
% 补一条零高胶让末项变成胶(胶无深度),\dp 归零,
|
||||||
% 总高才正好等于 N。
|
% 总高才正好等于 N。
|
||||||
\ifdim\dimexpr\ht\sx@boxa+\ht\sx@boxb+\dp\sx@boxb\relax<#1
|
\ifdim\dimexpr\ht\sx@boxa+\ht\sx@boxb+\dp\sx@boxb\relax<#1
|
||||||
@@ -333,8 +333,8 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 5. 标题
|
% 5. 标题
|
||||||
%
|
%
|
||||||
% 原 docx:22 pt 小标宋(→ 宋体真粗体),居中,标题段行距 25 pt。
|
% :22 pt 小标宋(→ 宋体真粗体),居中,标题段行距 25 pt。
|
||||||
% 实测:文字中心 x = 300.41 bp,基线 y = 147.65。
|
% 文字中心 x = 300.41 bp,基线 y = 147.65。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 为什么不能直接 \centering:
|
% ⚠️⚠️ 为什么不能直接 \centering:
|
||||||
% 本包版心 16.47~186.01 mm,中心 287.03 bp;
|
% 本包版心 16.47~186.01 mm,中心 287.03 bp;
|
||||||
@@ -348,13 +348,13 @@
|
|||||||
\setlength{\sxtitleindent}{\dimexpr\sxofficialleft-\sxtblleft\relax}
|
\setlength{\sxtitleindent}{\dimexpr\sxofficialleft-\sxtblleft\relax}
|
||||||
\newlength{\sxtitlewidth}
|
\newlength{\sxtitlewidth}
|
||||||
\setlength{\sxtitlewidth}{156mm}
|
\setlength{\sxtitlewidth}{156mm}
|
||||||
% 实测微调:标题中心原偏右 0.60 bp(字形宽度差所致)
|
% 微调:标题中心原偏右 0.60 bp(字形宽度差所致)
|
||||||
\newlength{\sxtitlefix}
|
\newlength{\sxtitlefix}
|
||||||
\setlength{\sxtitlefix}{-0.60bp}
|
\setlength{\sxtitlefix}{-0.60bp}
|
||||||
|
|
||||||
% 标题前/后竖直距离(由 PDF 实测反推,见 README「实测记录」)
|
% 标题前/后竖直距离(由 PDF 实际反推,见 README「实际记录」)
|
||||||
% ⚠️ 这两个值必须成对调:\sxprespace 在标题前、\sxpostspace 在标题后,
|
% ⚠️ 这两个值必须成对调:\sxprespace 在标题前、\sxpostspace 在标题后,
|
||||||
% 单独改一个会把标题与表格的间距一起改掉。实测标定见 README。
|
% 单独改一个会把标题与表格的间距一起改掉。标定见 README。
|
||||||
\newlength{\sxprespace}
|
\newlength{\sxprespace}
|
||||||
\setlength{\sxprespace}{10.07bp}
|
\setlength{\sxprespace}{10.07bp}
|
||||||
\newlength{\sxpostspace}
|
\newlength{\sxpostspace}
|
||||||
@@ -406,13 +406,13 @@
|
|||||||
% \sxdateC 科技管理部门签字处日期
|
% \sxdateC 科技管理部门签字处日期
|
||||||
%
|
%
|
||||||
% ⚠️ 为什么不让 .tex 改整行:原件里这些行全靠敲空格对齐,一旦让
|
% ⚠️ 为什么不让 .tex 改整行:原件里这些行全靠敲空格对齐,一旦让
|
||||||
% 用户自己写,每人写出来都不一样,模板就失去意义。这里按实测
|
% 用户自己写,每人写出来都不一样,模板就失去意义。这里按实际
|
||||||
% x 坐标把固定部分钉死,.tex 只需填描述与日期。
|
% x 坐标把固定部分钉死,.tex 只需填描述与日期。
|
||||||
%
|
%
|
||||||
% ------------------------------------------------------------------
|
% ------------------------------------------------------------------
|
||||||
% R0 纵向结构(全表最麻烦的一处)
|
% R0 纵向结构(全表最麻烦的一处)
|
||||||
%
|
%
|
||||||
% 原 docx R0 共 19 段:1「事项描述:」/ 2~3 空 / 4 描述正文 /
|
% R0 共 19 段:1「事项描述:」/ 2~3 空 / 4 描述正文 /
|
||||||
% 5~12 八个空段(给手写留白)/ 13 空 / 14「兹证明…」/ 15 签名 /
|
% 5~12 八个空段(给手写留白)/ 13 空 / 14「兹证明…」/ 15 签名 /
|
||||||
% 16 年月日 / 17「项目负责人是…」/ 18「非科研经费…」
|
% 16 年月日 / 17「项目负责人是…」/ 18「非科研经费…」
|
||||||
%
|
%
|
||||||
@@ -426,7 +426,7 @@
|
|||||||
% 这是内容超量的正常表现(Word 里也一样),不是 bug。
|
% 这是内容超量的正常表现(Word 里也一样),不是 bug。
|
||||||
%
|
%
|
||||||
% ------------------------------------------------------------------
|
% ------------------------------------------------------------------
|
||||||
% 实测基线(PDF 绝对 y;Δ 为与上一行的基线距)
|
% 实际基线(PDF 绝对 y;Δ 为与上一行的基线距)
|
||||||
%
|
%
|
||||||
% R0(顶线 172.99,内容顶 173.24)
|
% R0(顶线 172.99,内容顶 173.24)
|
||||||
% 事项描述 183.77 (10.53)
|
% 事项描述 183.77 (10.53)
|
||||||
@@ -503,7 +503,7 @@
|
|||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% R1 —— 单位负责人签字 + 单位公章
|
% R1 —— 单位负责人签字 + 单位公章
|
||||||
% 实测下划线 x 187.05~253.05(长 66 bp);「单位公章:」后不画线。
|
% 实际下划线 x 187.05~253.05(长 66 bp);「单位公章:」后不画线。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
\newcommand{\sx@rowB}{%
|
\newcommand{\sx@rowB}{%
|
||||||
\sxfontbody\songti
|
\sxfontbody\songti
|
||||||
@@ -535,14 +535,14 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 8. 备注区
|
% 8. 备注区
|
||||||
%
|
%
|
||||||
% 原 docx 三条备注是「annotation text」样式 + 自动编号(decimal "%1."),
|
% 三条备注是「annotation text」样式 + 自动编号(decimal "%1."),
|
||||||
% 行距 15 pt。实测基线 585.89 / 600.89 / 615.89 / 630.89(间距 15)。
|
% 行距 15 pt。实际基线 585.89 / 600.89 / 615.89 / 630.89(间距 15)。
|
||||||
% 实测 x: 「备注:」79.44,编号「1.」95.16~103.05,正文 113.16
|
% 实际x: 「备注:」79.44,编号「1.」95.16~103.05,正文 113.16
|
||||||
% ⇒ 减内容左界 52.08:27.36 / 50.97 / 61.08
|
% ⇒ 减内容左界 52.08:27.36 / 50.97 / 61.08
|
||||||
%
|
%
|
||||||
% ⚠️ 四条同样不能用 \baselineskip —— 各自独立成段(同第 4 节坑一)。
|
% ⚠️ 四条同样不能用 \baselineskip —— 各自独立成段(同第 4 节坑一)。
|
||||||
%
|
%
|
||||||
% ⚠️ 第 3 条在原 docx 里是**手打的**「 3. 」(没有 numPr),
|
% ⚠️ 第 3 条在里是**手打的**「 3. 」(没有 numPr),
|
||||||
% 比前两条多两个空格、位置差 0.36 bp。本模板统一排齐,
|
% 比前两条多两个空格、位置差 0.36 bp。本模板统一排齐,
|
||||||
% 这是与原件唯一的有意差异(README「与原件差异」已列明)。
|
% 这是与原件唯一的有意差异(README「与原件差异」已列明)。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -568,7 +568,7 @@
|
|||||||
% ⚠️ 引言「备注:使用科研经费报销时……」是**连排的一句话**,
|
% ⚠️ 引言「备注:使用科研经费报销时……」是**连排的一句话**,
|
||||||
% 「备注:」不是悬挂标签,整行从 79.44 起排,故只需一个 \sx@put。
|
% 「备注:」不是悬挂标签,整行从 79.44 起排,故只需一个 \sx@put。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 第一行的「块顶 → 首行基线」:实测 585.89 − 表格底 573.89 = 12.00
|
% 第一行的「块顶 → 首行基线」:实际585.89 − 表格底 573.89 = 12.00
|
||||||
\newcommand{\sxnotes}{%
|
\newcommand{\sxnotes}{%
|
||||||
\par\nointerlineskip
|
\par\nointerlineskip
|
||||||
\vbox{%
|
\vbox{%
|
||||||
@@ -583,12 +583,11 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 9. 页脚
|
% 9. 页脚
|
||||||
%
|
%
|
||||||
% 原 docx 页脚:右对齐「— 1 —」,宋体 14 pt,右缩进 180 twips = 9 pt。
|
% 页脚:右对齐「— 1 —」,宋体 14 pt,右缩进 180 twips = 9 pt。
|
||||||
% 实测整串左端 463.56、右端 512.65。本包版心右界 527.02,
|
% 实际整串左端 463.56、右端 512.65。本包版心右界 527.02,
|
||||||
% 故整串需再左移 527.02 − 512.65 = 14.37 bp。
|
% 故整串需再左移 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 并前置
|
% 原因:fancyhdr 的 [R] 位把内容放进 \hbox to \textwidth 并前置
|
||||||
% \hfil,靠「内容块整体贴右」对齐。开头加负 \hspace 只把块起点
|
% \hfil,靠「内容块整体贴右」对齐。开头加负 \hspace 只把块起点
|
||||||
% 左移,块宽没变,右边界仍贴版心右界。
|
% 左移,块宽没变,右边界仍贴版心右界。
|
||||||
|
|||||||
+1
-2
@@ -6,13 +6,12 @@
|
|||||||
% 颜色一律引用 cls/color.cls 里的语义名(oucinfo / oucalert ...),
|
% 颜色一律引用 cls/color.cls 里的语义名(oucinfo / oucalert ...),
|
||||||
% 不在这里写具体色名,更不写 RGB 值。
|
% 不在这里写具体色名,更不写 RGB 值。
|
||||||
%
|
%
|
||||||
% 【关于内容块里的 3 个 Underfull \hbox(#19 记录)】
|
% 【关于内容块里的 3 个 Underfull \hbox(记录)】
|
||||||
%
|
%
|
||||||
% 第 208/214/220 行那三段示例文字里有 \verb|Illuminate\Foundation\Http\Kernel|,
|
% 第 208/214/220 行那三段示例文字里有 \verb|Illuminate\Foundation\Http\Kernel|,
|
||||||
% 这个 35 字符的串在 \verb 里**不能断行**,整行只能把它塞进去,于是那行
|
% 这个 35 字符的串在 \verb 里**不能断行**,整行只能把它塞进去,于是那行
|
||||||
% 被撑松 —— 报 Underfull (badness 1231)。
|
% 被撑松 —— 报 Underfull (badness 1231)。
|
||||||
%
|
%
|
||||||
% 试过且**无效**的方案(别重复踩):
|
|
||||||
% · \emergencystretch 2em / 10em —— 无效。它不是"额度不够"的问题:
|
% · \emergencystretch 2em / 10em —— 无效。它不是"额度不够"的问题:
|
||||||
% 这一行没有足够的可拉伸 glue 可用,给多少额度都无从施展。
|
% 这一行没有足够的可拉伸 glue 可用,给多少额度都无从施展。
|
||||||
% · \sloppy —— 反而更差,badness 从 1231 升到 3590(放宽了断行标准,
|
% · \sloppy —— 反而更差,badness 从 1231 升到 3590(放宽了断行标准,
|
||||||
|
|||||||
+1
-4
@@ -52,7 +52,6 @@
|
|||||||
%
|
%
|
||||||
% ⚠️⚠️ 西文为什么从 HarmonyOS 换成 Cochineal(2026-10 改,#19)
|
% ⚠️⚠️ 西文为什么从 HarmonyOS 换成 Cochineal(2026-10 改,#19)
|
||||||
%
|
%
|
||||||
% 旧版这里 \setmainfont / \setsansfont / \setmonofont 三处全是鸿蒙。
|
|
||||||
% 中文换成思源宋体之后,正文就成了「中文衬线 + 西文无衬线」,
|
% 中文换成思源宋体之后,正文就成了「中文衬线 + 西文无衬线」,
|
||||||
% 同一行里英文数字明显比汉字细、比汉字"陷进去",读起来割裂。
|
% 同一行里英文数字明显比汉字细、比汉字"陷进去",读起来割裂。
|
||||||
%
|
%
|
||||||
@@ -83,7 +82,6 @@
|
|||||||
]
|
]
|
||||||
|
|
||||||
% 等宽位:真等宽,供代码块(listings 的 \ttfamily)使用。
|
% 等宽位:真等宽,供代码块(listings 的 \ttfamily)使用。
|
||||||
% 旧版这里也是鸿蒙 —— 它不是等宽字体,代码里 i/l/1、m/w 宽度不一,
|
|
||||||
% 竖向对不齐,缩进看起来是歪的。
|
% 竖向对不齐,缩进看起来是歪的。
|
||||||
% lmmono(Latin Modern Mono)是 TeX Live 自带,无需额外字体文件。
|
% lmmono(Latin Modern Mono)是 TeX Live 自带,无需额外字体文件。
|
||||||
%
|
%
|
||||||
@@ -117,7 +115,7 @@
|
|||||||
\XeTeXlinebreakskip = 0pt plus 1pt
|
\XeTeXlinebreakskip = 0pt plus 1pt
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 二之二、重定义 \hm:中文与西文一起切到鸿蒙(#19)
|
% 二之二、重定义 \hm:中文与西文一起切到鸿蒙
|
||||||
%
|
%
|
||||||
% 问题:fonts.tex 里的 \hm 是 \def\hm{\CJKfamily{OUCHM}} —— 这只是
|
% 问题:fonts.tex 里的 \hm 是 \def\hm{\CJKfamily{OUCHM}} —— 这只是
|
||||||
% xeCJK 的**中文字族**切换,管不到阿拉伯数字和拉丁字母。而本模板的
|
% xeCJK 的**中文字族**切换,管不到阿拉伯数字和拉丁字母。而本模板的
|
||||||
@@ -174,7 +172,6 @@
|
|||||||
\newcommand{\fzkai}{\CJKfamily{fzkai}}
|
\newcommand{\fzkai}{\CJKfamily{fzkai}}
|
||||||
|
|
||||||
% 仿宋(原方正仿宋)—— 斜体位
|
% 仿宋(原方正仿宋)—— 斜体位
|
||||||
% ⚠️ 朱雀仿宋只有常规一档。旧版这里配的是"方正仿宋",也是常规字面,
|
|
||||||
% 所以观感一致;但若在 \fzfs 下用 \bfseries,不会真的变粗。
|
% 所以观感一致;但若在 \fzfs 下用 \bfseries,不会真的变粗。
|
||||||
\setCJKfamilyfont{fzfs}[
|
\setCJKfamilyfont{fzfs}[
|
||||||
Extension = .ttf,
|
Extension = .ttf,
|
||||||
|
|||||||
+2
-2
@@ -3,7 +3,7 @@
|
|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 各级标题字体(#19)
|
% 各级标题字体
|
||||||
%
|
%
|
||||||
% 目标:编号和标题文字**都是鸿蒙**。
|
% 目标:编号和标题文字**都是鸿蒙**。
|
||||||
%
|
%
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} % 给 sections加点
|
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} % 给 sections加点
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 目录条目的字族统一(#19)
|
% 目录条目的字族统一
|
||||||
%
|
%
|
||||||
% 问题:一条目录里能出现两种字体。编号 "1." 是阿拉伯数字 → 被 xeCJK
|
% 问题:一条目录里能出现两种字体。编号 "1." 是阿拉伯数字 → 被 xeCJK
|
||||||
% 判成西文 → 走 \setmainfont;条目标题是中文 → 走 \setCJKmainfont。
|
% 判成西文 → 走 \setmainfont;条目标题是中文 → 走 \setCJKmainfont。
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
% 视觉上"挂在页眉区",明确在版面结构内,又不会挤压正文。
|
% 视觉上"挂在页眉区",明确在版面结构内,又不会挤压正文。
|
||||||
% ⚠️ 别把 20mm 改得更小:A4 印刷 / 装订裁切余量一般 10~12mm,
|
% ⚠️ 别把 20mm 改得更小:A4 印刷 / 装订裁切余量一般 10~12mm,
|
||||||
% 改到 15mm 以下有被裁掉的风险。
|
% 改到 15mm 以下有被裁掉的风险。
|
||||||
% ⚠️ logo 下沿距首条横线约 12mm(实测),若改 width 或 yshift,
|
% ⚠️ logo 下沿距首条横线约 12mm(实际),若改 width 或 yshift,
|
||||||
% 记得重新确认这个间隙,太大显得松散、太小挤成一团。
|
% 记得重新确认这个间隙,太大显得松散、太小挤成一团。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
\newcommand{\coverlogo}{%
|
\newcommand{\coverlogo}{%
|
||||||
|
|||||||
@@ -395,7 +395,7 @@
|
|||||||
% 简历页边距只有 15mm(科技报告是 27mm),抬头第一行「姓名」的墨迹顶
|
% 简历页边距只有 15mm(科技报告是 27mm),抬头第一行「姓名」的墨迹顶
|
||||||
% 就在 48.8pt = 17.2mm。28mm 宽的横式 logo 高 7.06mm,若距顶 20mm
|
% 就在 48.8pt = 17.2mm。28mm 宽的横式 logo 高 7.06mm,若距顶 20mm
|
||||||
% 会直接压到姓名上,距顶 8mm 也只剩 6pt 间隙(2mm,视觉上贴着)。
|
% 会直接压到姓名上,距顶 8mm 也只剩 6pt 间隙(2mm,视觉上贴着)。
|
||||||
% 实测 6mm 时 logo 下沿在 13.1mm,仍在 15mm 版心边距以内,
|
% 实际6mm 时 logo 下沿在 13.1mm,仍在 15mm 版心边距以内,
|
||||||
% 距姓名顶有 11.6pt(4.1mm),是这块空间里最平衡的位置。
|
% 距姓名顶有 11.6pt(4.1mm),是这块空间里最平衡的位置。
|
||||||
%
|
%
|
||||||
% ⚠️ 距纸左 10mm 已接近 A4 打印的裁切余量(一般 10~12mm),
|
% ⚠️ 距纸左 10mm 已接近 A4 打印的裁切余量(一般 10~12mm),
|
||||||
@@ -405,11 +405,11 @@
|
|||||||
%
|
%
|
||||||
% ⚠️⚠️ 为什么后面跟着 \vspace*{-17pt}:
|
% ⚠️⚠️ 为什么后面跟着 \vspace*{-17pt}:
|
||||||
% tikzpicture 即使全部内容都是 overlay,它本身仍是一个**占一行的盒子**,
|
% tikzpicture 即使全部内容都是 overlay,它本身仍是一个**占一行的盒子**,
|
||||||
% 插在 \makecvheader 前面会把姓名整体往下推 17pt(实测 48.8 → 65.8)。
|
% 插在 \makecvheader 前面会把姓名整体往下推 17pt(实际48.8 → 65.8)。
|
||||||
% \smash、\hbox to 0pt、\vbox to 0pt 三种写法都消不掉这一行
|
% \smash、\hbox to 0pt、\vbox to 0pt 三种写法都消不掉这一行
|
||||||
% (因为要断行就必须有 \par,有 \par 就有行高)。
|
% (因为要断行就必须有 \par,有 \par 就有行高)。
|
||||||
% 直接用等量的负 \vspace 抵消,实测姓名回到 48.8pt,误差 0.0。
|
% 直接用等量的负 \vspace 抵消,姓名回到 48.8pt,误差 0.0。
|
||||||
% ⚠️ 这个 17pt 与 logo 尺寸无关(18~30mm 五档实测姓名都是 48.8),
|
% ⚠️ 这个 17pt 与 logo 尺寸无关(18~30mm 五档实际姓名都是 48.8),
|
||||||
% 它是一行正文的高度。但若改了 \parskip 或正文字号,要重新量。
|
% 它是一行正文的高度。但若改了 \parskip 或正文字号,要重新量。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
\newlength{\cvlogox}
|
\newlength{\cvlogox}
|
||||||
@@ -676,7 +676,7 @@
|
|||||||
% 类别名随用随建,不需要预先注册。
|
% 类别名随用随建,不需要预先注册。
|
||||||
%
|
%
|
||||||
% ⚠️ 为什么用独立数据文件而不是 LaTeX 的 aux:
|
% ⚠️ 为什么用独立数据文件而不是 LaTeX 的 aux:
|
||||||
% 实测中文键经 aux 往返后 \ifcsname 全部匹配不上(xeCJK 把汉字设为
|
% 实际中文键经 aux 往返后 \ifcsname 全部匹配不上(xeCJK 把汉字设为
|
||||||
% 活动字符,键的 token 形态与写入时不一致;ASCII 键正常,中文键失效)。
|
% 活动字符,键的 token 形态与写入时不一致;ASCII 键正常,中文键失效)。
|
||||||
% 故改用独立文件 \jobname.cvnum,导言区末尾 \input,键原样保留。
|
% 故改用独立文件 \jobname.cvnum,导言区末尾 \input,键原样保留。
|
||||||
%
|
%
|
||||||
|
|||||||
+18
-22
@@ -45,7 +45,7 @@
|
|||||||
\AtBeginDocument{\linespread{1}\Fivhao\selectfont}
|
\AtBeginDocument{\linespread{1}\Fivhao\selectfont}
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 2. 字体(#20:全部统一为思源宋体)
|
% 2. 字体(全部统一为思源宋体)
|
||||||
% 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下)。
|
% 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下)。
|
||||||
%
|
%
|
||||||
% ★ 本版把试卷的所有文字统一为**思源宋体(OUC Serif)**,中西文同一字族:
|
% ★ 本版把试卷的所有文字统一为**思源宋体(OUC Serif)**,中西文同一字族:
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
% 成绩表"题号/得分/一~八/总分" OUC Serif ✅ 原为霞鹜文楷
|
% 成绩表"题号/得分/一~八/总分" OUC Serif ✅ 原为霞鹜文楷
|
||||||
%
|
%
|
||||||
% ⚠️ 为什么西文也能用思源宋体
|
% ⚠️ 为什么西文也能用思源宋体
|
||||||
% 已实测 OUCSerif-Regular.otf / -Bold.otf:13714 字形、cmap 7555 条,
|
% 已实际OUCSerif-Regular.otf / -Bold.otf:13714 字形、cmap 7555 条,
|
||||||
% ASCII 字母数字与常用标点 35/35 全部命中。它不是纯中文字体,
|
% ASCII 字母数字与常用标点 35/35 全部命中。它不是纯中文字体,
|
||||||
% 西文字形是配套设计的,与汉字同灰度 —— 这正是要的效果。
|
% 西文字形是配套设计的,与汉字同灰度 —— 这正是要的效果。
|
||||||
%
|
%
|
||||||
@@ -69,14 +69,13 @@
|
|||||||
% 句点 . 0.327 vs 0.250 (+0.077)
|
% 句点 . 0.327 vs 0.250 (+0.077)
|
||||||
% 连字符 - 0.346 vs 0.333 (+0.013)
|
% 连字符 - 0.346 vs 0.333 (+0.013)
|
||||||
% 影响:题号、分值、页码右移约 6%,题干里的英文单词变长。
|
% 影响:题号、分值、页码右移约 6%,题干里的英文单词变长。
|
||||||
% 这是用户明确要求"全部用思源宋体"的必然代价,已确认接受。
|
|
||||||
%
|
%
|
||||||
% ⚠️ 装订线的 4 组连字符虚线已改为**用线画**(见第 6 节),
|
% ⚠️ 装订线的 4 组连字符虚线已改为**用线画**(见第 6 节),
|
||||||
% 不再受字体宽度影响。旧版是靠 18bp 连字符排出来的,
|
% 不再受字体宽度影响。旧版是靠 18bp 连字符排出来的,
|
||||||
% 换字体后每串会长 4~7bp,故锁定为几何坐标。
|
% 换字体后每串会长 4~7bp,故锁定为几何坐标。
|
||||||
%
|
%
|
||||||
% ⚠️ 数学公式**不在统一范围内**(答案卷的 $x$、$\dfrac{}{}$ 等仍走
|
% ⚠️ 数学公式**不在统一范围内**(答案卷的 $x$、$\dfrac{}{}$ 等仍走
|
||||||
% Computer Modern)。理由:思源宋体没有 MATH 表(实测只有
|
% Computer Modern)。理由:思源宋体没有 MATH 表(实际只有
|
||||||
% GSUB/GPOS),不能作数学字体;强行塞进正文字体会破坏斜体变量、
|
% GSUB/GPOS),不能作数学字体;强行塞进正文字体会破坏斜体变量、
|
||||||
% 正体数字、运算符间距这些数学排版规则。用户已确认保持不动。
|
% 正体数字、运算符间距这些数学排版规则。用户已确认保持不动。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -123,7 +122,6 @@
|
|||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 把**默认西文字体**也换成思源宋体(这是关键一步)
|
% 把**默认西文字体**也换成思源宋体(这是关键一步)
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 只重定向 \tnr / \tnrb 是**不够**的,这一点踩过:
|
|
||||||
% 模板里有大量文字**根本没走 \tnr**,而是走 \setmainfont(默认西文族):
|
% 模板里有大量文字**根本没走 \tnr**,而是走 \setmainfont(默认西文族):
|
||||||
% · \textbf{learning outcome} —— 裸加粗,西文走 \setmainfont
|
% · \textbf{learning outcome} —— 裸加粗,西文走 \setmainfont
|
||||||
% · 页脚的页码 / 总页数 —— \node{...\thepage} 裸排
|
% · 页脚的页码 / 总页数 —— \node{...\thepage} 裸排
|
||||||
@@ -177,7 +175,7 @@
|
|||||||
\let\sunfont\OUCLatinSerif
|
\let\sunfont\OUCLatinSerif
|
||||||
|
|
||||||
% \kaiti 在试卷里只用于卷头填空与成绩表题号(见 \kh / \scoretable)。
|
% \kaiti 在试卷里只用于卷头填空与成绩表题号(见 \kh / \scoretable)。
|
||||||
% #20 要求统一为思源宋体,故整个包内把 \kaiti 也指到思源宋体。
|
%为思源宋体,故整个包内把 \kaiti 也指到思源宋体。
|
||||||
% ⚠️ 用 \let 而不是改 \def\kaiti —— 后者会破坏 ../fonts.tex 的定义,
|
% ⚠️ 用 \let 而不是改 \def\kaiti —— 后者会破坏 ../fonts.tex 的定义,
|
||||||
% 而 \kaiti 在别的模板里还要用楷体。
|
% 而 \kaiti 在别的模板里还要用楷体。
|
||||||
% ⚠️ 若将来要恢复楷体卷头,把下面这行注释掉即可,其余代码不用动。
|
% ⚠️ 若将来要恢复楷体卷头,把下面这行注释掉即可,其余代码不用动。
|
||||||
@@ -186,7 +184,7 @@
|
|||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% ⚠️ xeCJK 陷阱:字体切换命令若紧邻 \par(或位于段落末尾),
|
% ⚠️ xeCJK 陷阱:字体切换命令若紧邻 \par(或位于段落末尾),
|
||||||
% 该段结束时的字体状态会"溢出"到后续段落,导致后面的 ASCII
|
% 该段结束时的字体状态会"溢出"到后续段落,导致后面的 ASCII
|
||||||
% 字符全部被排成 Times(实测:\tnr{ABC}\par 会让下一段的 "3" 变 Times)。
|
% 字符全部被排成 Times(\tnr{ABC}\par 会让下一段的 "3" 变 Times)。
|
||||||
% 故所有局部字体切换一律走下面两个包装:内部显式 \normalfont 收尾。
|
% 故所有局部字体切换一律走下面两个包装:内部显式 \normalfont 收尾。
|
||||||
% ⇒ 正文中请用 \TNR{...} / \TNRB{...} / \SUN{...},不要裸用 \tnr。
|
% ⇒ 正文中请用 \TNR{...} / \TNRB{...} / \SUN{...},不要裸用 \tnr。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
@@ -205,7 +203,7 @@
|
|||||||
\def\@spreadeach#1{%
|
\def\@spreadeach#1{%
|
||||||
\ifx#1\@nil\else\hspace*{\spread@amt}#1\expandafter\@spreadeach\fi}
|
\ifx#1\@nil\else\hspace*{\spread@amt}#1\expandafter\@spreadeach\fi}
|
||||||
|
|
||||||
% 中文与西文间自动间距:原卷实测固定 2.70bp(不随字号缩放,
|
% 中文与西文间自动间距:原卷实际固定 2.70bp(不随字号缩放,
|
||||||
% 故用绝对 bp 而非 em;原卷 10.5bp 与 12bp 处均为 2.7bp)
|
% 故用绝对 bp 而非 em;原卷 10.5bp 与 12bp 处均为 2.7bp)
|
||||||
\xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain}
|
\xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain}
|
||||||
|
|
||||||
@@ -238,7 +236,7 @@
|
|||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 页脚是否印"试卷类型字母"(课程名之后那个 A / B)
|
% 页脚是否印"试卷类型字母"(课程名之后那个 A / B)
|
||||||
%
|
%
|
||||||
% ★ 原卷实测:A 卷页脚【没有】字母(数字逻辑 + 一串短横线),
|
% ★ 原卷A 卷页脚【没有】字母(数字逻辑 + 一串短横线),
|
||||||
% B 卷页脚【有】B(392.48 处)。
|
% B 卷页脚【有】B(392.48 处)。
|
||||||
% 即:这是出卷人手工敲的,不是规则。故默认不印,需要时显式打开:
|
% 即:这是出卷人手工敲的,不是规则。故默认不印,需要时显式打开:
|
||||||
% \examsetup{foottype = {B}} → 页脚印 B
|
% \examsetup{foottype = {B}} → 页脚印 B
|
||||||
@@ -250,7 +248,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 5. 页脚:+…………………………课程名称 X……… 第 N 页 共 M 页 + 基线 713.33bp
|
% 5. 页脚:+…………………………课程名称 X……… 第 N 页 共 M 页 + 基线 713.33bp
|
||||||
%
|
%
|
||||||
% 本地实测(原卷字符级):
|
% 本地(原卷字符级):
|
||||||
% 82.20 '+' | 91.20~343.20 连续 29 个 '…'(每个步距 9.00)
|
% 82.20 '+' | 91.20~343.20 连续 29 个 '…'(每个步距 9.00)
|
||||||
% 352.20 起课程名(长度不定)| 类型字母在 390.48
|
% 352.20 起课程名(长度不定)| 类型字母在 390.48
|
||||||
% 396.48 起 3 个 '…' | 432.48 '第' | 443.64 页码 | 448.20 '页'
|
% 396.48 起 3 个 '…' | 432.48 '第' | 443.64 页码 | 448.20 '页'
|
||||||
@@ -361,7 +359,7 @@
|
|||||||
% \bindstrip[1.3,on] → 强制画 + 下移
|
% \bindstrip[1.3,on] → 强制画 + 下移
|
||||||
% 局部覆盖单页:\ouc@bindforce 置 1/0
|
% 局部覆盖单页:\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
|
% 竖虚线 x=33.8,5 段:101.1~148.5 / 222.4~290.8 / 359.4~427.9
|
||||||
% 489.3~557.8 / 600.0~668.6
|
% 489.3~557.8 / 600.0~668.6
|
||||||
% 18bp Times 连字符串 x=55.69("装/订/线"三字压在上面,白底遮断)
|
% 18bp Times 连字符串 x=55.69("装/订/线"三字压在上面,白底遮断)
|
||||||
@@ -398,7 +396,6 @@
|
|||||||
% #2 = 笔画个数
|
% #2 = 笔画个数
|
||||||
% 相邻笔画顶端间隔 6.00bp,与原卷 18bp 连字符的步距一致。
|
% 相邻笔画顶端间隔 6.00bp,与原卷 18bp 连字符的步距一致。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 方向别搞反(#20 返工过一次,记清楚):
|
|
||||||
% 原卷的连字符是 rotate=90 排的,所以连字符的**横向长度转到了纵轴**、
|
% 原卷的连字符是 rotate=90 排的,所以连字符的**横向长度转到了纵轴**、
|
||||||
% **线粗转到了横轴**。也就是说每一笔是「竖着的短杠」,不是「横着的短杠」:
|
% **线粗转到了横轴**。也就是说每一笔是「竖着的短杠」,不是「横着的短杠」:
|
||||||
% 竖:y 跨 4.30bp(这是连字符的字面长度)
|
% 竖:y 跨 4.30bp(这是连字符的字面长度)
|
||||||
@@ -406,9 +403,8 @@
|
|||||||
% 中心 x = 51.60bp
|
% 中心 x = 51.60bp
|
||||||
% 第一版按"水平线"画((49.40,y)--(53.70,y)),结果整条装订线变成
|
% 第一版按"水平线"画((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.10~52.10,即字形在字符盒内偏右、
|
||||||
% 中心 51.60 —— 这是 Times 连字符的字形位置,不是笔误。
|
% 中心 51.60 —— 这是 Times 连字符的字形位置,不是笔误。
|
||||||
%
|
%
|
||||||
@@ -433,7 +429,7 @@
|
|||||||
\coordinate (B) at ([yshift=-\ouc@bindshift]current page.north west);
|
\coordinate (B) at ([yshift=-\ouc@bindshift]current page.north west);
|
||||||
% ---- ★ 原卷此处【没有】外框 ----
|
% ---- ★ 原卷此处【没有】外框 ----
|
||||||
% 曾误把 PDF 里 x=17.4/18.12/60.15/60.87 那组线当成黑色外框,
|
% 曾误把 PDF 里 x=17.4/18.12/60.15/60.87 那组线当成黑色外框,
|
||||||
% 实测它们是 fill=(1,1,1) 的**白色遮挡块**(Word 里盖住页眉页脚
|
% 实际它们是 fill=(1,1,1) 的**白色遮挡块**(Word 里盖住页眉页脚
|
||||||
% 的底色块),可见黑线只有 x=33.80 那 6 段竖虚线。
|
% 的底色块),可见黑线只有 x=33.80 那 6 段竖虚线。
|
||||||
% 故此处不画任何竖线/封口线。
|
% 故此处不画任何竖线/封口线。
|
||||||
% ---- 竖虚线:每段 = 对应栏目的"填写区"(紧接栏目名冒号之后,向上延伸)----
|
% ---- 竖虚线:每段 = 对应栏目的"填写区"(紧接栏目名冒号之后,向上延伸)----
|
||||||
@@ -449,17 +445,17 @@
|
|||||||
359.35/427.85, 489.30/557.80, 600.05/668.60}{%
|
359.35/427.85, 489.30/557.80, 600.05/668.60}{%
|
||||||
\draw[line width=0.48bp,line cap=butt]
|
\draw[line width=0.48bp,line cap=butt]
|
||||||
([xshift=33.8bp,yshift=-\a bp]B) -- ([xshift=33.8bp,yshift=-\b bp]B);}
|
([xshift=33.8bp,yshift=-\a bp]B) -- ([xshift=33.8bp,yshift=-\b bp]B);}
|
||||||
% ---- 虚线段(#20:由「18bp 连字符排成」改为「用线画」)----
|
% ---- 虚线段(由「18bp 连字符排成」改为「用线画」)----
|
||||||
% 原卷这四段确实是 18bp Times 连字符排出来的,但 #20 把试卷字体
|
% 原卷这四段确实是 18bp Times 连字符排出来的,但本包把试卷字体
|
||||||
% 统一到思源宋体之后,连字符每个宽 0.346 em(Termes 是 0.333),
|
% 统一到思源宋体之后,连字符每个宽 0.346 em(Termes 是 0.333),
|
||||||
% 18bp 下每串会长出 4~7bp,正好破坏"复刻原卷长度"这个前提。
|
% 18bp 下每串会长出 4~7bp,正好破坏"复刻原卷长度"这个前提。
|
||||||
% ⇒ 改为几何画的短横线段,长度锁死在 \ouc@dashseg 的坐标里,
|
% ⇒ 改为几何画的短横线段,长度锁死在 \ouc@dashseg 的坐标里,
|
||||||
% 不受任何字体宽度影响。
|
% 不受任何字体宽度影响。
|
||||||
% 实测原卷(720dpi 渲染后逐笔画测量):
|
% 实际原卷(720dpi 渲染后逐笔画测量):
|
||||||
% 单个连字符笔画 长 4.40bp、粗 1.10bp、x 中心 51.60bp
|
% 单个连字符笔画 长 4.40bp、粗 1.10bp、x 中心 51.60bp
|
||||||
% → 左 49.40bp、右 53.80bp
|
% → 左 49.40bp、右 53.80bp
|
||||||
% 相邻笔画步距 6.00bp(= 18bp × 0.333 em)
|
% 相邻笔画步距 6.00bp(= 18bp × 0.333 em)
|
||||||
% 六段坐标与笔画数取自原卷逐笔画实测,见下方调用处。
|
% 六段坐标与笔画数取自原卷逐笔画实际,见下方调用处。
|
||||||
\ouc@dashseg{62.20}{24}% 最下一串(座号区)
|
\ouc@dashseg{62.20}{24}% 最下一串(座号区)
|
||||||
\ouc@dashseg{216.50}{24}% 考场教室号区
|
\ouc@dashseg{216.50}{24}% 考场教室号区
|
||||||
\ouc@dashseg{364.80}{3}% 截断的短线(原卷被白底遮断,照抄)
|
\ouc@dashseg{364.80}{3}% 截断的短线(原卷被白底遮断,照抄)
|
||||||
@@ -662,7 +658,7 @@
|
|||||||
\newcommand{\examfigcaption}[1]{%
|
\newcommand{\examfigcaption}[1]{%
|
||||||
\par\nointerlineskip\centerline{\Xiaowu #1}\par\nointerlineskip}
|
\par\nointerlineskip\centerline{\Xiaowu #1}\par\nointerlineskip}
|
||||||
|
|
||||||
% 图题(五号):原卷第 3 页 "图3" 实测 10.45bp
|
% 图题(五号):原卷第 3 页 "图3" 实际10.45bp
|
||||||
\newcommand{\examfigcaptioniii}[1]{%
|
\newcommand{\examfigcaptioniii}[1]{%
|
||||||
\par\nointerlineskip\centerline{\Fivhao #1}\par\nointerlineskip\vspace*{5.40bp}}
|
\par\nointerlineskip\centerline{\Fivhao #1}\par\nointerlineskip\vspace*{5.40bp}}
|
||||||
|
|
||||||
@@ -685,7 +681,7 @@
|
|||||||
\newcommand{\sumphisig}{\hbox{\sunfont ∑Φ}}
|
\newcommand{\sumphisig}{\hbox{\sunfont ∑Φ}}
|
||||||
|
|
||||||
% 下标(原卷 M_L / M_S)
|
% 下标(原卷 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 的半角宽),
|
% M(210.00) → L(215.16) 步距 5.16bp(M 的半角宽),
|
||||||
% L → 和 3.96bp,故 M 起点到"和"共 9.12bp。
|
% L → 和 3.96bp,故 M 起点到"和"共 9.12bp。
|
||||||
% 用宽度 3.87bp 的盒接管下标宽度,使 5.25 + 3.87 = 9.12 对齐原卷。
|
% 用宽度 3.87bp 的盒接管下标宽度,使 5.25 + 3.87 = 9.12 对齐原卷。
|
||||||
@@ -695,7 +691,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 10. 题型构件(通用)
|
% 10. 题型构件(通用)
|
||||||
% 设计原则:不依赖任何具体课程,只提供"骨架",
|
% 设计原则:不依赖任何具体课程,只提供"骨架",
|
||||||
% 题目内容由正文填写。所有题型都沿用本卷实测的版面参数:
|
% 题目内容由正文填写。所有题型都沿用本卷实际的版面参数:
|
||||||
% · 正文 10.5bp / 行距 15.6bp
|
% · 正文 10.5bp / 行距 15.6bp
|
||||||
% · 中英之间 2.70bp(ecglue)
|
% · 中英之间 2.70bp(ecglue)
|
||||||
% · 题号栏 15.72bp(宋体题号,题号后空 5.28bp)
|
% · 题号栏 15.72bp(宋体题号,题号后空 5.28bp)
|
||||||
|
|||||||
+18
-21
@@ -59,7 +59,7 @@
|
|||||||
\pagestyle{empty}
|
\pagestyle{empty}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 字体(#20:与 oucexam.sty 同步,全部统一为思源宋体)
|
% 字体(与 oucexam.sty 同步,全部统一为思源宋体)
|
||||||
% 全部取自公共字体包 ../fonts.tex,再在包内重定向。
|
% 全部取自公共字体包 ../fonts.tex,再在包内重定向。
|
||||||
%
|
%
|
||||||
% ⚠️ 必须和 oucexam.sty 做**完全相同的处理**,否则两份文件观感不一致:
|
% ⚠️ 必须和 oucexam.sty 做**完全相同的处理**,否则两份文件观感不一致:
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
% · 「(4 分)」里的数字 → 走 \setmainfont
|
% · 「(4 分)」里的数字 → 走 \setmainfont
|
||||||
% · \thepage / \pageref 页码 → 走 \setmainfont
|
% · \thepage / \pageref 页码 → 走 \setmainfont
|
||||||
% ⇒ 必须连 \setmainfont 一起改,否则 PDF 里会残留 Termes span。
|
% ⇒ 必须连 \setmainfont 一起改,否则 PDF 里会残留 Termes span。
|
||||||
% 实测第一轮只做 \let 时,答案卷残留 197 个 Termes span。
|
% 实际第一轮只做 \let 时,答案卷残留 197 个 Termes span。
|
||||||
%
|
%
|
||||||
% ⚠️ 数学公式($x$ / $\dfrac{}{}$ / $\sum$)**不在统一范围内**,
|
% ⚠️ 数学公式($x$ / $\dfrac{}{}$ / $\sum$)**不在统一范围内**,
|
||||||
% 仍走 Computer Modern。原因见 oucexam.sty 的说明:思源宋体没有
|
% 仍走 Computer Modern。原因见 oucexam.sty 的说明:思源宋体没有
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
\let\tnr\OUCLatinSerif
|
\let\tnr\OUCLatinSerif
|
||||||
\let\tnrb\OUCLatinSerifBold
|
\let\tnrb\OUCLatinSerifBold
|
||||||
|
|
||||||
% 答案卷里的黑体小标题(\heiti,共 37 处)一并换成思源宋体,#20 要求统一。
|
% 答案卷里的黑体小标题(\heiti,共 37 处)一并换成思源宋体。
|
||||||
% ⚠️ 用 \let 而非改 \def\heiti —— 后者会破坏 ../fonts.tex,影响别的模板。
|
% ⚠️ 用 \let 而非改 \def\heiti —— 后者会破坏 ../fonts.tex,影响别的模板。
|
||||||
% ⚠️ 若将来要恢复黑体标题,注释掉下面这行即可。
|
% ⚠️ 若将来要恢复黑体标题,注释掉下面这行即可。
|
||||||
\let\heiti\songti
|
\let\heiti\songti
|
||||||
@@ -132,17 +132,17 @@
|
|||||||
\newcommand{\TNRB}[1]{{\tnrb #1\normalfont}}
|
\newcommand{\TNRB}[1]{{\tnrb #1\normalfont}}
|
||||||
\newcommand{\SUN}[1]{{\sunfont #1\normalfont}}
|
\newcommand{\SUN}[1]{{\sunfont #1\normalfont}}
|
||||||
|
|
||||||
% 中西文间距 2.70bp(原卷实测值,不随字号缩放)。
|
% 中西文间距 2.70bp(原卷取值,不随字号缩放)。
|
||||||
\xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain}
|
\xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 直引号 " (U+0022) 归入 CJK 字符类(#20 补充修正)
|
% 直引号 " (U+0022) 归入 CJK 字符类(补充修正)
|
||||||
%
|
%
|
||||||
% ⚠️ 问题:本文件正文用 ASCII 直引号 "" 表示中文引号(共 32 处),
|
% ⚠️ 问题:本文件正文用 ASCII 直引号 "" 表示中文引号(共 32 处),
|
||||||
% 而 xeCJK 按 Unicode 区段分类 —— U+0022 在 Basic Latin,被判成**西文**,
|
% 而 xeCJK 按 Unicode 区段分类 —— U+0022 在 Basic Latin,被判成**西文**,
|
||||||
% 于是引号走 \setmainfont(原为 Termes),与两侧汉字不同字体、不同宽度。
|
% 于是引号走 \setmainfont(原为 Termes),与两侧汉字不同字体、不同宽度。
|
||||||
% 换字体后表现为一行里出现 TeXGyreTermes-Regular 的 ",且因为西文引号
|
% 换字体后表现为一行里出现 TeXGyreTermes-Regular 的 ",且因为西文引号
|
||||||
% 比中文引号窄、字距算法不同,挤压出 Overfull(实测第 88 行 +8.07pt)。
|
% 比中文引号窄、字距算法不同,挤压出 Overfull(实际第 88 行 +8.07pt)。
|
||||||
%
|
%
|
||||||
% ⚠️ 为什么不在 fonts.tex 里改:那里是**全库共用**的,把 U+0022 全局归 CJK
|
% ⚠️ 为什么不在 fonts.tex 里改:那里是**全库共用**的,把 U+0022 全局归 CJK
|
||||||
% 会让正文里真正的英文引号(如 code 片段 "hello world")也变成全角,
|
% 会让正文里真正的英文引号(如 code 片段 "hello world")也变成全角,
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
\xeCJKDeclareCharClass{CJK}{"0022} % " 直引号(当中文引号用)
|
\xeCJKDeclareCharClass{CJK}{"0022} % " 直引号(当中文引号用)
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 【#20 踩坑记录】换字体引起的 Overfull 怎么修(结论:改源码断行,别调参数)
|
% 【技术说明】换字体引起的 Overfull 怎么修(结论:改源码断行,别调参数)
|
||||||
%
|
%
|
||||||
% 现象:字体统一为思源宋体后,参考答案与评分标准示例.tex 第 123-125 行
|
% 现象:字体统一为思源宋体后,参考答案与评分标准示例.tex 第 123-125 行
|
||||||
% (\keyitem{3}{4})出现 Overfull 2.61pt,渲染后压出版心右边界
|
% (\keyitem{3}{4})出现 Overfull 2.61pt,渲染后压出版心右边界
|
||||||
@@ -169,7 +169,6 @@
|
|||||||
% 往前找更早的合法断点(句号「。」之后)的话,第一行只填 65%,
|
% 往前找更早的合法断点(句号「。」之后)的话,第一行只填 65%,
|
||||||
% 欠宽 150bp 无处拉伸 ⇒ badness 爆掉 ⇒ TeX 宁可撑破 2.61bp。
|
% 欠宽 150bp 无处拉伸 ⇒ badness 爆掉 ⇒ TeX 宁可撑破 2.61bp。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 试过且**全部无效**的方案(别再花时间重复,每种都实测过):
|
|
||||||
% ① \emergencystretch 1.5em —— 无效。只追加"可拉伸量",
|
% ① \emergencystretch 1.5em —— 无效。只追加"可拉伸量",
|
||||||
% 本行没有胶可拉,给多少额度都无从施展。
|
% 本行没有胶可拉,给多少额度都无从施展。
|
||||||
% ② \tolerance 3000 —— 无效。不是不满意断点,是没有更早的**合法**断点。
|
% ② \tolerance 3000 —— 无效。不是不满意断点,是没有更早的**合法**断点。
|
||||||
@@ -188,7 +187,7 @@
|
|||||||
% \keyitem{3}{4}{%
|
% \keyitem{3}{4}{%
|
||||||
% \textbf{学习迁移}:指一种学习对另一种学习的影响\pt{2}。\\
|
% \textbf{学习迁移}:指一种学习对另一种学习的影响\pt{2}。\\
|
||||||
% 按方向分正迁移与负迁移\pt{1},其发生依赖于共同要素与概括水平\pt{1}。}
|
% 按方向分正迁移与负迁移\pt{1},其发生依赖于共同要素与概括水平\pt{1}。}
|
||||||
% 已实测:Overfull 归零,三页最右墨迹均为 524.41bp,与版心严丝合缝。
|
% 已Overfull 归零,三页最右墨迹均为 524.41bp,与版心严丝合缝。
|
||||||
%
|
%
|
||||||
% 为什么这是对的做法而不是"绕过问题":
|
% 为什么这是对的做法而不是"绕过问题":
|
||||||
% 分项给分的答案本来就该一句一行,读者(阅卷人)靠句号扫分点。
|
% 分项给分的答案本来就该一句一行,读者(阅卷人)靠句号扫分点。
|
||||||
@@ -212,7 +211,7 @@
|
|||||||
\def\ouckey@total{}
|
\def\ouckey@total{}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% key 赋值:空值规范成空串(#22)
|
% key 赋值:空值规范成空串
|
||||||
%
|
%
|
||||||
% ⚠️ 所有 key 一律走这里,不要退回 `\def\ouckey@xxx{#1}`。
|
% ⚠️ 所有 key 一律走这里,不要退回 `\def\ouckey@xxx{#1}`。
|
||||||
% 原因见文件下方「判空」一节的完整说明:那样 dept={} 会存成
|
% 原因见文件下方「判空」一节的完整说明:那样 dept={} 会存成
|
||||||
@@ -245,7 +244,7 @@
|
|||||||
\newcommand{\keysetup}[1]{\setkeys{ouckey}{#1}}
|
\newcommand{\keysetup}[1]{\setkeys{ouckey}{#1}}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 判空(#22 修正:原实现有真 bug)
|
% 判空(修正:原实现有真 bug)
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 旧实现的坑
|
% ⚠️⚠️ 旧实现的坑
|
||||||
% 旧代码是
|
% 旧代码是
|
||||||
@@ -255,7 +254,7 @@
|
|||||||
% **\detokenize 不展开参数** —— 它看到的是字符串 `\ouckey@dept`
|
% **\detokenize 不展开参数** —— 它看到的是字符串 `\ouckey@dept`
|
||||||
% (宏名本身),永远非空 ⇒ 判空永远失败。
|
% (宏名本身),永远非空 ⇒ 判空永远失败。
|
||||||
% 后果:`dept = {}` 时抬头仍印出孤立的「开课学院:」,后面没有值。
|
% 后果:`dept = {}` 时抬头仍印出孤立的「开课学院:」,后面没有值。
|
||||||
% 这是旧版就有的 bug(三格布局下不明显),#22 改成一行一项后暴露。
|
% 这是旧版就有的 bug(三格布局下不明显)。
|
||||||
%
|
%
|
||||||
% 为什么不在宏里修
|
% 为什么不在宏里修
|
||||||
% 试过「先 \edef 展开再 \detokenize」的版本,会报
|
% 试过「先 \edef 展开再 \detokenize」的版本,会报
|
||||||
@@ -277,7 +276,7 @@
|
|||||||
\fi}
|
\fi}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 一项信息:标签加粗 + 值,**独占一行**(#22)
|
% 一项信息:标签加粗 + 值,**独占一行**
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 为什么从"一行三格"改成"一行一项"
|
% ⚠️⚠️ 为什么从"一行三格"改成"一行一项"
|
||||||
%
|
%
|
||||||
@@ -289,9 +288,9 @@
|
|||||||
% · 盒内中文**不能换行**(LR 模式,不做段落断行)
|
% · 盒内中文**不能换行**(LR 模式,不做段落断行)
|
||||||
% 所以三格布局对短字段友好,对长字段必然重叠。
|
% 所以三格布局对短字段友好,对长字段必然重叠。
|
||||||
%
|
%
|
||||||
% 实测:把 dept 填成
|
% 把 dept 填成
|
||||||
% 计算机科学与技术学院(人工智能与大数据技术方向实验班)
|
% 计算机科学与技术学院(人工智能与大数据技术方向实验班)
|
||||||
% 后,pymupdf 读出
|
% 后,读取
|
||||||
% 开课学院:(70.87~123.37) 值:(123.37~406.87)
|
% 开课学院:(70.87~123.37) 值:(123.37~406.87)
|
||||||
% 而第二格「课程名称」本该从 216.0 开始 ⇒ **重叠 190.87bp**,
|
% 而第二格「课程名称」本该从 216.0 开始 ⇒ **重叠 190.87bp**,
|
||||||
% 把「课程名称 / 试卷类型」整个压住。
|
% 把「课程名称 / 试卷类型」整个压住。
|
||||||
@@ -336,7 +335,7 @@
|
|||||||
\vspace*{10bp}
|
\vspace*{10bp}
|
||||||
\hrule height 1.2bp
|
\hrule height 1.2bp
|
||||||
\vspace*{8bp}
|
\vspace*{8bp}
|
||||||
% 每项一行(#22)。顺序按"读者关心程度"排:
|
% 每项一行。顺序按"读者关心程度"排:
|
||||||
% 先课程、后学院、再人与考试形式,最后分值。
|
% 先课程、后学院、再人与考试形式,最后分值。
|
||||||
% 留空的自动跳过,所以实际行数随填写项变化。
|
% 留空的自动跳过,所以实际行数随填写项变化。
|
||||||
\ouckey@inforow{课程名称}{\ouckey@course}
|
\ouckey@inforow{课程名称}{\ouckey@course}
|
||||||
@@ -365,7 +364,6 @@
|
|||||||
% 分处两行,否则会看到「(1」在行末、「分)」在下一行,很难看。
|
% 分处两行,否则会看到「(1」在行末、「分)」在下一行,很难看。
|
||||||
% 代价是「(X 分)」成了不可断的整体,极端行宽下会撑破版心。
|
% 代价是「(X 分)」成了不可断的整体,极端行宽下会撑破版心。
|
||||||
% ⇒ 这个代价接受,解决办法是在**源码的句子边界手动断行**,
|
% ⇒ 这个代价接受,解决办法是在**源码的句子边界手动断行**,
|
||||||
% 不是在这里放开可断。详见上面「#20 踩坑记录」一节。
|
|
||||||
\newcommand{\pt}[1]{{\small(\TNR{#1}~分)}}
|
\newcommand{\pt}[1]{{\small(\TNR{#1}~分)}}
|
||||||
\newcommand{\ptline}[2]{%
|
\newcommand{\ptline}[2]{%
|
||||||
\par\noindent #2\unskip\par\nobreak
|
\par\noindent #2\unskip\par\nobreak
|
||||||
@@ -393,7 +391,7 @@
|
|||||||
\addvspace{5bp}}
|
\addvspace{5bp}}
|
||||||
\newcommand{\keysectionfree}[3]{%
|
\newcommand{\keysectionfree}[3]{%
|
||||||
\par\addvspace{10bp}%
|
\par\addvspace{10bp}%
|
||||||
{\Sihao\heiti #1、#2(#3)\par}%
|
{\Sihao\heiti #1、#2\par}%
|
||||||
\addvspace{5bp}}
|
\addvspace{5bp}}
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -402,7 +400,7 @@
|
|||||||
% \objkeys[5]{...} → 每行 5 个
|
% \objkeys[5]{...} → 每行 5 个
|
||||||
% 答案串逗号分隔;题号自动递增。
|
% 答案串逗号分隔;题号自动递增。
|
||||||
%
|
%
|
||||||
% ★ 这个宏反复改过很多次,下面几条是实测结论,动之前先看清:
|
% ★ 这个宏反复改过很多次,下面几条是实际结论,动之前先看清:
|
||||||
%
|
%
|
||||||
% 【不能用 \par 分行】
|
% 【不能用 \par 分行】
|
||||||
% 在 \@for 循环体里写 "\hbox to \textwidth{...}\par\noindent",
|
% 在 \@for 循环体里写 "\hbox to \textwidth{...}\par\noindent",
|
||||||
@@ -413,7 +411,7 @@
|
|||||||
% 【不能用 \unvbox + \prevdepth 思路】
|
% 【不能用 \unvbox + \prevdepth 思路】
|
||||||
% \unvbox 执行完寄存器即被清空,紧跟的 \ifdim\ht...>0pt 恒为假;
|
% \unvbox 执行完寄存器即被清空,紧跟的 \ifdim\ht...>0pt 恒为假;
|
||||||
% 而且 \unvbox 后 TeX 把 \prevdepth 设成 -1000pt 抑制行间胶水,
|
% 而且 \unvbox 后 TeX 把 \prevdepth 设成 -1000pt 抑制行间胶水,
|
||||||
% 各行会叠在一起(实测间距只有一个行高)。
|
% 各行会叠在一起(实际间距只有一个行高)。
|
||||||
%
|
%
|
||||||
% 【不能用 \makebox[<变宽>]】
|
% 【不能用 \makebox[<变宽>]】
|
||||||
% 在 \@for 循环里 \makebox[\dimexpr\textwidth/\perrow\relax] 或
|
% 在 \@for 循环里 \makebox[\dimexpr\textwidth/\perrow\relax] 或
|
||||||
@@ -532,7 +530,6 @@
|
|||||||
\newcount\ouckey@sum
|
\newcount\ouckey@sum
|
||||||
\newcount\ouckey@cnt
|
\newcount\ouckey@cnt
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% ★ 这里踩过三个坑,都记下:
|
|
||||||
%
|
%
|
||||||
% 坑1 \edef\head{\head&...} 自引用 → 无限展开,parameter stack 爆掉。
|
% 坑1 \edef\head{\head&...} 自引用 → 无限展开,parameter stack 爆掉。
|
||||||
% 坑2 \g@addto@macro / \toks 存 token 序列 → 存进去的是 \ouckey@cur
|
% 坑2 \g@addto@macro / \toks 存 token 序列 → 存进去的是 \ouckey@cur
|
||||||
|
|||||||
+12
-14
@@ -5,7 +5,7 @@
|
|||||||
% (SynologyDrive/授课/数字逻辑/2025/归档/)
|
% (SynologyDrive/授课/数字逻辑/2025/归档/)
|
||||||
% 原名与内文标题写的是「学院」,按现行建制改为「学部」,
|
% 原名与内文标题写的是「学院」,按现行建制改为「学部」,
|
||||||
% 模板标题相应为「信息科学与工程学部试卷归档封面」。
|
% 模板标题相应为「信息科学与工程学部试卷归档封面」。
|
||||||
% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算:
|
% 目标:版式与逐项对齐。所有尺寸都由 Word 内部数值换算:
|
||||||
% pt → mm : mm = pt / 72 * 25.4
|
% pt → mm : mm = pt / 72 * 25.4
|
||||||
% twips → mm : mm = twips / 1440 * 25.4
|
% twips → mm : mm = twips / 1440 * 25.4
|
||||||
% w:sz : 半磅值,÷ 2 即 pt
|
% w:sz : 半磅值,÷ 2 即 pt
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面与版心
|
% 1. 页面与版心
|
||||||
%
|
%
|
||||||
% 原 .doc sectPr:
|
% sectPr:
|
||||||
% pgSz A4(595.3 × 841.9 pt = 210.0 × 297.0 mm)
|
% pgSz A4(595.3 × 841.9 pt = 210.0 × 297.0 mm)
|
||||||
% pgMar top/bottom 70.9 pt = 25.01 mm
|
% pgMar top/bottom 70.9 pt = 25.01 mm
|
||||||
% left/right 56.7 pt = 20.00 mm
|
% left/right 56.7 pt = 20.00 mm
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
}
|
}
|
||||||
\setlength{\parindent}{0pt}
|
\setlength{\parindent}{0pt}
|
||||||
\setlength{\parskip}{0pt}
|
\setlength{\parskip}{0pt}
|
||||||
\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码
|
\pagestyle{empty} % 无页眉页脚,故不排页码
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 2. 字体与字号
|
% 2. 字体与字号
|
||||||
@@ -65,7 +65,6 @@
|
|||||||
% ⚠️ 全文只有黑体一种字体,没有宋体/仿宋混排,比另两份表单简单。
|
% ⚠️ 全文只有黑体一种字体,没有宋体/仿宋混排,比另两份表单简单。
|
||||||
%
|
%
|
||||||
% 字体全部来自仓库公共字体包 ../oucfonts.sty(文件在 ../fonts/ 下)。
|
% 字体全部来自仓库公共字体包 ../oucfonts.sty(文件在 ../fonts/ 下)。
|
||||||
% 旧版这里写的是系统字体的 SimHei / SimSun / FangSong + AutoFakeBold,
|
|
||||||
% 换台机器(尤其 Linux/macOS)就编不出来。现已全部换成随仓库分发的
|
% 换台机器(尤其 Linux/macOS)就编不出来。现已全部换成随仓库分发的
|
||||||
% 开源字体,并且粗体用字体自带的真粗体、不再算法描边。
|
% 开源字体,并且粗体用字体自带的真粗体、不再算法描边。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -85,7 +84,7 @@
|
|||||||
\linespread{1}\relax
|
\linespread{1}\relax
|
||||||
\fontsize{18}{21.6}\selectfont}
|
\fontsize{18}{21.6}\selectfont}
|
||||||
|
|
||||||
% 三档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致)
|
% 三档字号(行距取字号的 1.2 倍,与单倍行距一致)
|
||||||
\newcommand{\sfmbigfont}{\linespread{1}\relax\fontsize{18}{21.6}\selectfont}
|
\newcommand{\sfmbigfont}{\linespread{1}\relax\fontsize{18}{21.6}\selectfont}
|
||||||
\newcommand{\sfmmidfont}{\linespread{1}\relax\fontsize{16}{19.2}\selectfont}
|
\newcommand{\sfmmidfont}{\linespread{1}\relax\fontsize{16}{19.2}\selectfont}
|
||||||
\newcommand{\sfmsmlfont}{\linespread{1}\relax\fontsize{14}{16.8}\selectfont}
|
\newcommand{\sfmsmlfont}{\linespread{1}\relax\fontsize{14}{16.8}\selectfont}
|
||||||
@@ -97,11 +96,10 @@
|
|||||||
\newcommand{\SFMHT}[1]{{\heiti #1\normalfont}}
|
\newcommand{\SFMHT}[1]{{\heiti #1\normalfont}}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% ⚠️⚠️⚠️【「×」占位符的坑 —— 在 年度考核登记表/ 里踩过,那里只是绕过去了,
|
|
||||||
% 这里做了根治】
|
% 这里做了根治】
|
||||||
%
|
%
|
||||||
% 现象:写 {\heiti ×××} 后编译,PDF 里这些 × 实际用的是
|
% 现象:写 {\heiti ×××} 后编译,PDF 里这些 × 实际用的是
|
||||||
% Times New Roman(pymupdf 读 span 的 font=TimesNewRomanPSMT),
|
% Times New Roman,
|
||||||
% 不是黑体。§ 29 个 × 撑不满预期宽度,跟汉字混排时基线也偏。
|
% 不是黑体。§ 29 个 × 撑不满预期宽度,跟汉字混排时基线也偏。
|
||||||
%
|
%
|
||||||
% 原因:xeCJK 按 Unicode 区段分类。「×」是 U+00D7,落在 Latin-1 补充区,
|
% 原因:xeCJK 按 Unicode 区段分类。「×」是 U+00D7,落在 Latin-1 补充区,
|
||||||
@@ -122,7 +120,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 3. 列的宽度模型
|
% 3. 列的宽度模型
|
||||||
%
|
%
|
||||||
% 原 .doc tblGrid(2 个网格列,col_widths_pct = [30, 70]):
|
% tblGrid(2 个网格列,col_widths_pct = [30, 70]):
|
||||||
% c1 = 170 × 30% = 51.000 mm
|
% c1 = 170 × 30% = 51.000 mm
|
||||||
% c2 = 170 × 70% = 119.000 mm
|
% c2 = 170 × 70% = 119.000 mm
|
||||||
%
|
%
|
||||||
@@ -141,7 +139,7 @@
|
|||||||
% 故每列再减 0.5292/2 = 0.2646 mm。
|
% 故每列再减 0.5292/2 = 0.2646 mm。
|
||||||
%
|
%
|
||||||
% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
|
% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
|
||||||
% 实测需再微调(见 3.2 的实测标定值),否则一直报
|
% 实际需再微调(见 3.2 的标定值),否则一直报
|
||||||
% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。
|
% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\sfmrule}{0.5pt} % 边框粗细(w:sz=4)
|
\newcommand{\sfmrule}{0.5pt} % 边框粗细(w:sz=4)
|
||||||
@@ -167,7 +165,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 4. 行高
|
% 4. 行高
|
||||||
%
|
%
|
||||||
% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast):
|
% 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast):
|
||||||
% R1 学年 42.55 pt = 15.011 mm
|
% R1 学年 42.55 pt = 15.011 mm
|
||||||
% R2 学期 42.55 pt = 15.011 mm
|
% R2 学期 42.55 pt = 15.011 mm
|
||||||
% R3 课程号 43.55 pt = 15.363 mm
|
% R3 课程号 43.55 pt = 15.363 mm
|
||||||
@@ -242,14 +240,14 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 7. 表外标题
|
% 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 才会折行。
|
% 再加长(比如后面挂"(理论课)")仍有余量,超过 170mm 才会折行。
|
||||||
%
|
%
|
||||||
% 标题与表格之间原 .doc 有 3 个空段落(idx 13/14/15),
|
% 标题与表格之间有 3 个空段落(idx 13/14/15),
|
||||||
% 合计 3 × 21.6pt = 64.8pt = 22.86 mm。这里用 \sfmtitleskip 还原。
|
% 合计 3 × 21.6pt = 64.8pt = 22.86 mm。这里用 \sfmtitleskip 还原。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newlength{\sfmtitleskip}
|
\newlength{\sfmtitleskip}
|
||||||
@@ -266,7 +264,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 8. 表后空行
|
% 8. 表后空行
|
||||||
%
|
%
|
||||||
% 原 .doc 表格之后还有一个空段落(idx 212)。
|
% 表格之后还有一个空段落(idx 212)。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\sfmtail}{\par\null\par}
|
\newcommand{\sfmtail}{\par\null\par}
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -11,7 +11,7 @@
|
|||||||
% (原文件名与内文标题写的是「学院」,现按现行建制改为「学部」)
|
% (原文件名与内文标题写的是「学院」,现按现行建制改为「学部」)
|
||||||
% 所有尺寸已在 oucksfm.sty 内注明换算过程;要改版式请改 sty。
|
% 所有尺寸已在 oucksfm.sty 内注明换算过程;要改版式请改 sty。
|
||||||
%
|
%
|
||||||
% 与原 .doc 的差异(有意为之):
|
% 与的差异(有意为之):
|
||||||
% · 原文件里的真实课程信息已全部换成 × 占位
|
% · 原文件里的真实课程信息已全部换成 × 占位
|
||||||
% · 单位名「学院」按现行建制改为「学部」,标题相应改为
|
% · 单位名「学院」按现行建制改为「学部」,标题相应改为
|
||||||
% 「信息科学与工程学部试卷归档封面」
|
% 「信息科学与工程学部试卷归档封面」
|
||||||
@@ -43,7 +43,6 @@
|
|||||||
%
|
%
|
||||||
% ⚠️⚠️【必须看】占位符「×」一律用 \ph{} 包起来,不要裸写 ×。
|
% ⚠️⚠️【必须看】占位符「×」一律用 \ph{} 包起来,不要裸写 ×。
|
||||||
%
|
%
|
||||||
% 原因(在 年度考核登记表/ 里踩过):字体的 ASCII 区段由 fontspec 交给
|
|
||||||
% 西文字体(这里是 Times New Roman),而「×」U+00D7 属于 Latin-1,
|
% 西文字体(这里是 Times New Roman),而「×」U+00D7 属于 Latin-1,
|
||||||
% 会被判成 ASCII ⇒ 用 TNR 的 ×,那是 1em 宽的数学乘号,
|
% 会被判成 ASCII ⇒ 用 TNR 的 ×,那是 1em 宽的数学乘号,
|
||||||
% 与汉字的 1em 字宽【不一样】(TNR 的 × 略窄、位置也偏)。
|
% 与汉字的 1em 字宽【不一样】(TNR 的 × 略窄、位置也偏)。
|
||||||
|
|||||||
+41
-359
@@ -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}
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
\ProvidesPackage{oucgddir}[2026/10/27 v1.0 OUC exam archive checklist]
|
\ProvidesPackage{oucgddir}[2026/10/27 v1.0 OUC exam archive checklist]
|
||||||
|
|
||||||
|
%======================================================================
|
||||||
|
% oucgddir.sty —— 试卷归档目录版式包
|
||||||
|
%
|
||||||
|
% 提供:gdtable 环境、\gdtitle、\gdhead、\gdno、\gditem、\gdnote
|
||||||
|
% 用法见同目录 README.md
|
||||||
|
%======================================================================
|
||||||
|
|
||||||
\RequirePackage{geometry}
|
\RequirePackage{geometry}
|
||||||
\RequirePackage{fontspec}
|
\RequirePackage{fontspec}
|
||||||
\RequirePackage{xeCJK}
|
\RequirePackage{xeCJK}
|
||||||
\RequirePackage{tabularray}
|
\RequirePackage{tabularray}
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面与版心
|
% 一、页面
|
||||||
%
|
%
|
||||||
% 原 .doc sectPr:
|
% 表格宽 150.8105mm,比常规版心(左右各 31.75mm)宽约 4.14mm,
|
||||||
% pgSz w:w=11906 h:h=16838 → A4(210.01 × 297.00 mm)
|
% 故整表按纸张居中,左右各留 29.599mm。
|
||||||
% pgMar top/bottom = 1440 twips = 25.40 mm
|
|
||||||
% left/right = 1800 twips = 31.75 mm
|
|
||||||
% header 851 / footer 992 twips
|
|
||||||
%
|
%
|
||||||
% 但这张表本身【比版心宽】—— 这是原文档就存在的问题,不是这里引入的:
|
% totalwidth 取 150.8105mm 而非 150.636mm:tabularray 把竖线画在
|
||||||
% 版心宽 = 210 − 2×31.75 = 146.50 mm
|
% 版心边界内侧,线宽计入盒宽,故需补 0.1745mm。
|
||||||
% 表宽 = tblGrid 合计 8540 twips = 150.64 mm
|
|
||||||
% ⇒ 表格比版心宽 4.14 mm,左右各溢出 2.07 mm。
|
|
||||||
% 原 Word 里 tblPr 是 jc=center + tblW=auto,所以表格是居中摆的,
|
|
||||||
% 左边界落在 29.60mm(= 31.75 − 2.07),实测 PDF 表格线 x 范围
|
|
||||||
% 29.60 ~ 180.41 mm,与此吻合。
|
|
||||||
%
|
|
||||||
% ⇒ 本包的处理:把 totalwidth 直接设成表宽 150.636mm,左右各留
|
|
||||||
% (210 − 150.636)/2 = 29.682 mm。这样
|
|
||||||
% · 表格与版心同宽,整表居中,编译不刷 Overfull \hbox
|
|
||||||
% · 表格线在纸面上的绝对位置与原 .doc 完全一致(误差 < 0.1mm)
|
|
||||||
% · 标题的居中基准也落在纸张中心,与原稿一致
|
|
||||||
% 即:不改动任何可见版式,只把"溢出版心"换成"版心就是表宽"。
|
|
||||||
%
|
|
||||||
% ⚠️⚠️【实测修正:totalwidth 要 150.8105mm,左边距 29.599mm】
|
|
||||||
%
|
|
||||||
% (a) 表宽的真实值不是 150.636mm。
|
|
||||||
% tabularray 把左竖线画在版心左边界【内侧】,线中心 = 边界 + 半线宽,
|
|
||||||
% 而右竖线外缘还要再占半个线宽,故整个 tblr 盒子的实宽比
|
|
||||||
% Σwd + 6×colsep + 4×线宽 多出约 0.4945pt。实测:
|
|
||||||
% Overfull \hbox (0.49452pt too wide)
|
|
||||||
% 须把 totalwidth 补足到 150.636 + 0.1745 = 150.8105 mm。
|
|
||||||
%
|
|
||||||
% (b) 左边距要 29.599mm 而非 29.682mm。
|
|
||||||
% 实测新版竖线 x 比原稿整体右偏 0.083mm(29.771 vs 29.686),
|
|
||||||
% 列宽与行距都已逐项精确,纯属整表平移,故左边距减 0.083mm。
|
|
||||||
% 此时 right 自动 = 210 − 29.599 − 150.8105 = 29.5905mm。
|
|
||||||
%
|
|
||||||
% 校正后实测:竖线 x = 29.686 / 52.758 / 130.104 / 180.322 mm,
|
|
||||||
% 与原稿 29.686 / 52.758 / 130.104 / 180.322 逐位相同。
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\geometry{
|
\geometry{
|
||||||
paperwidth = 210mm,
|
paperwidth = 210mm,
|
||||||
paperheight = 297mm,
|
paperheight = 297mm,
|
||||||
left = 29.599mm, % 实测标定(见上)
|
left = 29.599mm,
|
||||||
totalwidth = 150.8105mm, % = 表真实宽(含 tabularray 取整余量)
|
totalwidth = 150.8105mm,
|
||||||
top = 25.40mm,
|
top = 25.40mm,
|
||||||
bottom = 25.40mm,
|
bottom = 25.40mm,
|
||||||
headheight = 0pt,
|
headheight = 0pt,
|
||||||
@@ -75,179 +35,48 @@
|
|||||||
}
|
}
|
||||||
\setlength{\parindent}{0pt}
|
\setlength{\parindent}{0pt}
|
||||||
\setlength{\parskip}{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}
|
\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}
|
\xeCJKsetup{PunctStyle=plain}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%======================================================================
|
||||||
% ⚠️⚠️⚠️【最要命的一条,与 oucksfm.sty / ouclw.sty 同源】
|
% 二、字号
|
||||||
% ctex 默认 \linespread 约 1.3,会把 \fontsize{12}{14.4} 的 14.4pt
|
|
||||||
% 行距放大成 18.7pt 以上,整张表会被撑高。
|
|
||||||
%
|
%
|
||||||
% \fontsize 的第二个参数【本来是】用来设 \baselineskip 的,但
|
% 行距统一取字号的 1.2 倍。
|
||||||
% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread 归 1。
|
% 字号用 bp 单位:pt 换算成 PDF 点会有 72/72.27 的偏差,
|
||||||
% 这一步不能省,也必须在 \AtBeginDocument 之后再设一次
|
% 写 24pt 实际排出 23.91bp。
|
||||||
% (ctex 在 begin document 时会重设)。
|
%======================================================================
|
||||||
%----------------------------------------------------------------------
|
|
||||||
\newcommand{\gdbasefont}{%
|
\newcommand{\gdbasefont}{%
|
||||||
\linespread{1}\relax
|
\linespread{1}\relax
|
||||||
\fontsize{12bp}{14.4bp}\selectfont}
|
\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{\gdtitlefont}{\linespread{1}\relax\fontsize{24bp}{28.8bp}\selectfont}
|
||||||
\newcommand{\gdheadfont} {\linespread{1}\relax\fontsize{18bp}{21.6bp}\selectfont}
|
\newcommand{\gdheadfont} {\linespread{1}\relax\fontsize{18bp}{21.6bp}\selectfont}
|
||||||
\newcommand{\gdnotefont} {\linespread{1}\relax\fontsize{10.45bp}{12.54bp}\selectfont}
|
\newcommand{\gdnotefont} {\linespread{1}\relax\fontsize{10.45bp}{12.54bp}\selectfont}
|
||||||
\newcommand{\gdcellfont} {\linespread{1}\relax\fontsize{12bp}{14.4bp}\selectfont}
|
\newcommand{\gdcellfont} {\linespread{1}\relax\fontsize{12bp}{14.4bp}\selectfont}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
|
||||||
% ⚠️ xeCJK 陷阱:局部字体切换命令若紧邻 \par(或落在段落末尾),段末的
|
|
||||||
% 字体状态会"溢出"到后面段落。故局部切换一律用带 \normalfont 收尾的包装。
|
|
||||||
%----------------------------------------------------------------------
|
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 3. 列的宽度模型
|
% 三、表格尺寸
|
||||||
%
|
%
|
||||||
% 原 .doc tblGrid 三个网格列(twips → mm):
|
% tabularray 的 wd 是内容宽,不含内边距;实际列间距 =
|
||||||
% c1 序号 = 1308 twips = 23.0717 mm
|
% wd + 2×colsep + 线宽。下列取值已扣除内边距与线宽。
|
||||||
% c2 内容 = 4385 twips = 77.3465 mm
|
|
||||||
% c3 标注 = 2847 twips = 50.2179 mm
|
|
||||||
% ─────────────────────────────────────
|
|
||||||
% 合计 8540 twips = 150.6361 mm
|
|
||||||
%
|
|
||||||
% cellMar:left/right = 108 twips = 1.9050 mm,top/bottom = 0
|
|
||||||
% 边框 :w:sz = 4(单位 1/8 pt)⇒ 0.5 pt = 0.1764 mm
|
|
||||||
%
|
|
||||||
% tabularray 的 colsep 计在每列【左右两侧】,故 3 列共 6×1.905 = 11.430mm;
|
|
||||||
% 竖线 4 根(左边界 + 2 条内线 + 右边界)× 0.1764 = 0.7056mm。
|
|
||||||
% 要让 Σwd + 11.430 + 0.7056 = 150.636,需
|
|
||||||
% Σwd = 138.5005 mm
|
|
||||||
% 而 (gridCol − 2×1.905) 之和为 150.636 − 11.430 = 139.2061 mm,
|
|
||||||
% 两者差 0.7056 mm 正好是竖线总宽,故每列再减
|
|
||||||
% 竖线分摊 = 0.7056 / 3 = 0.2352 mm
|
|
||||||
%
|
|
||||||
% ⚠️ 上式是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
|
|
||||||
% 实测需再微调(见 3.1 的实测标定值),否则报
|
|
||||||
% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。
|
|
||||||
%
|
|
||||||
% ⚠️⚠️【实测标定:tabularray 把边框线宽算进列宽里】
|
|
||||||
% 实测每列"相邻竖线中心线间距" = wd + 2×colsep + \gdrule,
|
|
||||||
% 即比理论值 wd + 2×colsep 多出一个 0.1764mm 的线宽。
|
|
||||||
% 故正确的 wd 是
|
|
||||||
% wd = gridCol − 2×colsep − \gdrule
|
|
||||||
% 而不是 gridCol − 2×colsep − 竖线分摊。
|
|
||||||
% (按旧式"分摊"算出的 wd 偏小 0.154mm/列,整表窄 0.466mm,
|
|
||||||
% 实测原稿三列 23.072/77.346/50.218 而旧版 22.916/77.192/50.062。)
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\gdrule}{0.5pt} % 边框粗细(w:sz=4)
|
\newcommand{\gdrule}{0.5pt} % 边框粗细
|
||||||
\newcommand{\gdcolsep}{1.905mm} % 单元格左右内边距(108 twips)
|
\newcommand{\gdcolsep}{1.905mm} % 单元格内边距
|
||||||
\newlength{\gdtblw}
|
\newlength{\gdtblw}
|
||||||
\setlength{\gdtblw}{150.636mm} % 表宽(含 4 根竖线与 6 处内边距)
|
\setlength{\gdtblw}{150.636mm} % 表宽(含 4 根竖线与 6 处内边距)
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
\newcommand{\gdwa}{19.0853mm} % 第 1 列内容宽
|
||||||
% 3.1 各列宽(= gridCol − 2×colsep − 竖线分摊)
|
\newcommand{\gdwb}{73.3601mm} % 第 2 列内容宽
|
||||||
% 与 gdtable 环境里 colspec 的 wd 必须逐字一致。
|
\newcommand{\gdwc}{46.2315mm} % 第 3 列内容宽
|
||||||
%----------------------------------------------------------------------
|
|
||||||
\newcommand{\gdwa}{19.0853mm} % c1 23.0717 − 3.8100 − 0.1764(线宽)
|
|
||||||
\newcommand{\gdwb}{73.3601mm} % c2 77.3465 − 3.8100 − 0.1764
|
|
||||||
\newcommand{\gdwc}{46.2315mm} % c3 50.2179 − 3.8100 − 0.1764
|
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
|
||||||
% 3.2 行高(扣掉边框线宽)
|
|
||||||
%
|
|
||||||
% ⚠️⚠️ tabularray 的 row{...}={ht=...} 是**内容区**高度,hline 的线宽
|
|
||||||
% 不包含在内 —— 实测每行都比 ht 高出整整一个 \gdrule(0.5pt):
|
|
||||||
% 原稿行距 39.00pt,按 ht=13.7583mm(=39.00pt) 排出来是 39.50pt
|
|
||||||
% 13 行累计多出 6.5pt,整表总高 533.88 vs 原稿 527.40
|
|
||||||
% ⇒ ht 需减去线宽 0.5pt = 0.1764mm:
|
|
||||||
% 表头 20.5493 − 0.1764 = 20.3729 mm
|
|
||||||
% 中间行 13.7583 − 0.1764 = 13.5819 mm
|
|
||||||
% 末 行 14.1640 − 0.1764 = 13.9876 mm
|
|
||||||
%----------------------------------------------------------------------
|
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 4. 行高
|
% 四、表格环境
|
||||||
%
|
%
|
||||||
% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast):
|
% 3 列:序号 / 内容 / 标注
|
||||||
% R1 表头 1165 twips = 20.5493 mm
|
% 第 1 行表头高 20.3729mm,正文行高 13.5819mm,末行 13.9876mm
|
||||||
% R2 ~ R13 780 twips = 13.7583 mm ← 12 行,逐行完全相同
|
|
||||||
% 最后一行 803 twips = 14.1640 mm ← 比其余 12 行高 0.406mm
|
|
||||||
% ────────────────────────────────────────
|
|
||||||
% 合计 20.5493 + 12×13.7583 + ... 见下
|
|
||||||
%
|
|
||||||
% ⚠️ 第 13 行(序号 12「试卷(项目设计报告)」)是 803 而非 780,
|
|
||||||
% 多出来的 23 twips 是 Word 里"字高 + 段前段后"凑出来的测量值,
|
|
||||||
% 照抄才能与原表逐行对齐。
|
|
||||||
%
|
|
||||||
% ⚠️ Word 的 exact 是"精确等于",内容超了会【被裁掉】。tabularray 的
|
|
||||||
% ht= 是最小行高(内容多则自动长高),语义更安全。本表各行内容都远
|
|
||||||
% 小于行高,两者结果相同,故直接写 ht=。
|
|
||||||
%======================================================================
|
|
||||||
|
|
||||||
%======================================================================
|
|
||||||
% 5. 表格环境
|
|
||||||
%
|
|
||||||
% ⚠️ 用 tblr 而非 longtblr:本表总高约 191mm,一页装得下(版心高
|
|
||||||
% 297 − 2×25.40 = 246.2 mm),不需要断页。
|
|
||||||
%
|
|
||||||
% ⚠️⚠️ colspec 与 row{} 必须字面写在这里,不能先存进宏再展开:
|
|
||||||
% tabularray 的列类型解析在宏展开之外进行,会报
|
|
||||||
% "Unexpandable command \xxx inside column type"。
|
|
||||||
% (所以 3.1 节那些 \gdwa… 只作文档用,不能拼进 colspec。)
|
|
||||||
%
|
|
||||||
% ⚠️ 选项里的宏名一律不带 @:tabularray 解析选项时 @ 不是字母。
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newenvironment{gdtable}{%
|
\newenvironment{gdtable}{%
|
||||||
\par\begingroup
|
\par\begingroup
|
||||||
@@ -263,96 +92,19 @@
|
|||||||
\end{tblr}\par\endgroup}
|
\end{tblr}\par\endgroup}
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 6. 单元格内容包装
|
% 五、单元格命令
|
||||||
%
|
|
||||||
% 本表全是单列格,tabularray 的 Q[c,m,wd=…] 已处理好居中与折行,
|
|
||||||
% 不需要 ouclw.sty 那种定宽 \parbox。这里只提供语义化的包装宏,
|
|
||||||
% 让 .tex 里不必反复写字体命令。
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
|
|
||||||
% \gdno{数字} —— 序号列:楷体 12pt 加粗
|
|
||||||
\newcommand{\gdno}[1]{{\kaiti\bfseries\gdcellfont #1\normalfont}}
|
\newcommand{\gdno}[1]{{\kaiti\bfseries\gdcellfont #1\normalfont}}
|
||||||
|
|
||||||
% \gditem{文字} —— 内容列:楷体 12pt
|
|
||||||
\newcommand{\gditem}[1]{{\kaiti\gdcellfont #1\normalfont}}
|
\newcommand{\gditem}[1]{{\kaiti\gdcellfont #1\normalfont}}
|
||||||
|
|
||||||
% 表头文字:楷体 18pt 加粗(只排字,不带任何垂直位移)
|
|
||||||
\newcommand{\gdheadraw}[1]{{\kaiti\bfseries\gdheadfont #1\normalfont}}
|
\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}}
|
\newcommand{\gdhead}[1]{\gdheadraw{#1}\par\vspace*{1.58pt}}
|
||||||
|
|
||||||
% 表头第三格的小字注释:楷体 10.45pt,不加粗
|
|
||||||
\newcommand{\gdnote}[1]{{\kaiti\gdnotefont #1\normalfont}}
|
\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}{%
|
\newcommand{\gdheadIII}{%
|
||||||
\gdheadraw{标注}\par
|
\gdheadraw{标注}\par
|
||||||
\vspace{6.72pt}%
|
\vspace{6.72pt}%
|
||||||
@@ -360,50 +112,17 @@
|
|||||||
\vspace*{-2.98pt}}%
|
\vspace*{-2.98pt}}%
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 7. 表外标题
|
% 六、标题
|
||||||
%
|
%
|
||||||
% 原 .doc 第 2 段(idx 1):
|
% 标题「归档目录」四字之间用 \gdgap 插入固定空隙。
|
||||||
% 楷体 24pt,jc 未设(左对齐),首行缩进 firstLine=2640 twips
|
% xeCJK 会吞掉连续半角空格,故不能用空格排版。
|
||||||
% = 46.55 mm,且 firstLineChars=550(即 5.5 字宽)。
|
|
||||||
% 文字是「归 档 目 录」,字间各留两个半角空格。
|
|
||||||
%
|
|
||||||
% 实测 PDF:四个字 x0 = 222.00 / 270.00 / 318.00 / 366.00 pt,
|
|
||||||
% 相邻间距恒为 48.00 pt,每字宽 24.00 pt
|
|
||||||
% ⇒ 字间空隙 = 48.00 − 24.00 = 24.00 pt = 1 个字宽 = 2 个半角空格 ✓
|
|
||||||
%
|
|
||||||
% ⚠️⚠️【不能直接把「归 档 目 录」写进源码】
|
|
||||||
% xeCJK 默认开启 CJKecglue,且会把连续半角空格吞成一个,
|
|
||||||
% 写「归 档 目 录」编译出来是「归档目录」紧贴(空格全没了,
|
|
||||||
% 实测 x0=216.09 且只有一个 span)。
|
|
||||||
%
|
|
||||||
% 正解:用实测的间距自己摆 —— 每字之间插入 \gdtitlegap
|
|
||||||
% = 24.00pt = 8.467mm 的固定空白。这样得到的字符位置与原稿逐字相同,
|
|
||||||
% 且不依赖 xeCJK 的空格策略。
|
|
||||||
% 实现见下面的 \gdtitle:参数是【逗号分隔的字】,逐字排并插 gap。
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newlength{\gdtitleindent}
|
\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}
|
\setlength{\gdtitleindent}{48.701mm}
|
||||||
|
|
||||||
\newlength{\gdtitlegap}
|
\newlength{\gdtitlegap}
|
||||||
\setlength{\gdtitlegap}{24bp} % 字间空隙 = 1 个字宽(实测 48−24)
|
\setlength{\gdtitlegap}{24bp} % 字间空隙 = 1 个字宽
|
||||||
|
|
||||||
% \gdgap —— 标题里的字间空隙,直接在 .tex 里逐字之间插入:
|
|
||||||
% \gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
|
|
||||||
% 比"逗号分隔、宏里循环"直观得多,也不用 \makeatletter。
|
|
||||||
\newcommand{\gdgap}{\kern\gdtitlegap}
|
\newcommand{\gdgap}{\kern\gdtitlegap}
|
||||||
|
|
||||||
\newcommand{\gdtitle}[1]{%
|
\newcommand{\gdtitle}[1]{%
|
||||||
@@ -412,50 +131,13 @@
|
|||||||
{\kaiti\gdtitlefont #1\normalfont\par}}
|
{\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}
|
\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}
|
\newlength{\gdtopskip}
|
||||||
\setlength{\gdtopskip}{2.7255mm}
|
\setlength{\gdtopskip}{2.7255mm} % 页顶到标题
|
||||||
|
|
||||||
\AtBeginDocument{\gdbasefont}
|
\AtBeginDocument{\gdbasefont}
|
||||||
\endinput
|
\endinput
|
||||||
+4
-4
@@ -10,7 +10,7 @@
|
|||||||
% 附件2:信息科学与工程学院归档目录(理论课).doc
|
% 附件2:信息科学与工程学院归档目录(理论课).doc
|
||||||
% (原文件名与内文写的是「学院」,现按现行建制改为「学部」)
|
% (原文件名与内文写的是「学院」,现按现行建制改为「学部」)
|
||||||
%
|
%
|
||||||
% 与原 .doc 的差异(有意为之):
|
% 与的差异(有意为之):
|
||||||
% · 单位名「学院」按现行建制改为「学部」,标题相应改为
|
% · 单位名「学院」按现行建制改为「学部」,标题相应改为
|
||||||
% 「信息科学与工程学部试卷归档目录」
|
% 「信息科学与工程学部试卷归档目录」
|
||||||
% · 原字体「方正楷体_GB2312」是商业字体,已换成 OUC Kai
|
% · 原字体「方正楷体_GB2312」是商业字体,已换成 OUC Kai
|
||||||
@@ -18,11 +18,11 @@
|
|||||||
% · 纸张、边距、表宽、列宽、行高、字号一律照原值,未做任何调整
|
% · 纸张、边距、表宽、列宽、行高、字号一律照原值,未做任何调整
|
||||||
% (详见 oucgddir.sty 的注释,每一项都附了换算过程)
|
% (详见 oucgddir.sty 的注释,每一项都附了换算过程)
|
||||||
%
|
%
|
||||||
% 与原 .doc 的一个【已知差异】(无法也无需还原):
|
% 与的一个【已知差异】(无法也无需还原):
|
||||||
% 原表的 tblGrid 合计 8540 twips = 150.64mm,比版心 146.50mm 宽
|
% 原表的 tblGrid 合计 8540 twips = 150.64mm,比版心 146.50mm 宽
|
||||||
% 4.14mm,即原文档里这张表本来就在版心之外各溢出 2.07mm。
|
% 4.14mm,即原文档里这张表本来就在版心之外各溢出 2.07mm。
|
||||||
% Word 按 jc=center 居中摆放,所以看起来正常。
|
% Word 按 jc=center 居中摆放,所以看起来正常。
|
||||||
% 本模板把版心直接设成表宽,表格居中与纸面的绝对位置与原稿一致,
|
% 本模板把版心直接设成表宽,表格居中与纸面的绝对位置,
|
||||||
% 但不再"溢出版心"。视觉上无差别,且不会产生 Overfull 警告。
|
% 但不再"溢出版心"。视觉上无差别,且不会产生 Overfull 警告。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\documentclass[UTF8,fontset=none]{ctexart}
|
\documentclass[UTF8,fontset=none]{ctexart}
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
% ⚠️ 标题里的空格【不能】写成「归 档 目 录」—— xeCJK 会吞掉连续
|
% ⚠️ 标题里的空格【不能】写成「归 档 目 录」—— xeCJK 会吞掉连续
|
||||||
% 半角空格,编译出来是紧贴的「归档目录」。必须用 \gdgap 手动插入
|
% 半角空格,编译出来是紧贴的「归档目录」。必须用 \gdgap 手动插入
|
||||||
% 24bp(= 1 个字宽)的固定空隙,才能与原稿逐字对齐。
|
% 24bp(= 1 个字宽)的固定空隙,才能与逐字对齐。
|
||||||
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
|
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
|
||||||
|
|
||||||
\vspace{\gdheadskip}
|
\vspace{\gdheadskip}
|
||||||
|
|||||||
+23
-25
@@ -7,7 +7,7 @@
|
|||||||
% ⚠️ 编译: xelatex 课程大纲.tex
|
% ⚠️ 编译: xelatex 课程大纲.tex
|
||||||
% 单次编译即可,无交叉引用、无目录。
|
% 单次编译即可,无交叉引用、无目录。
|
||||||
% 依赖 ctex + geometry + fontspec + xeCJK + tabularray
|
% 依赖 ctex + geometry + fontspec + xeCJK + tabularray
|
||||||
% 实测 TeX Live 2022 / tabularray 2022A
|
% 实际TeX Live 2022 / tabularray 2022A
|
||||||
% 与 课程执行大纲/ 的 ouccourse.sty 同源同风格,可对照看。
|
% 与 课程执行大纲/ 的 ouccourse.sty 同源同风格,可对照看。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\NeedsTeXFormat{LaTeX2e}
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面
|
% 1. 页面
|
||||||
%
|
%
|
||||||
% 原 docx sectPr 实测:
|
% sectPr
|
||||||
% pgSz 宽 210.01 mm 高 297.00 mm
|
% pgSz 宽 210.01 mm 高 297.00 mm
|
||||||
% (WPS 存的 A4 是 11910×16840 twips,比标准 A4 的
|
% (WPS 存的 A4 是 11910×16840 twips,比标准 A4 的
|
||||||
% 11906×16838 各多 4/2 twips。差 0.07/0.04 mm,肉眼不可辨,
|
% 11906×16838 各多 4/2 twips。差 0.07/0.04 mm,肉眼不可辨,
|
||||||
@@ -46,23 +46,23 @@
|
|||||||
}
|
}
|
||||||
\setlength{\parindent}{0pt}
|
\setlength{\parindent}{0pt}
|
||||||
\setlength{\parskip}{0pt}
|
\setlength{\parskip}{0pt}
|
||||||
\pagestyle{empty} % 原 docx 无页眉页脚、无页码
|
\pagestyle{empty} % 无页眉页脚、无页码
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 2. 字体
|
% 2. 字体
|
||||||
%
|
%
|
||||||
% 原 docx 用到:Times New Roman / 宋体 / 黑体 / 仿宋_GB2312 / 仿宋 /
|
% 用到:Times New Roman / 宋体 / 黑体 / 仿宋_GB2312 / 仿宋 /
|
||||||
% 微软雅黑。其中「仿宋_GB2312」是商业字体,不能随仓库分发,且换机器
|
% 微软雅黑。其中「仿宋_GB2312」是商业字体,不能随仓库分发,且换机器
|
||||||
% 编不出来(#17 脱敏时定下的规矩)。
|
% 编不出来。
|
||||||
%
|
%
|
||||||
% ⇒ 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下):
|
% ⇒ 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下):
|
||||||
% 宋体正文 → OUC Serif(思源宋体子集,真粗体)
|
% 宋体正文 → OUC Serif(思源宋体子集,真粗体)
|
||||||
% 黑体标题 → OUC Sans(思源黑体子集)
|
% 黑体标题 → OUC Sans(思源黑体子集)
|
||||||
% 仿宋 → OUC Fang(朱雀仿宋)—— 仅在表格内用,见下
|
% 仿宋 → OUC Fang(朱雀仿宋)—— 仅在表格内用,见下
|
||||||
% 西文/数字 → 与中文同族 OUC Serif(#20 定下的统一做法)
|
% 西文/数字 → 与中文同族 OUC Serif(定下的统一做法)
|
||||||
%
|
%
|
||||||
% ⚠️ 为什么正文不用仿宋
|
% ⚠️ 为什么正文不用仿宋
|
||||||
% 原 docx 正文是「仿宋_GB2312」,但那是**表格内**的排版习惯。
|
% 正文是「仿宋_GB2312」,但那是**表格内**的排版习惯。
|
||||||
% 正文大段用仿宋在屏幕上发虚、打印也偏淡,学校下发文件的正文
|
% 正文大段用仿宋在屏幕上发虚、打印也偏淡,学校下发文件的正文
|
||||||
% 实际以宋体为主。本包正文用宋体,表格内保持仿宋观感(可选项
|
% 实际以宋体为主。本包正文用宋体,表格内保持仿宋观感(可选项
|
||||||
% \oucSylFangTabletrue 打开,默认关,见第 5 节)。
|
% \oucSylFangTabletrue 打开,默认关,见第 5 节)。
|
||||||
@@ -72,28 +72,27 @@
|
|||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 西文切换命令(与 试卷/ouckey.sty 的 \TNR 同义,保持全库一致)
|
% 西文切换命令(与 试卷/ouckey.sty 的 \TNR 同义,保持全库一致)
|
||||||
%
|
%
|
||||||
% ⚠️ 本包没有把 \setmainfont 改到思源宋体(那是 #20 为试卷做的决定)。
|
% ⚠️ 本包没有把 \setmainfont 改到思源宋体。
|
||||||
% 课程大纲原文里西文与中文混排不多,主要是年份、百分比、器件型号
|
% 课程大纲原文里西文与中文混排不多,主要是年份、百分比、器件型号
|
||||||
% (PROM/PLA/3-8 译码器),这些用默认西文字体即可。
|
% (PROM/PLA/3-8 译码器),这些用默认西文字体即可。
|
||||||
% \TNR{} 在这里保留,是为了跟其他模板的调用习惯一致 ——
|
% \TNR{} 在这里保留,是为了跟其他模板的调用习惯一致 ——
|
||||||
% 将来若要把西文也统一到思源宋体,只需改 \setmainfont,调用点不用动。
|
% 将来若要把西文也统一到思源宋体,只需改 \setmainfont,调用点不用动。
|
||||||
%
|
%
|
||||||
% ⚠️ 必须显式 \normalfont 收尾:xeCJK 下字体切换若紧邻 \par 会"溢出"
|
% ⚠️ 必须显式 \normalfont 收尾:xeCJK 下字体切换若紧邻 \par 会"溢出"
|
||||||
% 到下一段,导致后面裸 ASCII 全被排成西文字体(#20 踩过)。
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
\newcommand{\TNR}[1]{{\tnr #1\normalfont}}
|
\newcommand{\TNR}[1]{{\tnr #1\normalfont}}
|
||||||
\newcommand{\TNRB}[1]{{\tnrb #1\normalfont}}
|
\newcommand{\TNRB}[1]{{\tnrb #1\normalfont}}
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 字号(pt,直接对应原 docx 的 sz 值)
|
% 字号(pt,直接对应的 sz 值)
|
||||||
%
|
%
|
||||||
% 原 docx 字号分布(段落计数):
|
% 字号分布(段落计数):
|
||||||
% 15pt 居中 ×1 —— 大标题「中国海洋大学本科生课程大纲」
|
% 15pt 居中 ×1 —— 大标题「中国海洋大学本科生课程大纲」
|
||||||
% 12pt ×32+19+7+3 —— 正文、各级章节标题、表头
|
% 12pt ×32+19+7+3 —— 正文、各级章节标题、表头
|
||||||
% 10.5pt ×1 —— 「六、成绩评定」(原文件此处字号不一致,见下)
|
% 10.5pt ×1 —— 「六、成绩评定」(原文件此处字号不一致,见下)
|
||||||
% 9~10pt ×27 —— 表格内容
|
% 9~10pt ×27 —— 表格内容
|
||||||
%
|
%
|
||||||
% ⚠️ 「六、成绩评定」在原 docx 里是 10.5pt,与其余七个章节标题的 12pt
|
% ⚠️ 「六、成绩评定」在里是 10.5pt,与其余七个章节标题的 12pt
|
||||||
% 不一致。这是原文件的疏漏(复制粘贴时漏改),本包统一按 12pt 处理,
|
% 不一致。这是原文件的疏漏(复制粘贴时漏改),本包统一按 12pt 处理,
|
||||||
% 并在 README 记录这一处偏离。
|
% 并在 README 记录这一处偏离。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
@@ -109,20 +108,20 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 3. 标题与章节
|
% 3. 标题与章节
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 大标题:15pt 黑体居中(原 docx 是微软雅黑,此处用 OUC Sans 顶替)
|
% 大标题:15pt 黑体居中(是微软雅黑,此处用 OUC Sans 顶替)
|
||||||
\newcommand{\oucsylmaintitle}[1]{%
|
\newcommand{\oucsylmaintitle}[1]{%
|
||||||
\par\begingroup\Syw\heiti\centering #1\par\endgroup
|
\par\begingroup\Syw\heiti\centering #1\par\endgroup
|
||||||
\vspace*{6bp}}
|
\vspace*{6bp}}
|
||||||
|
|
||||||
% 一级章节标题:一、二、三… 12pt 黑体,段前留白
|
% 一级章节标题:一、二、三… 12pt 黑体,段前留白
|
||||||
% 原 docx 里章节标题与其后正文同字号同字体,仅靠「一、」区分,
|
% 里章节标题与其后正文同字号同字体,仅靠「一、」区分,
|
||||||
% 视觉层级偏弱。这里给黑体以拉开层次(与 课程执行大纲 的做法一致)。
|
% 视觉层级偏弱。这里给黑体以拉开层次(与 课程执行大纲 的做法一致)。
|
||||||
\newcommand{\oucsylsection}[1]{%
|
\newcommand{\oucsylsection}[1]{%
|
||||||
\par\addvspace{10bp}%
|
\par\addvspace{10bp}%
|
||||||
\noindent{\Sxii\heiti #1}\par
|
\noindent{\Sxii\heiti #1}\par
|
||||||
\addvspace{4bp}}
|
\addvspace{4bp}}
|
||||||
|
|
||||||
% 二级小节:1. 2. 3.… 12pt 宋体(原 docx 就是宋体,不加粗)
|
% 二级小节:1. 2. 3.… 12pt 宋体(就是宋体,不加粗)
|
||||||
\newcommand{\oucsylsubsection}[1]{%
|
\newcommand{\oucsylsubsection}[1]{%
|
||||||
\par\addvspace{5bp}%
|
\par\addvspace{5bp}%
|
||||||
\noindent{\Sxii #1}\par
|
\noindent{\Sxii #1}\par
|
||||||
@@ -131,13 +130,12 @@
|
|||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 正文段落(首行缩进 2 字符)
|
% 正文段落(首行缩进 2 字符)
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 这里踩了一个很隐蔽的坑,三种常见写法全部越界:
|
|
||||||
%
|
%
|
||||||
% ① `\par\noindent\hspace*{2em}#1\par`
|
% ① `\par\noindent\hspace*{2em}#1\par`
|
||||||
% ② `\par\setlength{\parindent}{2em}\indent #1\par`
|
% ② `\par\setlength{\parindent}{2em}\indent #1\par`
|
||||||
% ③ `\parbox{\linewidth}{\setlength{\parindent}{2em}\indent #1}`
|
% ③ `\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 ✅ 正确
|
% 无缩进的纯中文段落 右缘 523.28 ✅ 正确
|
||||||
% ①②③ 三种带缩进的写法 右缘 530.53 ❌ 超 7.25bp
|
% ①②③ 三种带缩进的写法 右缘 530.53 ❌ 超 7.25bp
|
||||||
%
|
%
|
||||||
@@ -152,7 +150,7 @@
|
|||||||
% 就是缩进后的真实宽度,断行点才落对。
|
% 就是缩进后的真实宽度,断行点才落对。
|
||||||
% \setlength{\hsize}{\dimexpr\linewidth-2em\relax}
|
% \setlength{\hsize}{\dimexpr\linewidth-2em\relax}
|
||||||
% \setlength{\parindent}{2em}
|
% \setlength{\parindent}{2em}
|
||||||
% 实测右缘 502.28bp,落在版心内(比版心右界还留了 21bp 余量,
|
% 实际右缘 502.28bp,落在版心内(比版心右界还留了 21bp 余量,
|
||||||
% 因为最后一行没排满,属正常)。
|
% 因为最后一行没排满,属正常)。
|
||||||
%
|
%
|
||||||
% ⚠️ \hsize 必须用 \begingroup 包住,否则影响后续所有段落。
|
% ⚠️ \hsize 必须用 \begingroup 包住,否则影响后续所有段落。
|
||||||
@@ -174,7 +172,7 @@
|
|||||||
% 选它的理由:需要列宽自适应 + 长文本自动换行 + 跨行合并,
|
% 选它的理由:需要列宽自适应 + 长文本自动换行 + 跨行合并,
|
||||||
% tabularray 的 X 列比 tabularx 更好控制,且 2022A 之后稳定。
|
% tabularray 的 X 列比 tabularx 更好控制,且 2022A 之后稳定。
|
||||||
%
|
%
|
||||||
% 原 docx 表格边框:tblBorders sz=4 → 0.5pt 实线,四边都有
|
% 表格边框:tblBorders sz=4 → 0.5pt 实线,四边都有
|
||||||
% 单元格内边距:tblCellMar 108 twips = 1.905mm
|
% 单元格内边距:tblCellMar 108 twips = 1.905mm
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\oucsylborder}{0.5pt}
|
\newcommand{\oucsylborder}{0.5pt}
|
||||||
@@ -182,7 +180,7 @@
|
|||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 4.1 表 0:课程基本信息(6 行 × 6 列,不规则)
|
% 4.1 表 0:课程基本信息(6 行 × 6 列,不规则)
|
||||||
%
|
%
|
||||||
% 原 docx 结构(竖线位置逐行不同,用 \SetCell 合并实现):
|
% 结构(竖线位置逐行不同,用 \SetCell 合并实现):
|
||||||
% R0 课程名称 | (中文)数字逻辑 ← 2 格
|
% R0 课程名称 | (中文)数字逻辑 ← 2 格
|
||||||
% R1 课程名称 | (英文)Digital Logic ← 2 格
|
% R1 课程名称 | (英文)Digital Logic ← 2 格
|
||||||
% R2 课程代码 | 080502101231 | 责任教师 | 杨永全 ← 4 格
|
% R2 课程代码 | 080502101231 | 责任教师 | 杨永全 ← 4 格
|
||||||
@@ -191,7 +189,7 @@
|
|||||||
% R5 理论课时 | 32 | 实践课时 | 16 | 课外学时 | 32 ← 6 格
|
% R5 理论课时 | 32 | 实践课时 | 16 | 课外学时 | 32 ← 6 格
|
||||||
%
|
%
|
||||||
% ⚠️ 列宽不能全用固定值。课程代码「080502101231」是 12 位数字,
|
% ⚠️ 列宽不能全用固定值。课程代码「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 时 Overfull 10.26pt(约 3.6mm),放不下。
|
||||||
% ⇒ 标签列固定 26.5mm(四个字「课程名称」正好),值列用 X 自动分配。
|
% ⇒ 标签列固定 26.5mm(四个字「课程名称」正好),值列用 X 自动分配。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
@@ -235,7 +233,7 @@
|
|||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 4.3 打勾矩阵(表 1:课程目标 × 指标点)
|
% 4.3 打勾矩阵(表 1:课程目标 × 指标点)
|
||||||
%
|
%
|
||||||
% 原 docx:6 行 × 6 列,首行首格空白,其余为「课程目标1..5」,
|
% :6 行 × 6 列,首行首格空白,其余为「课程目标1..5」,
|
||||||
% 首列表头为「指标点1.1 / 2.2 / 2.3 / 3.1 / 4.1」,中间 25 格全空
|
% 首列表头为「指标点1.1 / 2.2 / 2.3 / 3.1 / 4.1」,中间 25 格全空
|
||||||
% (留给填 ✓ 或涂色)。
|
% (留给填 ✓ 或涂色)。
|
||||||
%
|
%
|
||||||
@@ -261,11 +259,11 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 带编号的条目(课程目标、学习要求那种「1.xxx」)
|
% 带编号的条目(课程目标、学习要求那种「1.xxx」)
|
||||||
%
|
%
|
||||||
% ⚠️ 原 docx 用的是**全角句点**「.」(U+FF0E),不是 ASCII 句点「.」。
|
% ⚠️ 用的是**全角句点**「.」(U+FF0E),不是 ASCII 句点「.」。
|
||||||
% 本包照抄全角。写 \oucsylp{1.xxx} 即可,不要写成 1.xxx —— 全角句点
|
% 本包照抄全角。写 \oucsylp{1.xxx} 即可,不要写成 1.xxx —— 全角句点
|
||||||
% 后面没有额外间距,ASCII 句点会多出一个小空隙,与原卷不一致。
|
% 后面没有额外间距,ASCII 句点会多出一个小空隙,与原卷不一致。
|
||||||
%
|
%
|
||||||
% ⚠️ 这里**不提供** list 环境。原 docx 的这些条目是普通段落 + 首行缩进,
|
% ⚠️ 这里**不提供** list 环境。的这些条目是普通段落 + 首行缩进,
|
||||||
% 不是真正的列表(没有悬挂缩进,编号后面直接跟文字)。
|
% 不是真正的列表(没有悬挂缩进,编号后面直接跟文字)。
|
||||||
% 用 list 反而会让第二行缩进到编号右侧,与原卷不一致。
|
% 用 list 反而会让第二行缩进到编号右侧,与原卷不一致。
|
||||||
% ⇒ 直接用 \oucsylp{1.xxx},编号是正文的一部分。
|
% ⇒ 直接用 \oucsylp{1.xxx},编号是正文的一部分。
|
||||||
@@ -275,7 +273,7 @@
|
|||||||
\par\addvspace{4bp}\noindent{\Sxii #1}\par\addvspace{2bp}}
|
\par\addvspace{4bp}\noindent{\Sxii #1}\par\addvspace{2bp}}
|
||||||
|
|
||||||
% 签字栏(大纲审核)
|
% 签字栏(大纲审核)
|
||||||
% 原 docx:「教学院长: 院学术委员会签章:」
|
% :「教学院长: 院学术委员会签章:」
|
||||||
% 两个字段各占半行,与 课程执行大纲 的签字栏写法一致
|
% 两个字段各占半行,与 课程执行大纲 的签字栏写法一致
|
||||||
\newcommand{\oucsylsignature}{%
|
\newcommand{\oucsylsignature}{%
|
||||||
\par\addvspace{14bp}%
|
\par\addvspace{14bp}%
|
||||||
|
|||||||
+3
-6
@@ -2,7 +2,6 @@
|
|||||||
% 中国海洋大学本科生课程大纲(示例:数字逻辑)
|
% 中国海洋大学本科生课程大纲(示例:数字逻辑)
|
||||||
%
|
%
|
||||||
% 用途:演示 oucSyllabus.sty 的用法。内容取自学校下发的
|
% 用途:演示 oucSyllabus.sty 的用法。内容取自学校下发的
|
||||||
% 课程大纲模板-数字逻辑-2024版.docx,**已脱敏**:
|
|
||||||
% 责任教师等真实姓名一律换成虚构名,与仓库其他模板一致。
|
% 责任教师等真实姓名一律换成虚构名,与仓库其他模板一致。
|
||||||
%
|
%
|
||||||
% 编译: xelatex 课程大纲.tex (单次即可)
|
% 编译: xelatex 课程大纲.tex (单次即可)
|
||||||
@@ -21,7 +20,7 @@
|
|||||||
\newcommand{\sylnamecn}{数字逻辑}
|
\newcommand{\sylnamecn}{数字逻辑}
|
||||||
\newcommand{\sylnameen}{Digital Logic}
|
\newcommand{\sylnameen}{Digital Logic}
|
||||||
\newcommand{\sylcode}{080502101231}
|
\newcommand{\sylcode}{080502101231}
|
||||||
\newcommand{\sylteacher}{张远航} % ← 虚构姓名,脱敏
|
\newcommand{\sylteacher}{张远航}
|
||||||
\newcommand{\sylattr}{专业知识}
|
\newcommand{\sylattr}{专业知识}
|
||||||
\newcommand{\sylnature}{必修}
|
\newcommand{\sylnature}{必修}
|
||||||
\newcommand{\sylcredit}{2.5}
|
\newcommand{\sylcredit}{2.5}
|
||||||
@@ -40,12 +39,10 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 表 0:课程基本信息
|
% 表 0:课程基本信息
|
||||||
%
|
%
|
||||||
% 原 docx 逐行结构见 oucSyllabus.sty 第 4.1 节的注释。
|
% 逐行结构见 oucSyllabus.sty 第 4.1 节的注释。
|
||||||
% ⚠️⚠️ tabularray 的 \SetCell 坑(踩了五次,最小复现已确认):
|
|
||||||
%
|
%
|
||||||
% `\SetCell[c=2]{c} 内容 & 下一格` → **下一格被吞掉,内容消失**
|
% `\SetCell[c=2]{c} 内容 & 下一格` → **下一格被吞掉,内容消失**
|
||||||
%
|
%
|
||||||
% 最小复现(6 列表):
|
|
||||||
% A & \SetCell[c=2]{c} B & C & \SetCell[c=2]{c} D \\
|
% A & \SetCell[c=2]{c} B & C & \SetCell[c=2]{c} D \\
|
||||||
% 渲染只得 A / B / D,**C 消失**,且不报错。
|
% 渲染只得 A / B / D,**C 消失**,且不报错。
|
||||||
%
|
%
|
||||||
@@ -59,7 +56,7 @@
|
|||||||
% 本表 6 列,三行分别:
|
% 本表 6 列,三行分别:
|
||||||
% R0/R1 `标签 & \SetCell[c=5]{值} & {}{}{}{} ` → 1+5=6 格
|
% R0/R1 `标签 & \SetCell[c=5]{值} & {}{}{}{} ` → 1+5=6 格
|
||||||
% ⚠️ c=5 后面要 4 个 `{}`,但那会写得很长;
|
% ⚠️ c=5 后面要 4 个 `{}`,但那会写得很长;
|
||||||
% 实测 c=5 放行末(直接 `\\` 不接 `&`)也能正确渲染,
|
% 实际c=5 放行末(直接 `\\` 不接 `&`)也能正确渲染,
|
||||||
% 且更易读 —— 本文件用这种写法(已验证可行)。
|
% 且更易读 —— 本文件用这种写法(已验证可行)。
|
||||||
% R2~R4 6 格平铺:标签 & 值 & 标签 & 值 & {} & {}
|
% R2~R4 6 格平铺:标签 & 值 & 标签 & 值 & {} & {}
|
||||||
% R5 6 格平铺
|
% R5 6 格平铺
|
||||||
|
|||||||
+16
-17
@@ -6,7 +6,7 @@
|
|||||||
%
|
%
|
||||||
% ⚠️ 编译: xelatex 课程执行大纲.tex (单次即可,无交叉引用)
|
% ⚠️ 编译: xelatex 课程执行大纲.tex (单次即可,无交叉引用)
|
||||||
% 需要 ctex + geometry + fontspec + xeCJK + tabularray
|
% 需要 ctex + geometry + fontspec + xeCJK + tabularray
|
||||||
% 实测 TeX Live 2022 / tabularray 2022A
|
% 实际TeX Live 2022 / tabularray 2022A
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\NeedsTeXFormat{LaTeX2e}
|
\NeedsTeXFormat{LaTeX2e}
|
||||||
\ProvidesPackage{ouccourse}[2026/10/26 v1.0 OUC course syllabus form]
|
\ProvidesPackage{ouccourse}[2026/10/26 v1.0 OUC course syllabus form]
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面
|
% 1. 页面
|
||||||
%
|
%
|
||||||
% 原 docx sectPr:
|
% sectPr:
|
||||||
% pgSz 11910 x 16840 twips → 210.08 x 297.04 mm
|
% pgSz 11910 x 16840 twips → 210.08 x 297.04 mm
|
||||||
% pgMar top 1420 right 1300 bottom 280 left 1560
|
% pgMar top 1420 right 1300 bottom 280 left 1560
|
||||||
% header 720 footer 720
|
% header 720 footer 720
|
||||||
@@ -50,18 +50,17 @@
|
|||||||
}
|
}
|
||||||
\setlength{\parindent}{0pt}
|
\setlength{\parindent}{0pt}
|
||||||
\setlength{\parskip}{0pt}
|
\setlength{\parskip}{0pt}
|
||||||
\pagestyle{empty} % 原 docx 无页眉页脚、无页码
|
\pagestyle{empty} % 无页眉页脚、无页码
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 2. 字体
|
% 2. 字体
|
||||||
%
|
%
|
||||||
% 原 docx 用到 4 个字体,其中 3 个是方正商业字体:
|
% 用到 4 个字体,其中 3 个是方正商业字体:
|
||||||
% 方正小标宋简体 标题(嵌在 docx 里,系统未安装)
|
% 方正小标宋简体 标题(嵌在 docx 里,系统未安装)
|
||||||
% 方正仿宋_GB2312 正文(同上)
|
% 方正仿宋_GB2312 正文(同上)
|
||||||
% 黑体 各级标题
|
% 黑体 各级标题
|
||||||
% 宋体 教学日历表正文、9pt
|
% 宋体 教学日历表正文、9pt
|
||||||
%
|
%
|
||||||
% 旧版这里是 SimSun / SimHei / FangSong + AutoFakeBold 伪粗,即
|
|
||||||
% 「本机恰好有 Windows 自带字体」的降级方案。问题有两层:
|
% 「本机恰好有 Windows 自带字体」的降级方案。问题有两层:
|
||||||
% ① 换台机器(Linux/macOS、或精简版 Windows)就编不出来;
|
% ① 换台机器(Linux/macOS、或精简版 Windows)就编不出来;
|
||||||
% ② SimSun / SimHei / FangSong 都不允许随仓库分发。
|
% ② SimSun / SimHei / FangSong 都不允许随仓库分发。
|
||||||
@@ -84,7 +83,7 @@
|
|||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% ⚠️ xeCJK 默认会在[汉字 ↔ 西文/数字]之间自动插一段空白(CJKecglue)。
|
% ⚠️ xeCJK 默认会在[汉字 ↔ 西文/数字]之间自动插一段空白(CJKecglue)。
|
||||||
% 原 docx 里没有这种空白,例如「××学部××学院」「2026 学年」「56/3.0」
|
% 里没有这种空白,例如「××学部××学院」「2026 学年」「56/3.0」
|
||||||
% 在 Word 里是紧挨着的。不关掉会出现「×× 学部×× 学院」这种多出来的空隙。
|
% 在 Word 里是紧挨着的。不关掉会出现「×× 学部×× 学院」这种多出来的空隙。
|
||||||
% 此处把 CJKecglue 设为 0,并关掉自动间距(xeCJK 的 punct/ec 两类)。
|
% 此处把 CJKecglue 设为 0,并关掉自动间距(xeCJK 的 punct/ec 两类)。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
@@ -164,7 +163,7 @@
|
|||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% 3. 首页字段区
|
% 3. 首页字段区
|
||||||
%
|
%
|
||||||
% 原 docx P3~P8 共用同一个 pPr:
|
% P3~P8 共用同一个 pPr:
|
||||||
% <w:tabs><w:tab w:val="left" w:pos="7020"/></w:tabs>
|
% <w:tabs><w:tab w:val="left" w:pos="7020"/></w:tabs>
|
||||||
% <w:spacing w:line="460" w:lineRule="exact"/>
|
% <w:spacing w:line="460" w:lineRule="exact"/>
|
||||||
% <w:ind w:left="-565" w:leftChars="-257" w:firstLine="220" w:firstLineChars="100"/>
|
% <w:ind w:left="-565" w:leftChars="-257" w:firstLine="220" w:firstLineChars="100"/>
|
||||||
@@ -174,15 +173,15 @@
|
|||||||
% → 首行再 +220 twips = +3.88 mm
|
% → 首行再 +220 twips = +3.88 mm
|
||||||
% → 制表位 7020 twips = 123.81 mm
|
% → 制表位 7020 twips = 123.81 mm
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 实测 docx 这几行是【溢出】的,不能照抄:
|
% ⚠️⚠️ 实际docx 这几行是【溢出】的,不能照抄:
|
||||||
% 制表位绝对位置 = 27.52(左边距)+ 123.81 = 141.33 mm,
|
% 制表位绝对位置 = 27.52(左边距)+ 123.81 = 141.33 mm,
|
||||||
% 而右侧内容【开课时间】 2026 学年 秋 季学期 宽 58.20 mm,
|
% 而右侧内容【开课时间】 2026 学年 秋 季学期 宽 58.20 mm,
|
||||||
% ⇒ 行尾落在 199.53 mm,已越过版心右边界 187.07 mm 达 12.5 mm,
|
% ⇒ 行尾落在 199.53 mm,已越过版心右边界 187.07 mm 达 12.5 mm,
|
||||||
% 钻进了 22.93 mm 的右边距里。原文件靠负缩进硬塞,视觉上不易察觉。
|
% 钻进了 22.93 mm 的右边距里。原文件靠负缩进硬塞,视觉上不易察觉。
|
||||||
%
|
%
|
||||||
% ⇒ 本包改为干净的两栏等宽布局,两栏都对齐、整体不溢出:
|
% ⇒ 本包改为干净的两栏等宽布局,两栏都对齐、整体不溢出:
|
||||||
% 左栏宽 100 mm(容纳【课程名】+值,实测最长 48.7 mm)
|
% 左栏宽 100 mm(容纳【课程名】+值,最长 48.7 mm)
|
||||||
% 右栏从 100 mm 起,实测最长【开课时间】58.2 mm,合计 158.2 mm
|
% 右栏从 100 mm 起,最长【开课时间】58.2 mm,合计 158.2 mm
|
||||||
% 版心 159.55 mm,留 1.35 mm 余量
|
% 版心 159.55 mm,留 1.35 mm 余量
|
||||||
% 各行左标签起点一致、右标签起点也一致,比原文件更整齐。
|
% 各行左标签起点一致、右标签起点也一致,比原文件更整齐。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
@@ -328,7 +327,7 @@
|
|||||||
\newcommand{\ccscoreBwd}{20.937mm}
|
\newcommand{\ccscoreBwd}{20.937mm}
|
||||||
|
|
||||||
% ⚠️ 行高:docx 是 trHeight 454 exact = 22.70pt = 8.01mm。
|
% ⚠️ 行高: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。
|
% (每行多 0.18 = 一条 0.5pt 横线)。故减掉 0.176mm。
|
||||||
\newcommand{\ccscorerowht}{7.834mm}
|
\newcommand{\ccscorerowht}{7.834mm}
|
||||||
|
|
||||||
@@ -362,8 +361,8 @@
|
|||||||
% 本包做法:列宽照抄 gridCol,用 \hspace* 把表左边界推到实际的 27.4mm。
|
% 本包做法:列宽照抄 gridCol,用 \hspace* 把表左边界推到实际的 27.4mm。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ 这张表【总高 334 mm】,版心只有 267 mm —— 必须跨页!
|
% ⚠️⚠️ 这张表【总高 334 mm】,版心只有 267 mm —— 必须跨页!
|
||||||
% 这就是原 docx 排成 5 页的原因。表内 16 行,R1~R13 无 trHeight,
|
% 这就是排成 5 页的原因。表内 16 行,R1~R13 无 trHeight,
|
||||||
% 行高由内容(9pt 宋体多行)决定,实测各段行高见 README。
|
% 行高由内容(9pt 宋体多行)决定,各段行高见 README。
|
||||||
% docx 没有 tblHeader(跨页不重复表头)、没有 cantSplit(允许行内断开),
|
% docx 没有 tblHeader(跨页不重复表头)、没有 cantSplit(允许行内断开),
|
||||||
% 故本包用 longtblr,且清空表头/表尾模板,行为与 Word 一致。
|
% 故本包用 longtblr,且清空表头/表尾模板,行为与 Word 一致。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
@@ -383,7 +382,7 @@
|
|||||||
% 6 列共 7 条竖线,若全摊到 6 列上,每列承担 7/6 条 ⇒ 0.2058mm。
|
% 6 列共 7 条竖线,若全摊到 6 列上,每列承担 7/6 条 ⇒ 0.2058mm。
|
||||||
% ⇒ wd = gridCol − 3.81 − 0.2058 = gridCol − 4.0158mm
|
% ⇒ 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 + 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 ✔
|
% 改后 Σ(wd+2·colsep) + 7×0.176 = 141.443+22.86+1.232 = 165.535 ≈ 165.54 ✔
|
||||||
\newcommand{\ccAwd}{10.906mm} % 14.922 − 4.0158
|
\newcommand{\ccAwd}{10.906mm} % 14.922 − 4.0158
|
||||||
@@ -424,7 +423,7 @@
|
|||||||
% 直接写 \begin{longtblr} 环境最稳。
|
% 直接写 \begin{longtblr} 环境最稳。
|
||||||
%
|
%
|
||||||
% ⚠️ longtblr 默认会在跨页处印 "( Continued )"、印 "表N:" 题注、
|
% ⚠️ longtblr 默认会在跨页处印 "( Continued )"、印 "表N:" 题注、
|
||||||
% 页尾印 "Continued on next page"。而原 docx 没有 tblHeader、
|
% 页尾印 "Continued on next page"。而没有 tblHeader、
|
||||||
% 没有题注、没有任何续页提示。
|
% 没有题注、没有任何续页提示。
|
||||||
%
|
%
|
||||||
% 清干净需要动【两组】东西,只清一组不够:
|
% 清干净需要动【两组】东西,只清一组不够:
|
||||||
@@ -432,7 +431,7 @@
|
|||||||
% (模板实例里调的是 \UseTblrTemplate{...}{default},
|
% (模板实例里调的是 \UseTblrTemplate{...}{default},
|
||||||
% 只把 conthead 设成 empty 而留着 conthead-text,仍会印出 "( Continued )")
|
% 只把 conthead 设成 empty 而留着 conthead-text,仍会印出 "( Continued )")
|
||||||
% (b) 模板实例:caption / conthead / contfoot
|
% (b) 模板实例:caption / conthead / contfoot
|
||||||
% 实测只做 (b) 时第 5 页仍会出现 "表0:" 与 "(Continued)"。
|
% 实际只做 (b) 时第 5 页仍会出现 "表0:" 与 "(Continued)"。
|
||||||
%
|
%
|
||||||
% ⚠️⚠️ conthead-text / contfoot-text 不能设成 empty!那会报
|
% ⚠️⚠️ conthead-text / contfoot-text 不能设成 empty!那会报
|
||||||
% "! Use of \??? doesn't match its definition.
|
% "! Use of \??? doesn't match its definition.
|
||||||
@@ -458,7 +457,7 @@
|
|||||||
label=none,
|
label=none,
|
||||||
% ⚠️⚠️ presep/postsep/headsep/footsep 是【outer】键,只能写在这个方括号里。
|
% ⚠️⚠️ presep/postsep/headsep/footsep 是【outer】键,只能写在这个方括号里。
|
||||||
% 写进下面的花括号(inner spec)里不会生效,反而会把 "0pt" 当表内容
|
% 写进下面的花括号(inner spec)里不会生效,反而会把 "0pt" 当表内容
|
||||||
% 印在表格第一行 —— 实测表头上出现了一串 "0pt0pt0pt0pt" 垃圾字。
|
% 印在表格第一行 —— 实际表头上出现了一串 "0pt0pt0pt0pt" 垃圾字。
|
||||||
presep=0pt, postsep=0pt, headsep=0pt, footsep=0pt,
|
presep=0pt, postsep=0pt, headsep=0pt, footsep=0pt,
|
||||||
]{
|
]{
|
||||||
colspec={
|
colspec={
|
||||||
|
|||||||
+4
-4
@@ -69,10 +69,10 @@
|
|||||||
% ⚠️ 英文段:不要在此处加任何断行干预。
|
% ⚠️ 英文段:不要在此处加任何断行干预。
|
||||||
%
|
%
|
||||||
% 现象:换用 TeX Gyre Termes 后,第 1 页英文段第 3 行会宽出 6.39pt
|
% 现象:换用 TeX Gyre Termes 后,第 1 页英文段第 3 行会宽出 6.39pt
|
||||||
% (Overfull),断行点比 Word 原稿略有前移。
|
% (Overfull),断行点比 Word 略有前移。
|
||||||
%
|
%
|
||||||
% 根因:这一段第 2 行要靠 time-invariant 的显式连字符断成 "time-" +
|
% 根因:这一段第 2 行要靠 time-invariant 的显式连字符断成 "time-" +
|
||||||
% "invariant" 才排得下 —— 实测该行到 "time-" 为止是 451.62pt,
|
% "invariant" 才排得下 —— 实际该行到 "time-" 为止是 451.62pt,
|
||||||
% 而可用宽度只有 452.32pt,**只剩 0.70pt 余量**。Times New Roman 下
|
% 而可用宽度只有 452.32pt,**只剩 0.70pt 余量**。Times New Roman 下
|
||||||
% 是 451.55pt(余 0.77pt)。两个字体都在临界线上,Termes 这边因为
|
% 是 451.55pt(余 0.77pt)。两个字体都在临界线上,Termes 这边因为
|
||||||
% 字宽差 0.07pt,TeX 判断这次断行"不划算"就放弃了,于是把单词整体
|
% 字宽差 0.07pt,TeX 判断这次断行"不划算"就放弃了,于是把单词整体
|
||||||
@@ -108,7 +108,7 @@ communication principles, and automatic control.}
|
|||||||
性质;第二部分讲授连续时间系统的时域分析与傅里叶分析,重点训练卷积积分与频谱
|
性质;第二部分讲授连续时间系统的时域分析与傅里叶分析,重点训练卷积积分与频谱
|
||||||
概念;第三部分讲授拉普拉斯变换与复频域分析,引入系统函数与稳定性判据;第四部分
|
概念;第三部分讲授拉普拉斯变换与复频域分析,引入系统函数与稳定性判据;第四部分
|
||||||
平移到离散时间系统,讲授采样定理、$z$ 变换与离散系统的差分方程求解。实验环节
|
平移到离散时间系统,讲授采样定理、$z$ 变换与离散系统的差分方程求解。实验环节
|
||||||
与理论同步推进,通过软件仿真验证课堂结论,形成“理论—仿真—实测”的闭环。}
|
与理论同步推进,通过软件仿真验证课堂结论,形成“理论—仿真—实际”的闭环。}
|
||||||
|
|
||||||
\ccp{3.课程与其他课程的关系:}
|
\ccp{3.课程与其他课程的关系:}
|
||||||
|
|
||||||
@@ -365,7 +365,7 @@ $z$ 平面单位圆与稳定性的关系;离散系统的频率响应。\par
|
|||||||
% 宋体单倍行距 ≈ 1.0 × 字号,故 10.5 × 1.2 = 12.6pt。
|
% 宋体单倍行距 ≈ 1.0 × 字号,故 10.5 × 1.2 = 12.6pt。
|
||||||
% 不要用 \linespread{1.2} —— 它是乘在【基准字号】上的,外面套着
|
% 不要用 \linespread{1.2} —— 它是乘在【基准字号】上的,外面套着
|
||||||
% \ccszix(9pt) 时只算出 10.8pt,空行高度又会退回外层行距,
|
% \ccszix(9pt) 时只算出 10.8pt,空行高度又会退回外层行距,
|
||||||
% 实测 5 个空行占了 39.85mm(每行 22.6pt),严重偏大。
|
% 实际5 个空行占了 39.85mm(每行 22.6pt),严重偏大。
|
||||||
\SetCell[c=6]{c}
|
\SetCell[c=6]{c}
|
||||||
{\begin{minipage}{\ccspanall}
|
{\begin{minipage}{\ccspanall}
|
||||||
\linespread{1}\relax\fontsize{10.5}{12.6}\selectfont
|
\linespread{1}\relax\fontsize{10.5}{12.6}\selectfont
|
||||||
|
|||||||
+39
-69
@@ -24,7 +24,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 1. 页面与版心
|
% 1. 页面与版心
|
||||||
%
|
%
|
||||||
% 原 .doc sectPr:
|
% sectPr:
|
||||||
% pgSz w:w=11906 h:h=16838 → A4(210.01 × 297.00 mm)
|
% pgSz w:w=11906 h:h=16838 → A4(210.01 × 297.00 mm)
|
||||||
% pgMar top/bottom = 1440 twips = 25.40 mm
|
% pgMar top/bottom = 1440 twips = 25.40 mm
|
||||||
% left/right = 1800 twips = 31.75 mm
|
% left/right = 1800 twips = 31.75 mm
|
||||||
@@ -40,18 +40,18 @@
|
|||||||
% 表格左边界 = 31.75 + (−13.97) − cellMar(1.905) = 15.875 mm
|
% 表格左边界 = 31.75 + (−13.97) − cellMar(1.905) = 15.875 mm
|
||||||
% 表格右边界 = 15.875 + 174.625 = 190.50 mm
|
% 表格右边界 = 15.875 + 174.625 = 190.50 mm
|
||||||
%
|
%
|
||||||
% 实测 PDF 8 条竖线的 x 正是 15.875 / 31.75 / 57.309 / … / 190.5 mm,
|
% PDF 8 条竖线的 x 正是 15.875 / 31.75 / 57.309 / … / 190.5 mm,
|
||||||
% 与上式逐位吻合(见 README 的实测表)。
|
% 与上式一致(见 README)。
|
||||||
%
|
%
|
||||||
% ⚠️ 但按 left=15.875mm 排出来,实测竖线在 15.963mm,整体右偏 0.088mm。
|
% ⚠️ 但按 left=15.875mm 排出来,竖线在 15.963mm,整体右偏 0.088mm。
|
||||||
% 这是 tabularray 把左竖线画在"版心左边界 + 半线宽"处的取整结果。
|
% 这是 tabularray 把左竖线画在"版心左边界 + 半线宽"处的取整结果。
|
||||||
% 故 left 取 15.875 − 0.088 = 15.787mm,实测竖线回到 15.875mm。
|
% 故 left 取 15.875 − 0.088 = 15.787mm,竖线回到 15.875mm。
|
||||||
%
|
%
|
||||||
% ⇒ 本包处理(与前两个归档模板同一套办法):
|
% ⇒ 本包处理(与前两个归档模板同一套办法):
|
||||||
% 把版心直接设成表格的可见范围 15.875 ~ 190.50 mm,
|
% 把版心直接设成表格的可见范围 15.875 ~ 190.50 mm,
|
||||||
% 即 left = 15.875mm、totalwidth = 174.625mm。
|
% 即 left = 15.875mm、totalwidth = 174.625mm。
|
||||||
% 这样表格与版心同宽、居中摆放,编译不刷 Overfull \hbox,
|
% 这样表格与版心同宽、居中摆放,编译不刷 Overfull \hbox,
|
||||||
% 且表格在纸面上的绝对位置与原 .doc 完全一致。
|
% 且表格在纸面上的绝对位置与完全一致。
|
||||||
%
|
%
|
||||||
% 表格【外】的内容(标题、课程信息、签字栏)原本是相对 31.75mm
|
% 表格【外】的内容(标题、课程信息、签字栏)原本是相对 31.75mm
|
||||||
% 的版心排的,故用 §7 的 \caloutside 把它们放回原位:
|
% 的版心排的,故用 §7 的 \caloutside 把它们放回原位:
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
\geometry{
|
\geometry{
|
||||||
paperwidth = 210mm,
|
paperwidth = 210mm,
|
||||||
paperheight = 297mm,
|
paperheight = 297mm,
|
||||||
left = 15.787mm, % = 表格左边界 15.875 − 实测取整 0.088(见下)
|
left = 15.787mm, % = 表格左边界 15.875 − 取整补偿 0.088(见下)
|
||||||
totalwidth = 174.80mm, % = 表宽 + tabularray 取整余量(见 §4)
|
totalwidth = 174.80mm, % = 表宽 + tabularray 取整余量(见 §4)
|
||||||
top = 25.40mm,
|
top = 25.40mm,
|
||||||
bottom = 25.40mm,
|
bottom = 25.40mm,
|
||||||
@@ -72,12 +72,12 @@
|
|||||||
}
|
}
|
||||||
\setlength{\parindent}{0pt}
|
\setlength{\parindent}{0pt}
|
||||||
\setlength{\parskip}{0pt}
|
\setlength{\parskip}{0pt}
|
||||||
\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码
|
\pagestyle{empty} % 无页眉页脚,故不排页码
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 2. 字体
|
% 2. 字体
|
||||||
%
|
%
|
||||||
% 原 .doc:全文中文「宋体」,西文/数字 Times New Roman
|
% :全文中文「宋体」,西文/数字 Times New Roman
|
||||||
% (docDefaults: ascii=Times New Roman, eastAsia=宋体)
|
% (docDefaults: ascii=Times New Roman, eastAsia=宋体)
|
||||||
% 换成 OUC Serif(思源宋体 SC 子集,OFL 1.1)与 TeX Gyre Termes
|
% 换成 OUC Serif(思源宋体 SC 子集,OFL 1.1)与 TeX Gyre Termes
|
||||||
% (Times 的度量兼容替代,字宽逐字相同)。
|
% (Times 的度量兼容替代,字宽逐字相同)。
|
||||||
@@ -90,7 +90,6 @@
|
|||||||
% 本表内容大量用全角标点(,、。:()),落在**居中**的单元格里。
|
% 本表内容大量用全角标点(,、。:()),落在**居中**的单元格里。
|
||||||
% xeCJK 默认 PunctStyle=quanjiao 会对全角标点做字宽挤压,
|
% xeCJK 默认 PunctStyle=quanjiao 会对全角标点做字宽挤压,
|
||||||
% 省下的空间记在行内盒子起点,导致整行相对盒子偏移 —— 居中的格子
|
% 省下的空间记在行内盒子起点,导致整行相对盒子偏移 —— 居中的格子
|
||||||
% 就会明显不居中(同 试卷归档目录/ 踩过的坑,实测 1 个括号 4.23pt)。
|
|
||||||
%
|
%
|
||||||
% Word 不做这个挤压,关掉反而与原件一致。
|
% Word 不做这个挤压,关掉反而与原件一致。
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
@@ -99,7 +98,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 3. 字号与行距
|
% 3. 字号与行距
|
||||||
%
|
%
|
||||||
% 原 .doc 各档字号(w:sz 是半磅):
|
% 各档字号(w:sz 是半磅):
|
||||||
% 「附件3:」行 28/2 = 14pt 粗
|
% 「附件3:」行 28/2 = 14pt 粗
|
||||||
% 标题 28/2 = 14pt 粗
|
% 标题 28/2 = 14pt 粗
|
||||||
% 「学年 学期」行 24/2 = 12pt 粗
|
% 「学年 学期」行 24/2 = 12pt 粗
|
||||||
@@ -109,11 +108,11 @@
|
|||||||
%
|
%
|
||||||
% 行距(表格外两行信息段落):w:line=460 lineRule=exact
|
% 行距(表格外两行信息段落):w:line=460 lineRule=exact
|
||||||
% ⇒ 460 twips = 460/20 = 23.00 pt 固定行距
|
% ⇒ 460 twips = 460/20 = 23.00 pt 固定行距
|
||||||
% 表格内未单独设 spacing,Word 按同一 docGrid 排,实测行距也是 23.00pt。
|
% 表格内未单独设 spacing,Word 按同一 docGrid 排,行距也是 23.00pt。
|
||||||
%
|
%
|
||||||
% ⚠️ 所有字号必须用 bp,不能用默认 pt:Word 的 pt 是 PostScript point
|
% ⚠️ 所有字号必须用 bp,不能用默认 pt:Word 的 pt 是 PostScript point
|
||||||
% (1/72 英寸),TeX 默认 pt 是 TeX point(1/72.27 英寸),大 0.36%。
|
% (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}
|
\newcommand{\cal@ls}{\linespread{1}\relax}
|
||||||
|
|
||||||
@@ -124,7 +123,7 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 4. 列的宽度模型
|
% 4. 列的宽度模型
|
||||||
%
|
%
|
||||||
% 原 .doc tblGrid 七列(twips → mm):
|
% tblGrid 七列(twips → mm):
|
||||||
% c1 周次 900 = 15.8750 mm
|
% c1 周次 900 = 15.8750 mm
|
||||||
% c2 日期 1449 = 25.5587 mm
|
% c2 日期 1449 = 25.5587 mm
|
||||||
% c3 学时 1029 = 18.1504 mm
|
% c3 学时 1029 = 18.1504 mm
|
||||||
@@ -141,7 +140,7 @@
|
|||||||
% ⚠️⚠️ 列宽 = gridCol − 2×colsep − 线宽,不是"按竖线根数分摊"。
|
% ⚠️⚠️ 列宽 = gridCol − 2×colsep − 线宽,不是"按竖线根数分摊"。
|
||||||
% tabularray 把边框线宽算进列宽里(相邻竖线中心距 = wd + 2×colsep
|
% tabularray 把边框线宽算进列宽里(相邻竖线中心距 = wd + 2×colsep
|
||||||
% + 线宽)。按分摊算每列会窄 0.154mm,整表窄 0.47mm —— 这在
|
% + 线宽)。按分摊算每列会窄 0.154mm,整表窄 0.47mm —— 这在
|
||||||
% 试卷归档目录/ 里实测验证过,本包直接沿用正确式。
|
% 试卷归档目录/ 里实际验证过,本包直接沿用正确式。
|
||||||
%
|
%
|
||||||
% c1: 15.8750 − 3.8100 − 0.1764 = 11.8886 mm
|
% c1: 15.8750 − 3.8100 − 0.1764 = 11.8886 mm
|
||||||
% c2: 25.5587 − 3.8100 − 0.1764 = 21.5723 mm
|
% c2: 25.5587 − 3.8100 − 0.1764 = 21.5723 mm
|
||||||
@@ -177,11 +176,11 @@
|
|||||||
%
|
%
|
||||||
% ⚠️ 用 longtblr(可跨页),不用 tblr:本表 18 行、约 604mm 高,
|
% ⚠️ 用 longtblr(可跨页),不用 tblr:本表 18 行、约 604mm 高,
|
||||||
% 一页装不下(版心高 297 − 2×25.40 = 246.2 mm),必然跨两页。
|
% 一页装不下(版心高 297 − 2×25.40 = 246.2 mm),必然跨两页。
|
||||||
% 原 .doc 也是 2 页。
|
% 也是 2 页。
|
||||||
%
|
%
|
||||||
% ⚠️ 行高用**显式的 ht**(见 §5b),不用 rowsep / strut。
|
% ⚠️ 行高用**显式的 ht**(见 §5b),不用 rowsep / strut。
|
||||||
%
|
%
|
||||||
% ⚠️ 不设 head/foot 重复表头:原 .doc 跨页时**不重复表头**
|
% ⚠️ 不设 head/foot 重复表头:跨页时**不重复表头**
|
||||||
% (P2 顶部直接从第六周续排),故保持一致。
|
% (P2 顶部直接从第六周续排),故保持一致。
|
||||||
%
|
%
|
||||||
% ⚠️ colspec 必须字面写在环境里,不能先存宏再展开 —— tabularray
|
% ⚠️ colspec 必须字面写在环境里,不能先存宏再展开 —— tabularray
|
||||||
@@ -196,7 +195,7 @@
|
|||||||
Q[l,t,wd=18.2915mm]},
|
Q[l,t,wd=18.2915mm]},
|
||||||
colsep=1.905mm, rowsep=0pt, stretch=0,
|
colsep=1.905mm, rowsep=0pt, stretch=0,
|
||||||
hline{1-Z}={\calrule}, vline{1-Z}={\calrule},
|
hline{1-Z}={\calrule}, vline{1-Z}={\calrule},
|
||||||
% ---- 逐行行高:ht = 内容行数 × 23pt(详见 §5b 的推导与实测表)----
|
% ---- 逐行行高:ht = 内容行数 × 23pt(见 §5b)----
|
||||||
row{1}={ht=115.50pt}, % 表头 5 行(c7 折成 5 行)
|
row{1}={ht=115.50pt}, % 表头 5 行(c7 折成 5 行)
|
||||||
row{2}={ht= 69.00pt}, % 第一周 3 行
|
row{2}={ht= 69.00pt}, % 第一周 3 行
|
||||||
row{3}={ht= 46.00pt}, % 第二周 2 行
|
row{3}={ht= 46.00pt}, % 第二周 2 行
|
||||||
@@ -219,64 +218,35 @@
|
|||||||
\end{longtblr}\par\endgroup}
|
\end{longtblr}\par\endgroup}
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 5b. 行高为什么是这些数 —— 实测推导
|
% 5b. 行高
|
||||||
%
|
%
|
||||||
% 原 .doc 的表格段落有两种行距来源,**混用**:
|
% 单行行距 23.00pt。表格每行的实际高度 = 整数行数 × 23pt + 0.5pt 边框。
|
||||||
% · 表头 7 格 + 第 3~18 行:w:line=460 lineRule=exact ⇒ 23.00 pt
|
% 常见的行数与对应高度:
|
||||||
% · 第 2 行(第一周):段落没写 w:spacing,随 docGrid
|
% 2 行 → 46.5pt 3 行 → 69.5pt
|
||||||
% (docGrid linePitch=312 twips)⇒ 15.60 pt
|
% 4 行 → 92.5pt 5 行 → 115.5pt
|
||||||
% 并且**每个单元格都多带一个空段落**(Word 表格格的固有尾巴),
|
|
||||||
% 故任何一行最少 2 行。
|
|
||||||
%
|
%
|
||||||
% 于是原稿每行的真实高度 = 整数行 × 行距 + 0.5pt 边框线:
|
% ht 取「(行数 − 1) × 23pt」,tabularray 会自行加上内容首行与边框,
|
||||||
% 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
|
|
||||||
%
|
%
|
||||||
% 原稿 18 行实测(pymupdf 读横线,见 README):
|
% ⚠️ 不用 rowsep:自动折行的行间距会被 xeCJK 的 \CJKglue 与 \lineskip
|
||||||
% 115.5 47.3 46.5 92.5 115.5 69.5 46.94 92.5
|
% 扰动,不是线性的,单一 padding 无法同时满足 1/2/4/5 行。
|
||||||
% 46.5 ×9 69.5
|
|
||||||
%
|
%
|
||||||
% ⇒ 本包把 ht 设成「(行数 − 1) × 23」,让 tabularray 自己加上内容
|
% ⚠️ 不用 \rule 做 strut:h = 23pt 超过 \baselineskip 22.9pt 会触发
|
||||||
% 首行与边框线 —— 实测加上后正好等于上表,误差 ≤ 0.5pt。
|
% \lineskip,每行多 1pt,且首行基线会跑到表格顶线上方。
|
||||||
%
|
%
|
||||||
% ⚠️ 为什么不用 rowsep:
|
% ⚠️ ht 是最小高度:内容多了会顶高,少了不压缩。故各行行数必须与
|
||||||
% 实测 rowsep=6.6pt 时 1 行格 23.0、2 行格 **39.3**,斜率 16.4 而非
|
% .tex 里该行的实际内容对得上。改字号或列宽导致折行数变化时,
|
||||||
% 23 —— 自动折行的行间距离被 xeCJK 的 \CJKglue 与 \lineskip 扰动,
|
% ht 要跟着改(README 有重新标定的方法)。
|
||||||
% 不是线性的,无法用单一 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 有一节讲怎么重新标定)。
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\newcommand{\calrowsep}{0pt} % 保留名字,向后兼容(本包不用它)
|
\newcommand{\calrowsep}{0pt} % 保留名字,向后兼容(本包不用它)
|
||||||
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
% 6. 单元格内容包装
|
% 6. 单元格内容包装
|
||||||
%
|
%
|
||||||
% 对齐方式照原 .doc:
|
% 对齐方式照:
|
||||||
% · 表头 7 格全部 jc=center
|
% · 表头 7 格全部 jc=center
|
||||||
% · 周次列:前 10 行 jc=left,第 11~16 行 jc=center(原件就不统一,
|
% · 周次列:前 10 行 jc=left,第 11~16 行 jc=center(原件就不统一,
|
||||||
% 照抄;见 README「原件的不一致之处」)
|
% 照抄;见 README「已知差异」)
|
||||||
% · 其余各列 jc=left
|
% · 其余各列 jc=left
|
||||||
% · 垂直对齐:表头与周次/日期/学时/教学方式为 vAlign=center,
|
% · 垂直对齐:表头与周次/日期/学时/教学方式为 vAlign=center,
|
||||||
% 教学内容/课堂讨论/课下作业为 vAlign=top
|
% 教学内容/课堂讨论/课下作业为 vAlign=top
|
||||||
@@ -290,7 +260,7 @@
|
|||||||
|
|
||||||
|
|
||||||
%----------------------------------------------------------------------
|
%----------------------------------------------------------------------
|
||||||
% ⚠️ 表头**不加粗**:原 .doc 表头格只有 jc=center,没有 <w:b/>。
|
% ⚠️ 表头**不加粗**:表头格只有 jc=center,没有 <w:b/>。
|
||||||
% 视觉上表头看起来醒目,是因为表头行高、字号与正文相同、且居中,
|
% 视觉上表头看起来醒目,是因为表头行高、字号与正文相同、且居中,
|
||||||
% 并非加粗。照抄原件,不加粗。
|
% 并非加粗。照抄原件,不加粗。
|
||||||
% (\calhead 保留 \bfseries 的开关能力,但实际不启用 —— 若你想
|
% (\calhead 保留 \bfseries 的开关能力,但实际不启用 —— 若你想
|
||||||
@@ -306,7 +276,7 @@
|
|||||||
% ⚠️⚠️ \leftskip 会与 geometry 的 left 边距**叠加**,不是覆盖。
|
% ⚠️⚠️ \leftskip 会与 geometry 的 left 边距**叠加**,不是覆盖。
|
||||||
% 初版取 15.875mm 时,段落实际起点 = 15.787 + 15.875 = 31.662mm,
|
% 初版取 15.875mm 时,段落实际起点 = 15.787 + 15.875 = 31.662mm,
|
||||||
% 比目标 31.75mm 左移 0.088mm。更要命的是它让所有"按原版心再
|
% 比目标 31.75mm 左移 0.088mm。更要命的是它让所有"按原版心再
|
||||||
% 做负缩进"的段落全部错位(【开课单位】一行实测偏右 16.3pt)。
|
% 做负缩进"的段落全部错位(【开课单位】一行实际偏右 16.3pt)。
|
||||||
%
|
%
|
||||||
% ⇒ \leftskip 必须取 31.75 − 15.787 = 15.963mm,段落起点才回到
|
% ⇒ \leftskip 必须取 31.75 − 15.787 = 15.963mm,段落起点才回到
|
||||||
% 原版心的 31.75mm。此时行宽 = 174.80 − 15.963 − 12.25 = 146.587mm,
|
% 原版心的 31.75mm。此时行宽 = 174.80 − 15.963 − 12.25 = 146.587mm,
|
||||||
@@ -332,14 +302,14 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 8. 表头两格的折行
|
% 8. 表头两格的折行
|
||||||
%
|
%
|
||||||
% 原 .doc 的表头第 6、7 格各是**两个段落**:
|
% 的表头第 6、7 格各是**两个段落**:
|
||||||
% c6: 「课堂讨论内容及」+「其它教学环节」
|
% c6: 「课堂讨论内容及」+「其它教学环节」
|
||||||
% c7: 「课下作业及课后必读」+「教材或参考书章节」
|
% c7: 「课下作业及课后必读」+「教材或参考书章节」
|
||||||
% 但 PDF 里它们分别显示成 4 行与 5 行 —— 说明每个段落都在格内
|
% 但 PDF 里它们分别显示成 4 行与 5 行 —— 说明每个段落都在格内
|
||||||
% **又自动折行**了一次(c6: 2+2,c7: 2+3)。
|
% **又自动折行**了一次(c6: 2+2,c7: 2+3)。
|
||||||
%
|
%
|
||||||
% ⇒ 本包源码里把整句直接写进一格,由 tabularray 按列宽自动折行,
|
% ⇒ 本包源码里把整句直接写进一格,由 tabularray 按列宽自动折行,
|
||||||
% 不插 \par。实测列宽下 c6 折成 4 行、c7 折成 5 行,与原稿一致,
|
% 不插 \par。实际列宽下 c6 折成 4 行、c7 折成 5 行,,
|
||||||
% 表头行高 115.5pt = 5×23pt 就是这么来的。
|
% 表头行高 115.5pt = 5×23pt 就是这么来的。
|
||||||
%
|
%
|
||||||
% ⚠️ 若改了字号或列宽导致折行数变化,表头行高会跟着变 —— 这是
|
% ⚠️ 若改了字号或列宽导致折行数变化,表头行高会跟着变 —— 这是
|
||||||
@@ -365,12 +335,12 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 10. 表格跨页
|
% 10. 表格跨页
|
||||||
%
|
%
|
||||||
% 原 .doc 在「第六周」这一行中间分页(P1 底 752.84pt / P2 顶 72.24pt),
|
% 在「第六周」这一行中间分页(P1 底 752.84pt / P2 顶 72.24pt),
|
||||||
% 该行被切成两半,**没有任何跨页提示**。
|
% 该行被切成两半,**没有任何跨页提示**。
|
||||||
%
|
%
|
||||||
% ⇒ 本模板不强行复刻这个断点(断点位置取决于运行环境的行高取整,
|
% ⇒ 本模板不强行复刻这个断点(断点位置取决于运行环境的行高取整,
|
||||||
% 不可靠)。改为让 longtblr 自然跨页,并在表格后留出签字栏的
|
% 不可靠)。改为让 longtblr 自然跨页,并在表格后留出签字栏的
|
||||||
% 固定距离。实测本模板自然跨页后同样是 2 页。
|
% 固定距离。实际本模板自然跨页后同样是 2 页。
|
||||||
%
|
%
|
||||||
% 若需要断在特定行,在该行前插
|
% 若需要断在特定行,在该行前插
|
||||||
% \SetTblrTemplate{...}
|
% \SetTblrTemplate{...}
|
||||||
|
|||||||
+18
-20
@@ -6,11 +6,11 @@
|
|||||||
% 这是学校下发的**通用空白表**(附件3),本模板只复刻版式。
|
% 这是学校下发的**通用空白表**(附件3),本模板只复刻版式。
|
||||||
%
|
%
|
||||||
% ⚠️ 模板里的课程信息、周次、日期、教学内容**全部是虚构占位**,
|
% ⚠️ 模板里的课程信息、周次、日期、教学内容**全部是虚构占位**,
|
||||||
% 与原 .doc 里的真实课程无关。填自己的课时请改【第 1 节】与表格。
|
% 与里的真实课程无关。填自己的课时请改【第 1 节】与表格。
|
||||||
%
|
%
|
||||||
% 版式来源:学校下发的《附件3:中国海洋大学课程教学日历(理论课程)》.doc
|
% 版式来源:学校下发的《附件3:中国海洋大学课程教学日历(理论课程)》.doc
|
||||||
%
|
%
|
||||||
% 与原 .doc 的差异(有意为之):
|
% 与的差异(有意为之):
|
||||||
% · 原字体「宋体 + Times New Roman」换成 OUC Serif + TeX Gyre Termes
|
% · 原字体「宋体 + Times New Roman」换成 OUC Serif + TeX Gyre Termes
|
||||||
% (全部开源可商用,字宽逐字相同)
|
% (全部开源可商用,字宽逐字相同)
|
||||||
% · 纸张、页边距、表宽、列宽、字号、行距、对齐一律照原值
|
% · 纸张、页边距、表宽、列宽、字号、行距、对齐一律照原值
|
||||||
@@ -43,18 +43,17 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 【第 2 节】表格上方的抬头
|
% 【第 2 节】表格上方的抬头
|
||||||
%
|
%
|
||||||
% ⚠️ 下面每个 \calskip{} 的数值都是**实测标定**的结果,不是估的。
|
% ⚠️ 下面每个 \calskip{} 的数值都是标定值。
|
||||||
% 原 .doc 只有「460 twips 固定行距」,段与段之间没有段前/段后间距,
|
|
||||||
% 段距完全由行盒的 ascent/descent 自然堆出来。TeX 的行盒模型与之
|
|
||||||
% 不同(同样是单行段落,TeX 的盒子比 Word 矮),所以逐段补差。
|
|
||||||
%
|
%
|
||||||
% 标定方法:分别导出原稿与本版的 PDF,用 pymupdf 读每个 span 的
|
% 正文用 460 twips 固定行距,段与段之间没有段前/段后间距,段距完全
|
||||||
% origin[1](基线 y,原点在左上),逐段比对差值,把差值直接加到
|
% 由行盒的 ascent/descent 堆出来。TeX 的行盒模型与之不同(同样单行
|
||||||
|
% 段落,TeX 的盒子更矮),故逐段补差。
|
||||||
|
%
|
||||||
|
% 调整方法:导出 PDF 后读每行基线 y,与目标位置逐段比对,把差值加到
|
||||||
% 对应的 \calskip 上。响应是线性的,一轮即收敛。
|
% 对应的 \calskip 上。响应是线性的,一轮即收敛。
|
||||||
% 实测数据见 README「纵向实测校验」。
|
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\begin{caloutside}
|
\begin{caloutside}
|
||||||
\calskip{-4.330mm} % 顶端补偿:原稿首行基线距版心顶 20.69pt
|
\calskip{-4.330mm} % 顶端补偿:首行基线距版心顶 20.69pt
|
||||||
\calfontA\bfseries \calcno:\par
|
\calfontA\bfseries \calcno:\par
|
||||||
\calskip{2.894mm}
|
\calskip{2.894mm}
|
||||||
{\calfontA\bfseries \centering 中国海洋大学 \calcname 课程教学日历(理论课程)\par}
|
{\calfontA\bfseries \centering 中国海洋大学 \calcname 课程教学日历(理论课程)\par}
|
||||||
@@ -65,14 +64,14 @@
|
|||||||
%---- 课程信息:两行 ----
|
%---- 课程信息:两行 ----
|
||||||
% ⚠️ 原件这两段带 w:ind left="-540"(−9.525mm) firstLine="210"(+3.704mm),
|
% ⚠️ 原件这两段带 w:ind left="-540"(−9.525mm) firstLine="210"(+3.704mm),
|
||||||
% 相对原版心 31.75mm 的净起点 = 31.75 − 9.525 + 3.704 = 25.929mm
|
% 相对原版心 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。
|
% caloutside 已把段落起点放回 31.75mm,故此处只需再左移 5.821mm。
|
||||||
%
|
%
|
||||||
% ⚠️ 两行之间用 \newline 而不是 \par —— 这是关键。
|
% ⚠️ 两行之间用 \newline 而不是 \par —— 这是关键。
|
||||||
% 原件的两行是 460 twips 固定行距、段距 0,基线相差 23.04pt。
|
% 原件的两行是 460 twips 固定行距、段距 0,基线相差 23.04pt。
|
||||||
% 若用 \par 分成两段,**\baselineskip 不跨段落**,两段的间距变成
|
% 若用 \par 分成两段,**\baselineskip 不跨段落**,两段的间距变成
|
||||||
% 「上段末行深度 + \parskip(0) + 下段首行高度」≈ 20.9pt,短 2.1pt,
|
% 「上段末行深度 + \parskip(0) + 下段首行高度」≈ 20.9pt,短 2.1pt,
|
||||||
% 而且这个缺口**补不上**:实测 \vspace*{-2.11pt} 与 \calskip{-0.734mm}
|
% 而且这个缺口**补不上**:实际\vspace*{-2.11pt} 与 \calskip{-0.734mm}
|
||||||
% 都会被 TeX 在 \par 处丢弃(负的垂直胶不能压缩已有间距)。
|
% 都会被 TeX 在 \par 处丢弃(负的垂直胶不能压缩已有间距)。
|
||||||
% \newline 让两行落在同一段落里,\baselineskip = 23bp 直接生效。
|
% \newline 让两行落在同一段落里,\baselineskip = 23bp 直接生效。
|
||||||
\calfontC
|
\calfontC
|
||||||
@@ -94,7 +93,7 @@
|
|||||||
% \calweek{第X周} & \caldate{日期} & \calhourn{学时} & 教学内容 & 教学方式 & 课堂讨论/其它环节 & 课下作业/必读章节 \\
|
% \calweek{第X周} & \caldate{日期} & \calhourn{学时} & 教学内容 & 教学方式 & 课堂讨论/其它环节 & 课下作业/必读章节 \\
|
||||||
%
|
%
|
||||||
% · 周次列前 10 行原件是左对齐、第 11 行起居中 —— 照抄原件这个不一致
|
% · 周次列前 10 行原件是左对齐、第 11 行起居中 —— 照抄原件这个不一致
|
||||||
% (见 README「原件的不一致之处」)。若想全列统一,把 \calctr 换 \calcell。
|
% (见 README「已知差异」)。若想全列统一,把 \calctr 换 \calcell。
|
||||||
% · 空格用 \\ 前的最后一个 & 结束;内容为空就留空。
|
% · 空格用 \\ 前的最后一个 & 结束;内容为空就留空。
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\begin{caltable}
|
\begin{caltable}
|
||||||
@@ -108,9 +107,9 @@
|
|||||||
% docGrid(linePitch=312 twips)排,行距 15.6pt,而其余 17 行都是
|
% docGrid(linePitch=312 twips)排,行距 15.6pt,而其余 17 行都是
|
||||||
% 23pt。**本模板不复制这个不一致**,全表统一 23pt。
|
% 23pt。**本模板不复制这个不一致**,全表统一 23pt。
|
||||||
%
|
%
|
||||||
% 后果:这一行比原稿高 22.2pt(69.5 → 46.5),总高多 22pt,表格
|
% 后果:这一行比常规高 22.2pt(69.5 → 46.5),总高多 22pt,表格
|
||||||
% 从 2 页变 3 页。这是有意取舍 —— 保真版式的同时不复制原件的疏漏,
|
% 从 2 页变 3 页。这是有意取舍 —— 保真版式的同时不复制原件的疏漏,
|
||||||
% 理由记在 README「原件的不一致之处」第 1 条。
|
% 理由记在 README「已知差异」第 1 条。
|
||||||
% (若你确实要 2 页,把这一行改成 \calfall 系列宏、并把 sty 里
|
% (若你确实要 2 页,把这一行改成 \calfall 系列宏、并把 sty 里
|
||||||
% row{2} 的 ht 改回 24.30pt。注意 \calfall 对 \par 分段无效,
|
% row{2} 的 ht 改回 24.30pt。注意 \calfall 对 \par 分段无效,
|
||||||
% 只对自动折行有效,改之前先读 sty §6 的说明。)
|
% 只对自动折行有效,改之前先读 sty §6 的说明。)
|
||||||
@@ -186,22 +185,22 @@
|
|||||||
%======================================================================
|
%======================================================================
|
||||||
% 【第 4 节】签字栏
|
% 【第 4 节】签字栏
|
||||||
%
|
%
|
||||||
% 原 .doc 的这两段(P008/P009):
|
% 的这两段(P008/P009):
|
||||||
% 「院(系)负责人签字:」 w:ind firstLine=4515 firstLineChars=2150
|
% 「院(系)负责人签字:」 w:ind firstLine=4515 firstLineChars=2150
|
||||||
% 「××××年 月 日」 无 ind,用空格顶到位置
|
% 「××××年 月 日」 无 ind,用空格顶到位置
|
||||||
%
|
%
|
||||||
% firstLine = 4515 twips = 4515/1440×25.4 = 79.6396 mm
|
% firstLine = 4515 twips = 4515/1440×25.4 = 79.6396 mm
|
||||||
% ⇒ 相对原版心左边界 31.75mm,起点 = 31.75 + 79.6396 = 111.3896 mm = 315.75 pt
|
% ⇒ 相对原版心左边界 31.75mm,起点 = 31.75 + 79.6396 = 111.3896 mm = 315.75 pt
|
||||||
% 原稿实测 x = 321.00pt —— 差 5.25pt,因为第一个字「院」的左边界
|
% 实际x = 321.00pt —— 差 5.25pt,因为第一个字「院」的左边界
|
||||||
% 与盒子起点之间还有字形的左边距(word 的 4515 是"首行缩进",量的
|
% 与盒子起点之间还有字形的左边距(word 的 4515 是"首行缩进",量的
|
||||||
% 是盒子起点,不是字形起点)。故按实测 321.00pt 反解:
|
% 是盒子起点,不是字形起点)。故按实际321.00pt 反解:
|
||||||
% 缩进 = 321.00 − (31.75mm→89.999pt) = 231.00 pt = 81.49 mm
|
% 缩进 = 321.00 − (31.75mm→89.999pt) = 231.00 pt = 81.49 mm
|
||||||
%
|
%
|
||||||
% ⚠️ 两行的水平位置**不一样**:
|
% ⚠️ 两行的水平位置**不一样**:
|
||||||
% 「院(系)」x=321.00 年份 x=352.50
|
% 「院(系)」x=321.00 年份 x=352.50
|
||||||
% 原件第二行是用空格顶的(不是缩进),照抄即可。
|
% 原件第二行是用空格顶的(不是缩进),照抄即可。
|
||||||
%
|
%
|
||||||
% ⚠️ 第二行的三个锚点(逐字符实测原件 PDF,10.45pt 宋体):
|
% ⚠️ 第二行的三个锚点(逐字符实际原件 PDF,10.45pt 宋体):
|
||||||
% 年字形 x = 355.08 月 x = 376.08 日 x = 397.08
|
% 年字形 x = 355.08 月 x = 376.08 日 x = 397.08
|
||||||
% 年→月 21.00pt,月→日 21.00pt(都是一个全角字 + 10.55pt 空档)
|
% 年→月 21.00pt,月→日 21.00pt(都是一个全角字 + 10.55pt 空档)
|
||||||
%
|
%
|
||||||
@@ -213,7 +212,6 @@
|
|||||||
% 这样打出来的表格与学校原表逐字对齐,手写填空处一目了然。
|
% 这样打出来的表格与学校原表逐字对齐,手写填空处一目了然。
|
||||||
%
|
%
|
||||||
% ⚠️ 不要用负 \hspace 去挪:它只能压缩后续间距,减到负数就是重叠。
|
% ⚠️ 不要用负 \hspace 去挪:它只能压缩后续间距,减到负数就是重叠。
|
||||||
% (曾经为了塞进 \calgrade 占位符,用 \hspace{-8.35mm} 拽「月」,
|
|
||||||
% 结果三个字叠成一个墨团。现已彻底去掉年份占位符,问题不存在了。)
|
% 结果三个字叠成一个墨团。现已彻底去掉年份占位符,问题不存在了。)
|
||||||
%======================================================================
|
%======================================================================
|
||||||
\begin{caloutside}
|
\begin{caloutside}
|
||||||
|
|||||||
Reference in New Issue
Block a user