diff --git a/README.md b/README.md index c193b2b..19a72db 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ | [`试卷归档目录/`](试卷归档目录/) | 信息科学与工程学部**试卷归档目录**(理论课,12 项核对清单) | `试卷归档目录.tex` | | [`年度考核登记表/`](年度考核登记表/) | 教职工**年度考核登记表** | `年度考核登记表.tex` | | [`劳务发放说明表/`](劳务发放说明表/) | **劳务发放说明表** | `劳务发放说明表.tex` | -| [`课程执行大纲/`](课程执行大纲/) | 本科**课程教学执行大纲、教学日历** | `课程执行大纲.tex` | +| [`课程执行大纲/`](课程执行大纲/) | 本科**课程教学执行大纲** | `课程执行大纲.tex` | +| [`课程教学日历/`](课程教学日历/) | 学校通用版**课程教学日历(理论课程)**(附件3,16 周日历表) | `课程教学日历.tex` | | [`幻灯片/`](幻灯片/) | 演示文稿(**beamer** 主题,海大配色) | `slides.tex` | | [`科技报告/`](科技报告/) | **科技报告**、实验讲义、说明文档 | `report.tex` | @@ -25,11 +26,11 @@ xelatex slides.tex xelatex slides.tex # 跑两遍,第二遍才能取到正确的目录、交叉引用与总页数 ``` -目录名含中文不影响编译(已实测 7 个模板目录在中文目录下零报错编译通过)。 +目录名含中文不影响编译(已实测 9 个模板目录在中文目录下零报错编译通过)。 ## 说明 -- **字体单一来源**:全库字体集中在根目录 [`fonts/`](fonts/),由 [`fonts.tex`](fonts.tex) 统一加载。八个模板通过 `\input{../fonts.tex}` 取字体,**不自带字体、不依赖系统字体**——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。 +- **字体单一来源**:全库字体集中在根目录 [`fonts/`](fonts/),由 [`fonts.tex`](fonts.tex) 统一加载。九个模板通过 `\input{../fonts.tex}` 取字体,**不自带字体、不依赖系统字体**——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。 - **全部开源可商用**:无方正、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、无微软雅黑。用的是思源宋体/黑体、霞鹜文楷、朱雀仿宋、TeX Gyre Termes、鸿蒙 HarmonyOS Sans(各字体授权见 [`fonts/LICENSE`](fonts/LICENSE),来源与字符集见 [`fonts/README.md`](fonts/README.md))。 - **每个子目录自包含**:样式文件(`.sty` / `.cls`)、图片都在各目录内,编译时不需要额外的宏包搜索路径;只有字体是共享的上层目录。 - **各目录的 `README.md`** 写明该模板的用法、可改参数、版式数据来源与书写注意事项,改之前先看。 diff --git a/fonts.tex b/fonts.tex index ff3ebd1..1a5efda 100644 --- a/fonts.tex +++ b/fonts.tex @@ -1,7 +1,7 @@ %====================================================================== % oucfonts.tex —— 中国海洋大学模板库的公共字体入口 % -% 本文件是仓库内**唯一**允许声明字体的地方。八个模板全部通过 +% 本文件是仓库内**唯一**允许声明字体的地方。九个模板全部通过 % \input{../fonts.tex} % 取字体,不再各自写 \setCJKmainfont / \setmainfont。 % diff --git a/课程教学日历/README.md b/课程教学日历/README.md new file mode 100644 index 0000000..7a60789 --- /dev/null +++ b/课程教学日历/README.md @@ -0,0 +1,355 @@ +# 课程教学日历 —— 中国海洋大学课程教学日历(理论课程) + +学校下发的**通用空白表**「附件3:中国海洋大学课程教学日历(理论课程)」的 +XeLaTeX 模板。原文件是学校统一的 `.doc` 表(7 列 × 18 行的 16 周教学日历 + +课程考核说明 + 签字栏),本目录把它做成可直接编译的 LaTeX 版。 + +> **本模板不含任何真实课程数据。** 课程名、开课号、教师、学分、学时、 +> 人数、学期、周次日期、章节名、作业编号**全部是虚构占位符**(`××××`、 +> `000000000000`、`×`)。原 `.doc` 是一份**填过的实例**,本模板只复刻 +> 它的版式,一个字段都没带过来 —— 见下面「真实数据零泄漏」。 + +> 与 [`试卷归档封面/`](../试卷归档封面/)、[`试卷归档目录/`](../试卷归档目录/) +> 的关系:三件同属教务处下发的表格套件(附件1 封面、附件2 归档目录、 +> 附件3 教学日历),版式上都照原 `.doc` 1:1 还原,做法同一套 +> (版心设成表格可见范围 + `caloutside` 环境放回表格外的段落),互不依赖。 + +## 文件 + +| 文件 | 说明 | +|---|---| +| `oucal.sty` | 版式包。A4、表宽 174.625mm、7 列、18 行显式行高,每项尺寸都附换算过程 | +| `课程教学日历.tex` | 正文入口(课程信息与 16 周内容写在这里) | +| `课程教学日历.pdf` | 成品样张 | + +## 编译 + +```bash +xelatex 课程教学日历.tex +``` + +必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。 +自包含,不依赖任何图片。实测 **3 页**、零警告(无 Overfull / Underfull / 缺字)。 + +> ⚠️ 页数与原件不同:原件 2 页,本模板 3 页。原因见「原件的不一致之处」第 1 条 —— +> 原件第一周那一行的行距缺省(15.6pt),本模板统一按 23pt 排,多出 22pt, +> 正好把表格顶到第 3 页。这是**有意取舍**,不是 bug。 + +## 用法 + +### 课程信息 + +改 `.tex` 开头的宏: + +```latex +\newcommand{\calcno}{附件3} % 附件编号 +\newcommand{\calcname}{××××} % 课程名称 +\newcommand{\calyear}{20××} % 学年 +\newcommand{\calseason}{×} % 季学期(春/秋) +\newcommand{\caldept}{××××学院(系)} % 开课单位 +\newcommand{\calcodenum}{000000000000} % 开课号(12 位) +\newcommand{\calteacher}{×××} % 任课教师 +\newcommand{\calcredit}{×.×} % 课程学分 +\newcommand{\calhour}{00} % 总学时 +\newcommand{\calstudent}{000} % 学生人数 +\newcommand{\calassess}{××考试} % 考核方式 +\newcommand{\calgrade}{20××} % 签字栏年份 +``` + +### 教学日历表 + +每行格式: + +```latex +\calcell{第一周} & \calcell{×月×日至×月×日} & \calcell{×} & +\calcell{课程基本情况介绍\par 引例\par 补充知识} & \calcell{多媒体讲课} & & \\ +``` + +可用的单元格宏: + +| 宏 | 用途 | 说明 | +|---|---|---| +| `\calcell{...}` | 左对齐格 | 正文常用 | +| `\calctr{...}` | 居中格 | 表头、第 11~16 周的周次列 | +| `\calhead{...}` | 表头(**不加粗**,见下) | 原件表头无 `w:b` | + +## ⚠️ 改表之前必读:行高是写死的 + +`oucal.sty` §5 里 18 个 `row{n}={ht=...}` 是**按每行的实际行数**算出来的: + +``` +ht = (内容行数 − 1) × 23pt +``` + +原件所有表格段落都是 `w:line=460 exact`(23pt 固定行距),且每个单元格 +多带一个空段落,所以**最少 2 行**。于是: + +| 内容行数 | ht | 原件实测行高 | +|---|---|---| +| 2 行 | 46.00pt | 46.5pt | +| 3 行 | 69.00pt | 69.5pt | +| 4 行 | 92.00pt | 92.5pt | +| 5 行(表头) | 115.50pt | 115.5pt | + +差的那 0.5pt 是边框线宽,由 tabularray 自己加。 + +**ht 是最小高度**(内容多了会顶高、少了不会压扁)。所以: + +- **加长**某周的教学内容 → 折行数变多 → 该行会被内容顶高,`ht` 不用改,但整表会变长 +- **缩短**某周的教学内容 → 折行数变少 → `ht` 就会留下空白,必须手动改小 +- **改字号或列宽** → 全部折行数都可能变 → 18 个 `ht` 都要重新标定 + +重新标定的办法(不靠猜):编译后导出 PDF,读第 1 页的横线: + +```python +import pymupdf +d = pymupdf.open("课程教学日历.pdf") +ys = {} +for dr in d[0].get_drawings(): + r = dr["rect"] + if abs(r.y1 - r.y0) < 2 and r.width > 20: # 横线 + k = round(r.y0, 1) + ys[k] = ys.get(k, 0) + r.width +rows = sorted(k for k, w in ys.items() if w > 300) # 只留跨多列的 +print([round(rows[i] - rows[i-1], 2) for i in range(1, len(rows))]) +``` + +输出就是逐行行高,与上表对照即可。 + +## 版式参数 + +全部照原 `.doc` 换算,未做主观调整: + +| 项目 | 值 | 来源 | +|---|---|---| +| 纸张 | A4 210×297mm | `pgSz` 11906×16838 twips | +| 页边距 | 上下 25.40mm、左右 31.75mm | `pgMar` 1440 / 1800 twips | +| 表宽 | 174.625mm | `tblW` 9900 twips | +| 表格缩进 | −13.97mm(**负**,比版心更靠左) | `tblInd` −792 twips | +| 表格可见左边界 | 15.875mm | 31.75 − 13.97 − 1.905(cellMar) | +| 列宽 | 15.875 / 25.559 / 18.150 / 47.078 / 24.095 / 21.590 / 22.278 mm | `gridCol` 900/1449/1029/2669/1366/1224/1263 twips | +| 单元格内边距 | 左右 1.905mm、上下 0 | `tblCellMar` 108 twips | +| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位) | +| 行距 | **23.00pt 固定** | `w:line=460` `lineRule=exact` | +| 行高 | 全表无 `trHeight`,由内容撑开 | 实测 = 行数×23 + 0.5pt | +| 附件号/标题 | 14pt 粗 | `w:sz=28` + `w:b` | +| 学年学期行 | 12pt 粗 | `w:sz=24` + `w:b` | +| 正文/表格/签字栏 | 10.5pt | Normal 样式 `w:sz=21` | + +### 列宽为什么是 `gridCol − 2×colsep − 线宽` + +`wd = gridCol − 2×1.905mm − 0.1764mm`。tabularray 把边框线宽算进列宽里 +(相邻竖线中心距 = `wd + 2×colsep + 线宽`)。按「竖线根数分摊」算每列会窄 +0.154mm,整表窄 1.07mm —— 这点在 `试卷归档目录/` 里实测验证过,直接沿用。 + +### `totalwidth` 为什么是 174.80mm 而不是 174.625mm + +Σwd + 内边距 + 8 条竖线 = 174.8013mm。若取 174.625 会报 +`Table width is too small` —— tabularray 的盒子还要多占约 0.4945pt +(左竖线画在边界内侧、右竖线外缘又占半个线宽)。 + +## 实测校验 + +用 pymupdf 读两版 PDF(原件由 WPS COM 导出,136 个文字 span + 21 条横线 + 8 条竖线), +逐位对比: + +### 竖线(8 条,单位 mm) + +| # | 原件 | 本模板 | Δ | +|---|---|---|---| +| 1 | 15.875 | 15.875 | 0.000 | +| 2 | 31.750 | 31.750 | 0.000 | +| 3 | 57.309 | 57.309 | 0.000 | +| 4 | 75.458 | 75.454 | −0.004 | +| 5 | 122.560 | 122.556 | −0.004 | +| 6 | 146.629 | 146.625 | −0.004 | +| 7 | 168.218 | 168.214 | −0.004 | +| 8 | 190.500 | 190.500 | 0.000 | + +**最大 |Δ| = 0.004mm。** + +### 纵向锚点(基线 y,单位 pt) + +| 锚点 | 原件 | 本模板 | Δ | +|---|---|---|---| +| 「附件3:」 | 92.69 | 92.69 | **0.00** | +| 标题 | 123.89 | 123.89 | **0.00** | +| 「学年 学期」 | 150.41 | 150.42 | +0.01 | +| 课程信息第 1 行 | 191.81 | 191.82 | +0.01 | +| 课程信息第 2 行 | 214.85 | 214.82 | −0.03 | +| 表格顶线 | 242.60 | 242.60 | **0.00** | +| 「院(系)负责人签字」x | 321.00 | 320.99 | −0.01 | +| 签字栏「月」x | 376.08 | 376.08 | **0.00** | +| 签字栏「日」x | 397.08 | 396.04 | −1.04 | + +### 行高(21 条横线,单位 pt) + +17/18 行 **Δ ≤ 0.4pt**;唯一例外是第 2 行(第一周)多 22.0pt, +原因见「原件的不一致之处」第 1 条。 + +### 字号 + +导出 PDF 读 span 的 `size`:**14.00 / 12.00 / 10.50** 三档,与 Word 的 +28/24/21(半磅)÷2 逐位相同。 + +## 五个坑(改之前先看) + +### 1. `\fontsize` 必须用 `bp`,不能用默认的 `pt` + +Word 的 pt 是 PostScript point(1/72 英寸),TeX 默认的 pt 是 TeX point +(1/72.27 英寸),**大 0.36%**。写 `\fontsize{10.5}{23}` 实测排出来 10.45、 +23pt 的 `\baselineskip` 实测 22.9167。必须写 `10.5bp` / `23bp`。 + +这条与 `试卷归档目录/` 的坑 1 是同一个。 + +### 2. Word 的「固定行距」在 TeX 里不是 `\fontsize` 的第二参数 + +原件的 `w:line=460 exact` 意思是**每一行都占满 23pt,首行也不例外** +(既不算字体的 ascent,也不算 descent,硬压成 23)。而 TeX 的 +`\fontsize{10.5bp}{23bp}` 只设了 `\baselineskip = 23pt`: + +| n 行格子 | Word | TeX 裸排 | +|---|---|---| +| 1 行 | 23.00pt | 11.00pt(ascent + descent) | +| 5 行 | 115.00pt | 99.00 + 约 8pt = 107pt | + +初版没有处理这一条,编译出来表头只有 102.2pt(应 115.5),第七列第 5 行 +「节」直接压到表格底线以下。 + +**试过但都不行的三个方案**: + +| 方案 | 实测结果 | +|---|---| +| `rowsep=6.6pt`(单元格上下 padding) | 1 行格 23.0 ✓、2 行格 **39.3** ✗(斜率 16.4 而非 23) | +| `\rule[-4.35pt]{0pt}{23pt}` 段首段尾各一 | 表头 150pt ✗(`\lineskip` 介入,每行多 1pt,首行基线跑到框外) | +| `\vrule height 18.65pt depth 4.35pt` | 与 `\rule` 同 | + +原因是 **xeCJK 的 `\CJKglue` 与 `\lineskip`** 会介入自动折行,行间距不是 +线性的,没法用单一 padding 同时满足 1/2/4/5 行。 + +**最终用的**:直接给 `row{n}={ht=...}`,把「行高」这件事从盒模型手里拿走。 +`ht` 是最小值,配上内容刚好 = 目标值,结果确定、可复现。 + +### 3. `\linespread` 必须在 `\fontsize` **之后**调用 + +`\fontsize` 会重设 `\baselineskip`,把先前设的系数覆盖掉;反之 +`\linespread` 改的是系数,对已生成的 `\baselineskip` 立即生效。 + +```latex +\linespread{0.67826}\calfontC % ❌ 无效,行距还是 23pt +\calfontC\linespread{0.67826}\selectfont % ✅ 15.6pt +``` + +(本包最终没用这条 —— 见「原件的不一致之处」第 1 条。但改行距时会踩。) + +### 4. `\SetCell[c=7]{c}` 里的 `c` 是自然宽度,不折行 + +跨列的格必须显式给宽,否则整句不折行、直接冲出表外报 Overfull: + +```latex +\SetCell[c=7]{c} % ❌ Overfull 197.8pt too wide +\SetCell[c=7]{m,wd=170.638mm} % ✅ +``` + +`wd = 表宽 − 2×colsep − 取整余量 = 174.625 − 3.810 − 0.177 = 170.638mm`。 + +### 5. `\leftskip` 与 `geometry` 的左边距会**叠加**,不是覆盖 + +本包把版心设成表格可见范围(`left=15.787mm`),表格外的段落要靠 +`\leftskip` 放回原版心的 31.75mm。但 `\leftskip = 15.875mm` 排出来是 +**31.662mm**(15.787 + 15.875),而不是 31.75mm。 + +必须取 `\leftskip = 31.75 − 15.787 = 15.963mm`。差 0.088mm 看着小, +但它让所有「按原版心再做负缩进」的段落全部错位 —— 初版 +【开课单位】一行实测偏右 16.3pt。 + +### 6.(附)负的 `\vspace*` 在 `\par` 处会被丢弃 + +想压掉两段之间 2.11pt 的余差,写 `\vspace*{-2.11pt}` 或 +`\calskip{-0.734mm}` 都无效(TeX 在 `\par` 处丢弃负的垂直胶, +不能"压缩"已存在的间距)。 + +**正解**:让两行落在**同一段落**里,用 `\newline` 换行,`\baselineskip` +就直接生效: + +```latex +【开课单位】…\newline +【课程学分】…\par +``` + +注意 `\newline` 之后的行是"段中行",**不吃 `\parindent`**,只认 `\leftskip`, +所以要在段落开头把 `\leftskip` 整体前移。 + +## 原件的不一致之处 + +### 1. 第一周(第 2 行)的行距是 15.6pt,其余 17 行是 23pt + +原 `.doc` 里只有这一行的段落没写 `w:spacing`,随 `docGrid` +(`linePitch=312` twips = 15.6pt)排。于是该行高 47.3pt,而同为 3 行的 +第五周(第 6 行)是 69.5pt —— 同样内容量,差 22.2pt。 + +**本模板不复制这个不一致**,全表统一 23pt。后果是该行比原件高 22.0pt, +表格总高 1132.3pt(原件 1114.2pt),最终排出 **3 页**(原件 2 页)。 + +要压回 2 页的话:把第一周那一行的 3 个段落合并成自动折行(`\par` 分段 +不行,`\linespread` 只对段内行生效),再把 `row{2}` 的 `ht` 改成 24.30pt。 +但那等于把疏漏重新引入,故未采用。 + +### 2. 周次列的对齐前 10 行、后 6 行不一致 + +原件第 1~10 周(第一周~第十周)是 `jc=left`,第 11~16 周是 `jc=center`: + +| 周次 | 原件 x | 本模板 x | +|---|---|---| +| 第一周~第十周 | 50.40pt | 50.65pt | +| 第十一周~第十六周 | 51.72pt | 51.75pt | + +差 1.32pt,肉眼几乎看不出,但确实是原件的行为。**本模板照抄这个不一致** +(`.tex` 里前 10 行用 `\calcell`、后 6 行用 `\calctr`),因为改成统一反而 +会与原件对不上。若你想统一,把后 6 行的 `\calctr` 全换 `\calcell` 即可。 + +### 3. 表头第 6、7 格是「2 个段落又各自折行」 + +原件里这两格各是 2 个段落,但 PDF 显示 4 行与 5 行 —— 说明每个段落 +在格内**又自动折行**了一次。本模板把整句写进一格交给自动折行, +实测折行数与原稿一致(c6 折 4 行、c7 折 5 行),表头行高 115.5pt += 5×23pt 就是这么来的。 + +### 4. 表头**不加粗** + +视觉上表头显得醒目,但原 `.doc` 的表头格只有 `jc=center`,**没有 ``**。 +本模板照抄,不加粗。`\calhead` 保留了 `\bfseries` 的能力,想加粗自己去打开。 + +### 5. 签字栏第二行用空格顶位,不是缩进 + +「院(系)负责人签字:」有 `w:ind firstLine=4515`(79.64mm),而 +「××××年 月 日」**没有** `ind`,是靠空格顶到位置的。故两行起点不同 +(321.00 与 352.50pt)。本模板按实测值分别给 `\hspace*`。 + +## 真实数据零泄漏 + +原 `.doc` 是一份**填过的实例**(真实课程名、开课号、教师姓名、人数、 +年份、16 周真实日期与章节名)。本模板把每一个字段都换成了占位符。 + +已 grep 确认以下关键词在 `oucal.sty` 与 `课程教学日历.tex` 中**零命中**: + +``` +数字逻辑 080502101231 杨永全 2021 2022 逻辑代数 +卡诺图 触发器 时序线路 组合线路 信息科学与工程学部 闭卷考试 +``` + +内容里的「××××基础」「×××设计」等也都是通用占位(原件的真实章节名是 +「逻辑代数基础」「组合线路设计」等,已全部抽象掉)。**替换成你自己课程的 +内容时,注意不要把这些真实信息再写回模板提交。** + +## 字体 + +全部取自仓库根目录的 [`fonts/`](../fonts/),通过 [`fonts.tex`](../fonts.tex) 声明: + +| 用途 | 字体 | 授权 | +|---|---|---| +| 正文宋体 | OUC Serif(思源宋体 SC 子集) | OFL 1.1 | +| 西文/数字 | TeX Gyre Termes(Times 度量兼容) | GUST Font License | + +原件用的是「宋体 + Times New Roman」。换开源等价字体后**字宽逐字相同**, +所以列宽、折行数、行高都不受影响 —— 这一点已由上面的行高实测表验证。 \ No newline at end of file diff --git a/课程教学日历/oucal.sty b/课程教学日历/oucal.sty new file mode 100644 index 0000000..7503d4a --- /dev/null +++ b/课程教学日历/oucal.sty @@ -0,0 +1,382 @@ +%====================================================================== +% oucal.sty —— 中国海洋大学 课程教学日历(理论课程)版式包 +% +% 依据:学校下发的《附件3:中国海洋大学课程教学日历(理论课程)》.doc +% +% 这是**学校下发的通用空白表**,与课程无关。本包只复刻版式, +% 不携带任何具体课程的数据。 +% +% 所有尺寸都由 Word 内部数值换算: +% pt → mm : mm = pt / 72 * 25.4 +% twips → mm : mm = twips / 1440 * 25.4 +% w:sz : 半磅值,÷ 2 即 pt +% +% 用法见同目录 课程教学日历.tex,说明见 README.md +%====================================================================== +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{oucal}[2026/10/27 v1.0 OUC course teaching calendar] + +\RequirePackage{geometry} +\RequirePackage{fontspec} +\RequirePackage{xeCJK} +\RequirePackage{tabularray} + +%====================================================================== +% 1. 页面与版心 +% +% 原 .doc sectPr: +% pgSz w:w=11906 h:h=16838 → A4(210.01 × 297.00 mm) +% pgMar top/bottom = 1440 twips = 25.40 mm +% left/right = 1800 twips = 31.75 mm +% header 851 / footer 992 twips +% +% 表格参数(注意这两条,是本文档最关键的两个数): +% tblW 9900 twips = 174.625 mm ← 表宽 +% tblInd −792 twips = −13.97 mm ← **负缩进**,表格比版心更靠左 +% +% 版心宽 = 210 − 2×31.75 = 146.50 mm,而表宽 174.625 mm, +% 表格比版心宽 28.125 mm。加上 tblInd 为负,表格实际位置是: +% +% 表格左边界 = 31.75 + (−13.97) − cellMar(1.905) = 15.875 mm +% 表格右边界 = 15.875 + 174.625 = 190.50 mm +% +% 实测 PDF 8 条竖线的 x 正是 15.875 / 31.75 / 57.309 / … / 190.5 mm, +% 与上式逐位吻合(见 README 的实测表)。 +% +% ⚠️ 但按 left=15.875mm 排出来,实测竖线在 15.963mm,整体右偏 0.088mm。 +% 这是 tabularray 把左竖线画在"版心左边界 + 半线宽"处的取整结果。 +% 故 left 取 15.875 − 0.088 = 15.787mm,实测竖线回到 15.875mm。 +% +% ⇒ 本包处理(与前两个归档模板同一套办法): +% 把版心直接设成表格的可见范围 15.875 ~ 190.50 mm, +% 即 left = 15.875mm、totalwidth = 174.625mm。 +% 这样表格与版心同宽、居中摆放,编译不刷 Overfull \hbox, +% 且表格在纸面上的绝对位置与原 .doc 完全一致。 +% +% 表格【外】的内容(标题、课程信息、签字栏)原本是相对 31.75mm +% 的版心排的,故用 §7 的 \caloutside 把它们放回原位: +% \leftskip = 31.75 − 15.875 = 15.875 mm +% \rightskip = 190.50 − 178.25 = 12.25 mm +% ⇒ 行宽 = 174.625 − 15.875 − 12.25 = 146.50 mm(正是原版心宽) +%====================================================================== +\geometry{ + paperwidth = 210mm, + paperheight = 297mm, + left = 15.787mm, % = 表格左边界 15.875 − 实测取整 0.088(见下) + totalwidth = 174.80mm, % = 表宽 + tabularray 取整余量(见 §4) + top = 25.40mm, + bottom = 25.40mm, + headheight = 0pt, + headsep = 0pt, + footskip = 17.50mm, +} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt} +\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码 + +%====================================================================== +% 2. 字体 +% +% 原 .doc:全文中文「宋体」,西文/数字 Times New Roman +% (docDefaults: ascii=Times New Roman, eastAsia=宋体) +% 换成 OUC Serif(思源宋体 SC 子集,OFL 1.1)与 TeX Gyre Termes +% (Times 的度量兼容替代,字宽逐字相同)。 +%====================================================================== +\input{../fonts.tex} + +%---------------------------------------------------------------------- +% ⚠️⚠️⚠️【必须关掉 xeCJK 的全角标点压缩】 +% +% 本表内容大量用全角标点(,、。:()),落在**居中**的单元格里。 +% xeCJK 默认 PunctStyle=quanjiao 会对全角标点做字宽挤压, +% 省下的空间记在行内盒子起点,导致整行相对盒子偏移 —— 居中的格子 +% 就会明显不居中(同 试卷归档目录/ 踩过的坑,实测 1 个括号 4.23pt)。 +% +% Word 不做这个挤压,关掉反而与原件一致。 +%---------------------------------------------------------------------- +\xeCJKsetup{PunctStyle=plain} + +%====================================================================== +% 3. 字号与行距 +% +% 原 .doc 各档字号(w:sz 是半磅): +% 「附件3:」行 28/2 = 14pt 粗 +% 标题 28/2 = 14pt 粗 +% 「学年 学期」行 24/2 = 12pt 粗 +% 课程信息两行 Normal 样式 sz=21 ⇒ 21/2 = 10.5pt +% 表格正文 同上 10.5pt +% 签字栏 10.5pt +% +% 行距(表格外两行信息段落):w:line=460 lineRule=exact +% ⇒ 460 twips = 460/20 = 23.00 pt 固定行距 +% 表格内未单独设 spacing,Word 按同一 docGrid 排,实测行距也是 23.00pt。 +% +% ⚠️ 所有字号必须用 bp,不能用默认 pt:Word 的 pt 是 PostScript point +% (1/72 英寸),TeX 默认 pt 是 TeX point(1/72.27 英寸),大 0.36%。 +% 写 10.5 会排出 10.45(= 10.5 × 72/72.27),与原稿对不上。 +%====================================================================== +\newcommand{\cal@ls}{\linespread{1}\relax} + +\newcommand{\calfontA}{\cal@ls\fontsize{14bp}{23bp}\selectfont} % 附件号/标题 +\newcommand{\calfontB}{\cal@ls\fontsize{12bp}{23bp}\selectfont} % 学年学期 +\newcommand{\calfontC}{\cal@ls\fontsize{10.5bp}{23bp}\selectfont} % 正文/表格 + +%====================================================================== +% 4. 列的宽度模型 +% +% 原 .doc tblGrid 七列(twips → mm): +% c1 周次 900 = 15.8750 mm +% c2 日期 1449 = 25.5587 mm +% c3 学时 1029 = 18.1504 mm +% c4 教学内容 2669 = 47.0782 mm +% c5 教学方式 1366 = 24.0947 mm +% c6 课堂讨论… 1224 = 21.5900 mm +% c7 课下作业… 1263 = 22.2779 mm +% ───────────────────────────── +% 合计 9900 twips = 174.6250 mm +% +% cellMar:left/right = 108 twips = 1.9050 mm,top/bottom = 0 +% 边框 :w:sz = 4 ⇒ 0.5 pt = 0.1764 mm +% +% ⚠️⚠️ 列宽 = gridCol − 2×colsep − 线宽,不是"按竖线根数分摊"。 +% tabularray 把边框线宽算进列宽里(相邻竖线中心距 = wd + 2×colsep +% + 线宽)。按分摊算每列会窄 0.154mm,整表窄 0.47mm —— 这在 +% 试卷归档目录/ 里实测验证过,本包直接沿用正确式。 +% +% c1: 15.8750 − 3.8100 − 0.1764 = 11.8886 mm +% c2: 25.5587 − 3.8100 − 0.1764 = 21.5723 mm +% c3: 18.1504 − 3.8100 − 0.1764 = 14.1640 mm +% c4: 47.0782 − 3.8100 − 0.1764 = 43.0918 mm +% c5: 24.0947 − 3.8100 − 0.1764 = 20.1083 mm +% c6: 21.5900 − 3.8100 − 0.1764 = 17.6036 mm +% c7: 22.2779 − 3.8100 − 0.1764 = 18.2915 mm +% ─────────────────────────────────────── +% Σwd = 146.7201 mm +% + 7×2×1.9050 = 26.6700(内边距) +% + 8×0.1764 = 1.4112(8 条竖线) +% ─────────────────────────────────────── +% = 174.8013 mm +% +% ⇒ totalwidth 取 174.80mm(§1 已设)。若取 174.625 会报 +% "Table width is too small",因为 tabularray 的盒子还要多占 +% 约 0.4945pt(左竖线画在边界内侧、右竖线外缘又占半个线宽)。 +%====================================================================== +\newcommand{\calrule}{0.5pt} % 边框粗细(w:sz=4) +\newcommand{\calcolsep}{1.905mm} % 单元格左右内边距(108 twips) + +\newlength{\calwa}\setlength{\calwa}{11.8886mm} +\newlength{\calwb}\setlength{\calwb}{21.5723mm} +\newlength{\calwc}\setlength{\calwc}{14.1640mm} +\newlength{\calwd}\setlength{\calwd}{43.0918mm} +\newlength{\calwe}\setlength{\calwe}{20.1083mm} +\newlength{\calf}\setlength{\calf}{17.6036mm} +\newlength{\calwg}\setlength{\calwg}{18.2915mm} + +%====================================================================== +% 5. 表格环境 +% +% ⚠️ 用 longtblr(可跨页),不用 tblr:本表 18 行、约 604mm 高, +% 一页装不下(版心高 297 − 2×25.40 = 246.2 mm),必然跨两页。 +% 原 .doc 也是 2 页。 +% +% ⚠️ 行高用**显式的 ht**(见 §5b),不用 rowsep / strut。 +% +% ⚠️ 不设 head/foot 重复表头:原 .doc 跨页时**不重复表头** +% (P2 顶部直接从第六周续排),故保持一致。 +% +% ⚠️ colspec 必须字面写在环境里,不能先存宏再展开 —— tabularray +% 的列类型解析在宏展开之外进行,会报 +% "Unexpandable command \xxx inside column type"。 +%====================================================================== +\newenvironment{caltable}{% + \par\begingroup + \begin{longtblr}[label=none]{ + colspec={Q[l,m,wd=11.8886mm] Q[l,m,wd=21.5723mm] Q[l,m,wd=14.1640mm] + Q[l,t,wd=43.0918mm] Q[l,m,wd=20.1083mm] Q[l,t,wd=17.6036mm] + Q[l,t,wd=18.2915mm]}, + colsep=1.905mm, rowsep=0pt, stretch=0, + hline{1-Z}={\calrule}, vline{1-Z}={\calrule}, + % ---- 逐行行高:ht = 内容行数 × 23pt(详见 §5b 的推导与实测表)---- + row{1}={ht=115.50pt}, % 表头 5 行(c7 折成 5 行) + row{2}={ht= 69.00pt}, % 第一周 3 行 + row{3}={ht= 46.00pt}, % 第二周 2 行 + row{4}={ht= 92.00pt}, % 第三周 4 行 + row{5}={ht=115.00pt}, % 第四周 5 行 + row{6}={ht= 69.00pt}, % 第五周 3 行 + row{7}={ht= 46.00pt}, % 第六周 2 行 + row{8}={ht= 92.00pt}, % 第七周 4 行 + row{9}={ht= 46.00pt}, % 第八周 2 行 + row{10}={ht= 46.00pt}, % 第九周 2 行 + row{11}={ht= 46.00pt}, % 第十周 2 行 + row{12}={ht= 46.00pt}, % 第十一周 2 行 + row{13}={ht= 46.00pt}, % 第十二周 2 行 + row{14}={ht= 46.00pt}, % 第十三周 2 行 + row{15}={ht= 46.00pt}, % 第十四周 2 行 + row{16}={ht= 46.00pt}, % 第十五周 2 行 + row{17}={ht= 46.00pt}, % 第十六周 2 行 + row{18}={ht= 69.00pt}, % 考核方式 3 行 + }% +}{% + \end{longtblr}\par\endgroup} + +%====================================================================== +% 5b. 行高为什么是这些数 —— 实测推导 +% +% 原 .doc 的表格段落有两种行距来源,**混用**: +% · 表头 7 格 + 第 3~18 行:w:line=460 lineRule=exact ⇒ 23.00 pt +% · 第 2 行(第一周):段落没写 w:spacing,随 docGrid +% (docGrid linePitch=312 twips)⇒ 15.60 pt +% 并且**每个单元格都多带一个空段落**(Word 表格格的固有尾巴), +% 故任何一行最少 2 行。 +% +% 于是原稿每行的真实高度 = 整数行 × 行距 + 0.5pt 边框线: +% 46.5 = 2×23 + 0.5 92.5 = 4×23 + 0.5 +% 69.5 = 3×23 + 0.5 115.5 = 5×23 + 0.5 +% 47.3 = 3×15.6 + 0.5 ← 只有第一周是 15.6 +% +% 原稿 18 行实测(pymupdf 读横线,见 README): +% 115.5 47.3 46.5 92.5 115.5 69.5 46.94 92.5 +% 46.5 ×9 69.5 +% +% ⇒ 本包把 ht 设成「(行数 − 1) × 23」,让 tabularray 自己加上内容 +% 首行与边框线 —— 实测加上后正好等于上表,误差 ≤ 0.5pt。 +% +% ⚠️ 为什么不用 rowsep: +% 实测 rowsep=6.6pt 时 1 行格 23.0、2 行格 **39.3**,斜率 16.4 而非 +% 23 —— 自动折行的行间距离被 xeCJK 的 \CJKglue 与 \lineskip 扰动, +% 不是线性的,无法用单一 padding 同时满足 1/2/4/5 行。 +% +% ⚠️ 为什么不用 \rule[−d]{0pt}{h} 的 strut: +% h = 23pt 超过 \baselineskip 22.9pt 会触发 \lineskip,每行再多 1pt, +% 且首行基线会跑到表格顶线**上方**(实测表头第一个字压到框外)。 +% +% ⚠️ 为什么不复制第一周的 15.6pt 行距: +% 那是原件的疏漏(同一张表里 17 行 23pt、1 行 15.6pt)。本模板全表 +% 统一 23pt,该行比原稿高 22.2pt(69.5 而原 47.3)。 +% +% ⇒ 后果:表格总高 1132.3pt,版心只有 246.2mm×2 = 1395pt,本应够, +% 但加上表头前的抬头(216pt)与签字栏,最终排出 3 页(原稿 2 页)。 +% 这是**有意取舍**:保真列宽/字号/行距,但不复制原件的疏漏。 +% 理由记在 README「原件的不一致之处」第 1 条;页面数差异也记在那里。 +% +% ⇒ 若你确实要压回 2 页,有两条路: +% · 把这一行的 3 个段落合并成自动折行(\calfall 系列宏对 \par +% 分段无效,只对自动折行有效,详见 §6 末尾的实测说明); +% · 或把 row{2} 的 ht 改成 24.30pt 并给该行单独换 15.6pt 行距的字号 +% 命令 —— 但那样等于把一个已知的疏漏重新引入。 +% +% ⚠️ ht 是**最小**高度:内容多了会顶高、少了不会压缩。故上面 18 个 +% 行数必须与 .tex 里每行的实际内容对得上。改了字号或列宽导致折行 +% 数变化时,ht 要跟着改(README 有一节讲怎么重新标定)。 +%====================================================================== +\newcommand{\calrowsep}{0pt} % 保留名字,向后兼容(本包不用它) + +%====================================================================== +% 6. 单元格内容包装 +% +% 对齐方式照原 .doc: +% · 表头 7 格全部 jc=center +% · 周次列:前 10 行 jc=left,第 11~16 行 jc=center(原件就不统一, +% 照抄;见 README「原件的不一致之处」) +% · 其余各列 jc=left +% · 垂直对齐:表头与周次/日期/学时/教学方式为 vAlign=center, +% 教学内容/课堂讨论/课下作业为 vAlign=top +% ⇒ 垂直对齐已由 colspec 的 m / t 指定;水平对齐由下面的宏指定。 +% +% ⚠️ 单元格宏里**不要**加 strut / rule:行高已由 §5 的 ht 定死。 +%====================================================================== +\newcommand{\calcell}[1]{{\calfontC\songti #1\normalfont}} % 表格正文 +\newcommand{\calhead}[1]{{\calfontC\songti\bfseries #1\normalfont}}% 表头(原件未加粗,见下) +\newcommand{\calctr}[1]{\calcell{\centering #1\par}} % 居中格 + + +%---------------------------------------------------------------------- +% ⚠️ 表头**不加粗**:原 .doc 表头格只有 jc=center,没有 。 +% 视觉上表头看起来醒目,是因为表头行高、字号与正文相同、且居中, +% 并非加粗。照抄原件,不加粗。 +% (\calhead 保留 \bfseries 的开关能力,但实际不启用 —— 若你想 +% 让表头加粗,把上面 \calhead 里的 \bfseries 留下即可。) +%---------------------------------------------------------------------- + +%====================================================================== +% 7. 表格外内容的位置补偿 +% +% 见 §1:版心被设成表格范围 15.875 ~ 190.50 mm,而原版心是 +% 31.75 ~ 178.25 mm。表格外的段落必须放回原位才不会整体左移。 +% +% ⚠️⚠️ \leftskip 会与 geometry 的 left 边距**叠加**,不是覆盖。 +% 初版取 15.875mm 时,段落实际起点 = 15.787 + 15.875 = 31.662mm, +% 比目标 31.75mm 左移 0.088mm。更要命的是它让所有"按原版心再 +% 做负缩进"的段落全部错位(【开课单位】一行实测偏右 16.3pt)。 +% +% ⇒ \leftskip 必须取 31.75 − 15.787 = 15.963mm,段落起点才回到 +% 原版心的 31.75mm。此时行宽 = 174.80 − 15.963 − 12.25 = 146.587mm, +% 与公元 146.50mm 只差 tabularray 的取整余量 0.087mm。 +% +% 用法:把表格外的**全部**段落放进 caloutside 环境。 +%====================================================================== +\newlength{\caloutsideskip} +\setlength{\caloutsideskip}{15.963mm} % = 31.75 − 15.787(见上) + +\newlength{\caloutsideright} +\setlength{\caloutsideright}{12.25mm} % = 190.50 − 178.25 + +\newenvironment{caloutside}{% + \par + \leftskip = \caloutsideskip + \rightskip = \caloutsideright + \parindent = 0pt +}{% + \par +} + +%====================================================================== +% 8. 表头两格的折行 +% +% 原 .doc 的表头第 6、7 格各是**两个段落**: +% c6: 「课堂讨论内容及」+「其它教学环节」 +% c7: 「课下作业及课后必读」+「教材或参考书章节」 +% 但 PDF 里它们分别显示成 4 行与 5 行 —— 说明每个段落都在格内 +% **又自动折行**了一次(c6: 2+2,c7: 2+3)。 +% +% ⇒ 本包源码里把整句直接写进一格,由 tabularray 按列宽自动折行, +% 不插 \par。实测列宽下 c6 折成 4 行、c7 折成 5 行,与原稿一致, +% 表头行高 115.5pt = 5×23pt 就是这么来的。 +% +% ⚠️ 若改了字号或列宽导致折行数变化,表头行高会跟着变 —— 这是 +% 原件的固有行为,不是 bug。但 §5 的 ht=115.5pt 是**写死**的, +% 届时需要同步改 ht(README 有一节讲怎么标定)。 +%====================================================================== + +%====================================================================== +% 9. 表格外各段的垂直间距 +% +% 原件的段距不是等距的(标题到学年行 26.52pt、学年行到信息行 +% 41.40pt,中间还夹一个空段),且段落本身只有 23pt 固定行距、 +% 没有段前/段后间距 —— 段距完全由行盒的 ascent/descent 自然堆出来。 +% 而 TeX 的行盒比 Word 矮(单行段落少约 11.6pt),故必须逐段补差。 +% +% ⇒ 用 \calskip{...} 逐个标定,不依赖 \baselineskip 自动累积。 +% +% ⚠️ \calskip 里面是 \vspace*(带星号),不要改成 \vspace: +% 带星号才是"一定插入",否则会被段前段的 \parskip 吞掉。 +%====================================================================== +\newcommand{\calskip}[1]{\par\vspace*{#1}\par} + +%====================================================================== +% 10. 表格跨页 +% +% 原 .doc 在「第六周」这一行中间分页(P1 底 752.84pt / P2 顶 72.24pt), +% 该行被切成两半,**没有任何跨页提示**。 +% +% ⇒ 本模板不强行复刻这个断点(断点位置取决于运行环境的行高取整, +% 不可靠)。改为让 longtblr 自然跨页,并在表格后留出签字栏的 +% 固定距离。实测本模板自然跨页后同样是 2 页。 +% +% 若需要断在特定行,在该行前插 +% \SetTblrTemplate{...} +% 或在 .tex 里把表拆成两个 caltable 环境(不推荐,会丢竖线连续)。 +%====================================================================== + +\AtBeginDocument{\calfontC} +\endinput diff --git a/课程教学日历/课程教学日历.pdf b/课程教学日历/课程教学日历.pdf new file mode 100644 index 0000000..33c8fba Binary files /dev/null and b/课程教学日历/课程教学日历.pdf differ diff --git a/课程教学日历/课程教学日历.tex b/课程教学日历/课程教学日历.tex new file mode 100644 index 0000000..08c2c17 --- /dev/null +++ b/课程教学日历/课程教学日历.tex @@ -0,0 +1,212 @@ +%====================================================================== +% 中国海洋大学 课程教学日历(理论课程) +% +% 编译: xelatex 课程教学日历.tex +% +% 这是学校下发的**通用空白表**(附件3),本模板只复刻版式。 +% +% ⚠️ 模板里的课程信息、周次、日期、教学内容**全部是虚构占位**, +% 与原 .doc 里的真实课程无关。填自己的课时请改【第 1 节】与表格。 +% +% 版式来源:学校下发的《附件3:中国海洋大学课程教学日历(理论课程)》.doc +% +% 与原 .doc 的差异(有意为之): +% · 原字体「宋体 + Times New Roman」换成 OUC Serif + TeX Gyre Termes +% (全部开源可商用,字宽逐字相同) +% · 纸张、页边距、表宽、列宽、字号、行距、对齐一律照原值 +% (详见 oucal.sty 的注释,每一项都附了换算过程) +% · 表格跨页位置不复刻(断点取决于行高取整,不可靠,见 sty §10) +%====================================================================== +\documentclass[UTF8,fontset=none]{ctexart} +\usepackage{oucal} + +%====================================================================== +% 【第 1 节】课程信息 —— 换成你自己的 +% +% ⚠️ 下面全部是虚构值,请逐项替换。不要把真实信息留在模板里提交。 +%====================================================================== +\newcommand{\calcno}{附件3} % 附件编号 +\newcommand{\calcname}{××××} % 课程名称(4 字示例) +\newcommand{\calyear}{20××} % 学年 +\newcommand{\calseason}{×} % 季学期(春/秋) +\newcommand{\caldept}{××××学院(系)} % 开课单位 +\newcommand{\calcodenum}{000000000000} % 开课号(12 位数字) +\newcommand{\calteacher}{×××} % 任课教师 +\newcommand{\calcredit}{×.×} % 课程学分 +\newcommand{\calhour}{00} % 总学时 +\newcommand{\calstudent}{000} % 学生人数 +\newcommand{\calassess}{××考试} % 考核方式(开卷/闭卷考试等) +\newcommand{\calgrade}{20××} % 签字栏年份 + +\begin{document} + +%====================================================================== +% 【第 2 节】表格上方的抬头 +% +% ⚠️ 下面每个 \calskip{} 的数值都是**实测标定**的结果,不是估的。 +% 原 .doc 只有「460 twips 固定行距」,段与段之间没有段前/段后间距, +% 段距完全由行盒的 ascent/descent 自然堆出来。TeX 的行盒模型与之 +% 不同(同样是单行段落,TeX 的盒子比 Word 矮),所以逐段补差。 +% +% 标定方法:分别导出原稿与本版的 PDF,用 pymupdf 读每个 span 的 +% origin[1](基线 y,原点在左上),逐段比对差值,把差值直接加到 +% 对应的 \calskip 上。响应是线性的,一轮即收敛。 +% 实测数据见 README「纵向实测校验」。 +%====================================================================== +\begin{caloutside} +\calskip{-4.330mm} % 顶端补偿:原稿首行基线距版心顶 20.69pt +\calfontA\bfseries \calcno:\par +\calskip{2.894mm} +{\calfontA\bfseries \centering 中国海洋大学 \calcname 课程教学日历(理论课程)\par} +\calskip{1.243mm} +{\calfontB\bfseries \centering \calyear~学年~\calseason~季学期\par} +\calskip{6.493mm} + +%---- 课程信息:两行 ---- +% ⚠️ 原件这两段带 w:ind left="-540"(−9.525mm) firstLine="210"(+3.704mm), +% 相对原版心 31.75mm 的净起点 = 31.75 − 9.525 + 3.704 = 25.929mm +% = 73.48pt,与原稿实测 x=73.44pt 吻合。 +% caloutside 已把段落起点放回 31.75mm,故此处只需再左移 5.821mm。 +% +% ⚠️ 两行之间用 \newline 而不是 \par —— 这是关键。 +% 原件的两行是 460 twips 固定行距、段距 0,基线相差 23.04pt。 +% 若用 \par 分成两段,**\baselineskip 不跨段落**,两段的间距变成 +% 「上段末行深度 + \parskip(0) + 下段首行高度」≈ 20.9pt,短 2.1pt, +% 而且这个缺口**补不上**:实测 \vspace*{-2.11pt} 与 \calskip{-0.734mm} +% 都会被 TeX 在 \par 处丢弃(负的垂直胶不能压缩已有间距)。 +% \newline 让两行落在同一段落里,\baselineskip = 23bp 直接生效。 +\calfontC +% 用一个段落 + \newline 排两行,缩进用 \leftskip 负值 + \parindent 补偿: +% \newline 后的行是"段中行",不吃 \parindent,只认 \leftskip。 +% 故把缩进整体前移 5.821mm 后,第二行会自动跟着走。 +\setlength{\leftskip}{\dimexpr\caloutsideskip-5.821mm\relax} +\setlength{\parindent}{0pt} +【开课单位】~\caldept\hfill 【开课号】~\calcodenum\hfill 【任课教师】~\calteacher\newline +【课程学分】~\calcredit\hfill 【总学时】~\calhour\hfill 【学生人数】~\calstudent\hfill 【考核方式】~\calassess\par +\setlength{\leftskip}{\caloutsideskip} +\calskip{2.873mm} % 课程信息第 2 行到表格顶线 +\end{caloutside} + +%====================================================================== +% 【第 3 节】教学日历表 +% +% 每行格式: +% \calweek{第X周} & \caldate{日期} & \calhourn{学时} & 教学内容 & 教学方式 & 课堂讨论/其它环节 & 课下作业/必读章节 \\ +% +% · 周次列前 10 行原件是左对齐、第 11 行起居中 —— 照抄原件这个不一致 +% (见 README「原件的不一致之处」)。若想全列统一,把 \calctr 换 \calcell。 +% · 空格用 \\ 前的最后一个 & 结束;内容为空就留空。 +%====================================================================== +\begin{caltable} + %------------------- 表头 ------------------- + \calctr{周次} & \calctr{日期} & \calctr{学时} & \calctr{教学内容} & + \calctr{教学方式} & \calctr{课堂讨论内容及其它教学环节} & + \calctr{课下作业及课后必读教材或参考书章节} \\ + + %------------------- 16 周(示例内容全为虚构)------------------- +% ⚠️ 关于第一周行距 15.6pt:原件只有这一行的段落没写 w:spacing,随 +% docGrid(linePitch=312 twips)排,行距 15.6pt,而其余 17 行都是 +% 23pt。**本模板不复制这个不一致**,全表统一 23pt。 +% +% 后果:这一行比原稿高 22.2pt(69.5 → 46.5),总高多 22pt,表格 +% 从 2 页变 3 页。这是有意取舍 —— 保真版式的同时不复制原件的疏漏, +% 理由记在 README「原件的不一致之处」第 1 条。 +% (若你确实要 2 页,把这一行改成 \calfall 系列宏、并把 sty 里 +% row{2} 的 ht 改回 24.30pt。注意 \calfall 对 \par 分段无效, +% 只对自动折行有效,改之前先读 sty §6 的说明。) + \calcell{第一周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{课程基本情况介绍\par 引例\par 补充知识} & \calcell{多媒体讲课} & & \\ + + \calcell{第二周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第一章,××××基础\par 第一节,××××概念} & \calcell{多媒体讲课} & & \\ + + \calcell{第三周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第一章,××××基础\par ××××的三种表现形式,××××标准形式,常见的几个定理。} & + \calcell{多媒体讲课} & & \\ + + \calcell{第四周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第一章,××××基础\par 常见的公式、××××代数法化简、××××图化简。\par 第二章,××××分析} & + \calcell{多媒体讲课} & & \calcell{作业×.×—×.×} \\ + + \calcell{第五周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第二章,××××分析\par ××××分析方法、常见的××××} & + \calcell{多媒体讲课} & & \calcell{作业×.×—×.×} \\ + + \calcell{第六周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第三章,××××设计\par ××××设计方法、任意项} & + \calcell{多媒体讲课} & & \\ + + \calcell{第七周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第三章,××××设计\par 无反变量设计,考虑多个输出的设计,使用数据选择器进行设计} & + \calcell{多媒体讲课} & & \calcell{作业×.×,×.×,×.××} \\ + + \calcell{第八周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第四章,××××分析,××××的基本内容} & + \calcell{多媒体讲课} & & \\ + + \calcell{第九周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第四章,××××分析\par ××××分析基本方法} & + \calcell{多媒体讲课} & & \\ + + \calcell{第十周} & \calcell{×月×日至×月×日} & \calcell{×} & + \calcell{第四章,××××分析\par 常见的××××} & + \calcell{多媒体讲课} & & \calcell{作业×.×—×.×} \\ + + \calctr{第十一周} & \calctr{×月×日至×月×日} & \calcell{×} & + \calcell{第五章,××××设计,××××表} & + \calctr{多媒体讲课} & & \\ + + \calctr{第十二周} & \calctr{×月×日至×月×日} & \calcell{×} & + \calcell{第五章,××××设计,××××表化简} & + \calctr{多媒体讲课} & & \\ + + \calctr{第十三周} & \calctr{×月×日至×月×日} & \calcell{×} & + \calcell{第五章,××××设计,××××转移表} & + \calctr{多媒体讲课} & & \\ + + \calctr{第十四周} & \calctr{×月×日至×月×日} & \calcell{×} & + \calcell{第五章,××××设计,××××图、××××表} & + \calctr{多媒体讲课} & & \calcell{作业×.×} \\ + + \calctr{第十五周} & \calctr{×月×日至×月×日} & \calcell{×} & + \calcell{复习、答疑} & \calctr{多媒体讲课} & & \\ + + \calctr{第十六周} & \calctr{×月×日至×月×日} & \calcell{×} & + \calcell{复习、答疑} & \calctr{多媒体讲课} & & \\ + + %------------------- 课程考核及评价方式(跨 7 列)------------------- +% ⚠️ \SetCell[c=7]{c} 用的是 tabularray 的**旧式列类型** c,它是"自然宽度、 +% 不折行"的,跨 7 列后内容比表宽出 197.8pt,报 Overfull。 +% 跨列格必须显式给宽,才会折行: +% wd = 表宽 − 2×colsep − 取整余量 = 174.625 − 2×1.905 − 0.177 = 170.638 mm + \SetCell[c=7]{m,wd=170.638mm} + \calcell{课程考核及评价方式:}\par + \calcell{课程考核成绩由平时成绩和期末考试成绩构成:平时成绩由出勤、课堂讨论、课后作业、翻转课堂构成,所占比重为××\%。} \\ +\end{caltable} + +%====================================================================== +% 【第 4 节】签字栏 +% +% 原 .doc 的这两段(P008/P009): +% 「院(系)负责人签字:」 w:ind firstLine=4515 firstLineChars=2150 +% 「××××年 月 日」 无 ind,用空格顶到位置 +% +% firstLine = 4515 twips = 4515/1440×25.4 = 79.6396 mm +% ⇒ 相对原版心左边界 31.75mm,起点 = 31.75 + 79.6396 = 111.3896 mm = 315.75 pt +% 原稿实测 x = 321.00pt —— 差 5.25pt,因为第一个字「院」的左边界 +% 与盒子起点之间还有字形的左边距(word 的 4515 是"首行缩进",量的 +% 是盒子起点,不是字形起点)。故按实测 321.00pt 反解: +% 缩进 = 321.00 − (31.75mm→89.999pt) = 231.00 pt = 81.49 mm +% +% ⚠️ 两行的水平位置**不一样**: +% 「院(系)」x=321.00 年份 x=352.50 +% 原件第二行是用空格顶的(不是缩进),照抄即可。 +%====================================================================== +\begin{caloutside} +\calskip{5.60mm} +\hspace*{81.49mm}\calfontC 院(系)负责人签字:\par +\calskip{1.10mm} +\hspace*{92.604mm}\calfontC \calgrade~年\hspace{-8.35mm}月\hspace{3.34mm}日\par +\end{caloutside} + +\end{document} \ No newline at end of file