重写全部 README,只保留使用说明
17 个 README 统一改成使用说明书,去掉来源、踩坑、需求过程等内容。 只保留: - 怎么编译、跑几遍 - 文件结构 - 要改哪些参数(逐项列出宏名与含义) - 用到的命令(表格) - 版式参数 删除: - 原文件来源、抽取过程 - 踩坑记录、最小复现、实测数据 - 用户需求、工单号、历史沿革 - 改造前后对比 行数 4185 → 2261。 全库 16/16 编译通过。
This commit is contained in:
@@ -1,64 +1,167 @@
|
|||||||
# ouc_latex_template
|
# 中国海洋大学 LaTeX 模板库
|
||||||
|
|
||||||
中国海洋大学各类文件 LaTeX 模板。**本仓库是本项目唯一的模板维护库**,各模板按文档类别分目录存放,互不依赖、可单独编译。
|
16 个文档模板 + 一份公共字体。换机器、换系统、换 Overleaf,编译结果一致。
|
||||||
|
|
||||||
## 目录
|
## 目录结构
|
||||||
|
|
||||||
| 目录 | 内容 | 编译入口 |
|
```
|
||||||
|
ouc_latex_template/
|
||||||
|
├── fonts.tex ← 公共字体入口,所有模板都引用它
|
||||||
|
├── fonts/ ← 字体文件(唯一的字体来源)
|
||||||
|
├── build.sh ← 编译脚本
|
||||||
|
├── verify_all.sh ← 全库编译检查
|
||||||
|
│
|
||||||
|
├── 会议预算表/ ┐
|
||||||
|
├── 劳务发放说明表/ │
|
||||||
|
├── 年度考核登记表/ │
|
||||||
|
├── 特殊事项说明表/ │
|
||||||
|
├── 成绩构成说明/ │
|
||||||
|
├── 试卷/ │
|
||||||
|
├── 试卷归档封面/ │ 16 个模板
|
||||||
|
├── 试卷归档目录/ │ 每个目录自成一体
|
||||||
|
├── 课程大纲/ │ 各自带 README
|
||||||
|
├── 课程执行大纲/ │
|
||||||
|
├── 课程教学日历/ │
|
||||||
|
├── 教材/ │
|
||||||
|
├── 科技报告/ │
|
||||||
|
├── 幻灯片/ │
|
||||||
|
└── 简历/ ┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 模板清单
|
||||||
|
|
||||||
|
| 模板 | 用途 | 主文件 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| [`试卷/`](试卷/) | 期末考试**试卷**、**参考答案及评分标准**两套模板 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` |
|
| `会议预算表/` | 会议经费预算表 | `会议预算表.tex` |
|
||||||
| [`试卷归档封面/`](试卷归档封面/) | 信息科学与工程学部**试卷归档封面**(理论课) | `试卷归档封面.tex` |
|
| `劳务发放说明表/` | 劳务费发放说明 | `劳务发放说明表.tex` |
|
||||||
| [`试卷归档目录/`](试卷归档目录/) | 信息科学与工程学部**试卷归档目录**(理论课,12 项核对清单) | `试卷归档目录.tex` |
|
| `年度考核登记表/` | 教职工年度考核登记表 | `年度考核登记表.tex` |
|
||||||
| [`年度考核登记表/`](年度考核登记表/) | 教职工**年度考核登记表** | `年度考核登记表.tex` |
|
| `特殊事项说明表/` | 报销用特殊事项说明表 | `特殊事项说明表.tex` |
|
||||||
| [`劳务发放说明表/`](劳务发放说明表/) | **劳务发放说明表** | `劳务发放说明表.tex` |
|
| `成绩构成说明/` | 课程成绩构成说明 | `成绩构成说明.tex` |
|
||||||
| [`特殊事项说明表/`](特殊事项说明表/) | 报销用**特殊事项说明表**(事项描述 + 三级签字审批) | `特殊事项说明表.tex` |
|
| `试卷/` | 试卷 + 参考答案与评分标准 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` |
|
||||||
| [`课程执行大纲/`](课程执行大纲/) | 本科**课程教学执行大纲** | `课程执行大纲.tex` |
|
| `试卷归档封面/` | 试卷袋归档封面 | `试卷归档封面.tex` |
|
||||||
| [`课程教学日历/`](课程教学日历/) | 学校通用版**课程教学日历(理论课程)**(附件3,16 周日历表) | `课程教学日历.tex` |
|
| `试卷归档目录/` | 试卷袋归档目录 | `试卷归档目录.tex` |
|
||||||
| [`成绩构成说明/`](成绩构成说明/) | **成绩构成说明**(理论课/实验课比例分解表 + 教师签字栏) | `成绩构成说明.tex` |
|
| `课程大纲/` | 本科生课程大纲 | `课程大纲.tex` |
|
||||||
| [`幻灯片/`](幻灯片/) | 演示文稿(**beamer** 主题,海大配色) | `slides.tex` |
|
| `课程执行大纲/` | 课程执行大纲 | `课程执行大纲.tex` |
|
||||||
| [`科技报告/`](科技报告/) | **科技报告**、实验讲义、说明文档 | `report.tex` |
|
| `课程教学日历/` | 课程教学日历 | `课程教学日历.tex` |
|
||||||
| [`简历/`](简历/) | **个人简历**(中文,A4 两栏式,含圆形头像与分区条目) | `简历.tex` |
|
| `教材/` | 教材、专著(成书排版) | `教材.tex` |
|
||||||
|
| `科技报告/` | 科技报告、实验讲义 | `report.tex` |
|
||||||
|
| `幻灯片/` | Beamer 演示文稿(16:9) | `slides.tex` |
|
||||||
|
| `简历/` | 个人简历 | `简历.tex` |
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
全部模板都**必须用 XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过:
|
在**模板目录内**编译,不要在仓库根目录编译。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd 幻灯片
|
cd 课程大纲
|
||||||
xelatex slides.tex
|
xelatex 课程大纲.tex
|
||||||
xelatex slides.tex # 跑两遍,第二遍才能取到正确的目录、交叉引用与总页数
|
|
||||||
```
|
```
|
||||||
|
|
||||||
目录名含中文不影响编译(已实测 12 个模板目录在中文目录下零报错编译通过)。
|
或用编译脚本(在仓库根目录执行):
|
||||||
|
|
||||||
## 说明
|
```bash
|
||||||
|
bash build.sh 课程大纲 # 编单个模板
|
||||||
|
bash build.sh all # 编全部,输出汇总
|
||||||
|
bash verify_all.sh # 检查全部:错误数 / Overfull / 页数
|
||||||
|
```
|
||||||
|
|
||||||
- **字体单一来源**:全库字体集中在根目录 [`fonts/`](fonts/),由 [`fonts.tex`](fonts.tex) 统一加载。十二个模板通过 `\input{../fonts.tex}` 取字体,**不自带字体、不依赖系统字体**——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。
|
脚本会自动判断该跑几遍,不用手记。
|
||||||
- **全部开源可商用**:无方正、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、无微软雅黑。用的是思源宋体/黑体、霞鹜文楷、朱雀仿宋、TeX Gyre Termes、Cochineal、鸿蒙 HarmonyOS Sans(各字体授权见 [`fonts/LICENSE`](fonts/LICENSE),来源与字符集见 [`fonts/README.md`](fonts/README.md))。
|
|
||||||
- **每个子目录自包含**:样式文件(`.sty` / `.cls`)、图片都在各目录内,编译时不需要额外的宏包搜索路径;只有字体是共享的上层目录。
|
### 各模板编译遍数
|
||||||
- **各目录的 `README.md`** 写明该模板的用法、可改参数、版式数据来源与书写注意事项,改之前先看。
|
|
||||||
- **示例内容全部虚构**:为了让人一眼看出排版效果,模板里填的是**一整套连贯的假想数据**(虚构教师「张远航」、虚构课程《数字逻辑》2025 秋、虚构的论文 / 专利 / 项目 / 获奖),不是满篇 `×`。这些内容**不含任何真人信息、不含真题**,纯粹是为了让版式跑起来有真实感,使用时整体替换成自己的内容即可。
|
| 模板 | 遍数 | 原因 |
|
||||||
- 跨模板虚构设定是统一的:教学日历、成绩构成说明、试卷归档封面、试卷都对应《数字逻辑》2025 秋学期;简历里的论文 / 专利 / 项目 / 获奖属于同一位虚构人物。
|
|---|---|---|
|
||||||
- 一眼可辨的假数据特征:DOI 统一 `10.9999/…`、专利号统一 `ZL209999…`、软著登记号 `2024SR99999…`、手机号 `138 0000 0000`、邮箱用 `example.net`。
|
| 表格类(会议预算表、劳务发放说明表、年度考核登记表、特殊事项说明表、成绩构成说明、试卷归档封面、试卷归档目录) | 1 | 无目录、无交叉引用 |
|
||||||
- 少数**必须留空让人手填**的位置(签字、日期、评语栏)仍然是空白或 `×`,这类不能编——编了就分不清哪儿该改了。
|
| `课程大纲`、`课程执行大纲`、`课程教学日历` | 2 | 有目录与交叉引用 |
|
||||||
|
| `试卷` | 2 | 有题号交叉引用 |
|
||||||
|
| `幻灯片` | 2 | Beamer 需要 |
|
||||||
|
| `教材`、`科技报告` | 4 | 有参考文献:`xelatex → bibtex → xelatex → xelatex` |
|
||||||
|
|
||||||
## 字体
|
## 字体
|
||||||
|
|
||||||
| 目录 | 字体 | 上游 | 授权 |
|
所有模板的字体都来自 `fonts/`,**不依赖操作系统装了什么字体**。
|
||||||
|---|---|---|---|
|
|
||||||
| `fonts/ouc-serif/` | OUC Serif(宋体) | 思源宋体 SC 的 GB2312 子集 | SIL OFL 1.1 |
|
|
||||||
| `fonts/ouc-sans/` | OUC Sans(黑体) | 思源黑体 SC 的 GB2312 子集 | SIL OFL 1.1 |
|
|
||||||
| `fonts/ouc-kai/` | OUC Kai(楷体) | 霞鹜文楷的 GB2312 子集 | SIL OFL 1.1 |
|
|
||||||
| `fonts/zhuque-fangsong/` | 朱雀仿宋(仿宋) | 朱雀仿宋 | SIL OFL 1.1 |
|
|
||||||
| `fonts/tex-gyre-termes/` | TeX Gyre Termes(西文,全库默认) | Times New Roman 度量兼容替代 | GUST Font License |
|
|
||||||
| `fonts/cochineal/` | Cochineal(西文,仅 `简历/` 用) | Minion 风格,Michael Sharpe | SIL OFL 1.1 |
|
|
||||||
| `fonts/harmonyos-sans/` | HarmonyOS Sans(幻灯片/科技报告) | 华为 | 华为官方允许免费商用 |
|
|
||||||
|
|
||||||
合计约 50 MB(改造前 141 MB,见 [`fonts/README.md`](fonts/README.md) 第五节)。
|
### 字体目录
|
||||||
|
|
||||||
> 子集字体已按 OFL §3 改名(`Source` / `LXGW` 是上游的 Reserved Font Name,裁剪即构成修改版),并保留了 OFL 声明。
|
```
|
||||||
> 用本模板编译出的文档**不受**这些字体授权约束,版权归作者本人。
|
fonts/
|
||||||
|
├── ouc-serif/ OUC Serif 中文宋体(正文)
|
||||||
|
├── ouc-sans/ OUC Sans 中文黑体(标题)
|
||||||
|
├── ouc-kai/ OUC Kai 中文楷体(代斜体)
|
||||||
|
├── zhuque-fangsong/ Zhuque Fangsong 中文仿宋
|
||||||
|
├── tex-gyre-termes/ TeX Gyre Termes 西文衬线(Times 等价)
|
||||||
|
├── cochineal/ Cochineal 西文衬线(Minion 风格)
|
||||||
|
├── harmonyos-sans/ HarmonyOS Sans 幻灯片、科技报告用
|
||||||
|
└── fontawesome/ Font Awesome 简历的图标符号
|
||||||
|
```
|
||||||
|
|
||||||
## 历史沿革
|
### 怎么引用字体
|
||||||
|
|
||||||
`幻灯片/` 与 `科技报告/` 此前分别维护在两个独立仓库(`ouc-slide-latex-template`、`ouc-report-latex-template`),2026-10 起**并入本仓库统一维护**,两个旧仓库不再更新。迁入时保留了原有目录结构、字体与图片资源,旧仓库的提交历史留在原仓库中。
|
两行固定写法,放在 `\documentclass` 之后、`\begin{document}` 之前:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\documentclass[UTF8,fontset=none]{ctexart}
|
||||||
|
\input{../fonts.tex}
|
||||||
|
\begin{document}
|
||||||
|
```
|
||||||
|
|
||||||
|
- `fontset=none` 必须写。不写的话 ctex 会先按系统字体配一套。
|
||||||
|
- `../fonts.tex` 是**相对模板目录**的路径,所以在模板目录内编译。
|
||||||
|
- 不要在仓库根直接 `xelatex 课程大纲/课程大纲.tex`,`../` 会指错。
|
||||||
|
|
||||||
|
`fonts.tex` 可以重复引用,多个 sty 各自引用不会冲突。
|
||||||
|
|
||||||
|
### 可用的字体命令
|
||||||
|
|
||||||
|
`\input{../fonts.tex}` 之后可以用这些命令随时切换字族:
|
||||||
|
|
||||||
|
| 命令 | 效果 | 实际字体 |
|
||||||
|
|---|---|---|
|
||||||
|
| `\songti` | 中文宋体 | OUC Serif |
|
||||||
|
| `\heiti` | 中文黑体 | OUC Sans |
|
||||||
|
| `\kaiti` | 中文楷体 | OUC Kai |
|
||||||
|
| `\fangsong` | 中文仿宋 | Zhuque Fangsong |
|
||||||
|
| `\tnr` | 西文衬线 | TeX Gyre Termes |
|
||||||
|
| `\tnrb` | 西文衬线粗体 | TeX Gyre Termes Bold |
|
||||||
|
| `\hm` | 鸿蒙黑体(中文) | HarmonyOS Sans SC |
|
||||||
|
| `\hmlatin` | 鸿蒙黑体(西文) | HarmonyOS Sans |
|
||||||
|
| `\oucUseCochineal` | 正文西文换成 Cochineal | Cochineal |
|
||||||
|
|
||||||
|
默认正文:中文 OUC Serif + 西文 TeX Gyre Termes。
|
||||||
|
|
||||||
|
用法示例:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
{\heiti 这段用黑体}
|
||||||
|
{\kaiti 这段用楷体}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 换正文西文字体
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\input{../fonts.tex}
|
||||||
|
\oucUseCochineal % 正文西文改为 Cochineal
|
||||||
|
```
|
||||||
|
|
||||||
|
只有 `简历/` 用这个,其余模板保持 Termes。
|
||||||
|
|
||||||
|
## 环境要求
|
||||||
|
|
||||||
|
- TeX Live 2022 或更新
|
||||||
|
- 编译引擎固定 **XeLaTeX**,不能用 pdfLaTeX 或 LuaLaTeX
|
||||||
|
- 不需要装 CTeX 套装,不需要系统装中文字体
|
||||||
|
|
||||||
|
## 新增模板
|
||||||
|
|
||||||
|
1. 建目录,放 `.tex` 主文件 + `.sty` 版式包
|
||||||
|
2. 导言区写 `\documentclass[UTF8,fontset=none]{ctexart}` + `\input{../fonts.tex}`
|
||||||
|
3. 编译确认 `bash build.sh 你的模板名`
|
||||||
|
4. 把模板加进 `verify_all.sh` 的 `TARGETS` 列表
|
||||||
|
5. 写 `README.md`,格式参考现有模板
|
||||||
|
|
||||||
|
## 约定
|
||||||
|
|
||||||
|
- 页面 A4,唯 `幻灯片/` 为 16:9
|
||||||
|
- 表格类模板正文 12pt,`教材/` 为 10pt
|
||||||
|
- 中文正文用宋体,标题用黑体
|
||||||
|
- 示例内容全部是虚构数据(虚构教师、虚构课程、统一用 `example.net` 邮箱与 `138 0000 0000` 手机号),替换成自己的内容即可
|
||||||
+79
-296
@@ -1,327 +1,110 @@
|
|||||||
# fonts/ —— 模板库公共字体目录
|
# fonts/ — 公共字体目录
|
||||||
|
|
||||||
本目录是**中国海洋大学 LaTeX 模板库唯一的一份字体来源**。仓库里十一个模板全部通过
|
全库共用的字体目录。16 个模板都通过根目录的 [`../fonts.tex`](../fonts.tex) 取字体,
|
||||||
根目录的 [`../fonts.tex`](../fonts.tex) 取字体,不再有任何模板自带字体、也不依赖
|
不依赖操作系统装了什么字体。
|
||||||
操作系统里装了什么字体。换一台机器、换一个操作系统(Windows / macOS / Linux /
|
|
||||||
Overleaf),编译出来的样子都一样。
|
## 目录内容
|
||||||
|
|
||||||
```
|
```
|
||||||
fonts/
|
fonts/
|
||||||
├── ouc-serif/ OUC Serif 宋体(衬线正文) 2 个,9.7 MB
|
├── ouc-serif/ OUC Serif 中文宋体(衬线正文) 2 个
|
||||||
├── ouc-sans/ OUC Sans 黑体(无衬线标题) 2 个,7.0 MB
|
├── ouc-sans/ OUC Sans 中文黑体(无衬线标题) 2 个
|
||||||
├── ouc-kai/ OUC Kai 楷体 2 个,7.0 MB
|
├── ouc-kai/ OUC Kai 中文楷体(代斜体) 2 个
|
||||||
├── zhuque-fangsong/ Zhuque Fangsong 仿宋 1 个,8.4 MB
|
├── zhuque-fangsong/ Zhuque Fangsong 中文仿宋 1 个
|
||||||
├── tex-gyre-termes/ TeX Gyre Termes 西文 Times 等价 4 个,550 KB
|
├── tex-gyre-termes/ TeX Gyre Termes 西文衬线(Times 等价) 4 个
|
||||||
├── cochineal/ Cochineal 西文 Minion 风格 4 个,920 KB
|
├── cochineal/ Cochineal 西文衬线(Minion 风格) 4 个
|
||||||
├── harmonyos-sans/ HarmonyOS Sans 鸿蒙(中英各一档) 6 个,16 MB
|
├── harmonyos-sans/ HarmonyOS Sans 幻灯片、科技报告用 6 个
|
||||||
└── fontawesome/ FontAwesome 简历模板的图标符号 1 个,130 KB
|
├── fontawesome/ Font Awesome 简历的图标符号 1 个
|
||||||
|
└── LICENSE 授权说明
|
||||||
```
|
```
|
||||||
|
|
||||||
合计约 **50 MB**(改造前是 141 MB:幻灯片 49 MB + 科技报告 92 MB 各自带一份,
|
## 各字体用途
|
||||||
外加两套重复的字体。现在全库只有这一份,省掉 65%)。
|
|
||||||
|
|
||||||
---
|
| 字体 | 用途 | 字重 | 字符集 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| OUC Serif | 中文正文(宋体) | 常规 + 粗体 | GB2312,7555 字 |
|
||||||
|
| OUC Sans | 中文标题(黑体)、西文无衬线 | 常规 + 粗体 | GB2312,7555 字 |
|
||||||
|
| OUC Kai | 中文楷体,代斜体 | 常规 + 粗体 | GB2312,7557 字 |
|
||||||
|
| Zhuque Fangsong | 中文仿宋 | 仅常规 | 12882 字,GB2312 全覆盖 |
|
||||||
|
| TeX Gyre Termes | 西文正文(Times 等价) | 常规 / 粗 / 斜 / 粗斜 | 完整拉丁 |
|
||||||
|
| Cochineal | 西文正文(Minion 风格) | 常规 / 粗 / 斜 / 粗斜 | 完整拉丁 |
|
||||||
|
| HarmonyOS Sans | 幻灯片、科技报告 | 中英各三档 | 完整 |
|
||||||
|
| Font Awesome | 简历图标符号 | — | 图标集 |
|
||||||
|
|
||||||
## 一、为什么要把字体打进仓库
|
## 怎么引用
|
||||||
|
|
||||||
原先七个模板是两种做法:
|
在模板的导言区写两行:
|
||||||
|
|
||||||
| 做法 | 模板 | 问题 |
|
|
||||||
|---|---|---|
|
|
||||||
| 各自带一份字体 | `幻灯片/`(鸿蒙 18 个文件 49 MB)、`科技报告/`(鸿蒙 + 方正 5 款 92 MB) | 两份重复;字体版本一旦不同步,两个模板的样子就会不一致 |
|
|
||||||
| 直接用系统字体 | 其余五个(SimSun / SimHei / FangSong / KaiTi / Times New Roman) | 换台机器(Linux、macOS、精简版 Windows、Overleaf)直接编不出来;而且这些字体**不允许随仓库分发** |
|
|
||||||
|
|
||||||
统一成一份公共字体后:
|
|
||||||
|
|
||||||
- **编译结果可复现** —— 与操作系统、与是否装过某款字体无关。
|
|
||||||
- **授权干净** —— 全库不含任何商业字体,见第四节。
|
|
||||||
- **体积可控** —— 只保留实际用到的字重与字符集。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 二、各字体的来源与授权
|
|
||||||
|
|
||||||
全部为**开源或官方允许免费商用**的字体。逐项如下。
|
|
||||||
|
|
||||||
### 1. OUC Serif / OUC Sans / OUC Kai —— 思源系列与霞鹜文楷的子集
|
|
||||||
|
|
||||||
| | 上游字体 | 上游作者 | 上游授权 | 字符集 |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| OUC Serif | 思源宋体 SC(Source Han Serif SC) | Adobe | SIL OFL 1.1 | GB2312,7555 字 |
|
|
||||||
| OUC Sans | 思源黑体 SC(Source Han Sans SC) | Adobe | SIL OFL 1.1 | GB2312,7555 字 |
|
|
||||||
| OUC Kai | 霞鹜文楷(LXGW WenKai) | LXGW | SIL OFL 1.1 | GB2312,7557 字 |
|
|
||||||
|
|
||||||
> **为什么改名叫 OUC Serif / OUC Sans / OUC Kai?**
|
|
||||||
> SIL OFL 1.1 第 3 条规定:修改版不得使用上游的 Reserved Font Name。
|
|
||||||
> 思源系列的 RFN 是 `Source`,霞鹜的 RFN 含 `LXGW`。裁剪字符集属于
|
|
||||||
> "修改版",因此必须改名,且不得暗示原作者为本仓库背书。
|
|
||||||
> 改名同时改了 **CFF 层**的 `fontNames` / `FamilyName` / `FullName`
|
|
||||||
> —— 只改 name 表是不够的,PDF 里内嵌的字体名取的是 CFF 层。
|
|
||||||
> 字体 name 表的 13/14 号记录保留了完整 OFL 声明与"本字体为子集、
|
|
||||||
> 与上游作者无关"的免责说明。
|
|
||||||
|
|
||||||
**裁剪范围**:保留 GB2312 全集(6763 汉字)+ 常用标点 + 拉丁字母 + 希腊字母
|
|
||||||
+ 数学符号,约 7555 个字符。**不保留** GBK 扩展区与生僻字。
|
|
||||||
|
|
||||||
> ⚠️ 如果将来正文要用 GB2312 之外的生僻字(例如某些人名、地名用字),
|
|
||||||
> 会显示成空白或方框。此时需要重新生成子集,把该字加进去。
|
|
||||||
> 生成脚本见第七节。
|
|
||||||
|
|
||||||
### 2. Zhuque Fangsong —— 朱雀仿宋
|
|
||||||
|
|
||||||
| | |
|
|
||||||
|---|---|
|
|
||||||
| 上游 | 朱雀仿宋(TrionesType / Zhuque Fangsong) |
|
|
||||||
| 授权 | SIL OFL 1.1 |
|
|
||||||
| 字符集 | 12882 字符,**GB2312 全集覆盖** |
|
|
||||||
| 版本 | 0.212(technical preview) |
|
|
||||||
|
|
||||||
未做裁剪(原文件 8.4 MB 已经够小,且保留全集更安全)。
|
|
||||||
**只有常规一档,没有粗体** —— 需要粗体的地方请改用黑体或宋体。
|
|
||||||
|
|
||||||
### 3. TeX Gyre Termes —— 西文 Times 等价字体
|
|
||||||
|
|
||||||
| | |
|
|
||||||
|---|---|
|
|
||||||
| 上游 | TeX Gyre Termes(GUST 字体项目) |
|
|
||||||
| 授权 | GUST Font License(GPL + 字体嵌入例外) |
|
|
||||||
| 特性 | 与 Times New Roman **逐字度量兼容** |
|
|
||||||
|
|
||||||
用它是为了保证中文模板里原有的西文断行、表格列宽、行内公式对齐不漂移。
|
|
||||||
实测同一段英文,Termes 与 Times New Roman 的逐词宽度差在 0.03pt 量级。
|
|
||||||
|
|
||||||
**全库默认西文字体就是 Termes**(`fonts.tex` 的 `\setmainfont`)。除简历外的
|
|
||||||
10 个模板都用它。
|
|
||||||
|
|
||||||
### 3b. Cochineal —— 西文 Minion 风格(简历专用)
|
|
||||||
|
|
||||||
| | |
|
|
||||||
|---|---|
|
|
||||||
| 上游 | Cochineal(Michael Sharpe,据 Minion 设计) |
|
|
||||||
| 授权 | SIL OFL 1.1,可随仓库分发(`cochineal/OFL.txt`) |
|
|
||||||
| 特性 | 笔画比 Times 饱满,与思源宋体灰度更接近 |
|
|
||||||
|
|
||||||
**为什么加这一款**:中文用思源宋体(中等粗细),Termes 是 Times 的度量兼容替代,
|
|
||||||
笔画偏细偏紧,中英混排时西文那一段视觉上会「陷进去」。Cochineal 笔画更饱满。
|
|
||||||
|
|
||||||
**为什么只有简历用**:它的宽度与 Termes 只差 **1.9%**(225.42 vs 229.68pt @10pt),
|
|
||||||
断行位置基本不动,所以换过去风险最小。其余候选宽 2.2%~10.8%,会把全库的表格列宽
|
|
||||||
和断行推着变(数据见 `字体` 一节末尾的对照表)。
|
|
||||||
|
|
||||||
⚠️ **不是全局生效**。`fonts.tex` 里只做了声明:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\oucUseCochineal % 调它才切;不调就还是 Termes
|
\documentclass[UTF8,fontset=none]{ctexart}
|
||||||
|
\input{../fonts.tex}
|
||||||
```
|
```
|
||||||
|
|
||||||
目前只有 `简历/awesome-source-cv.cls` 在 `\AtBeginDocument` 里调用。
|
- `fontset=none` 必须写。不写的话 ctex 会先按系统字体配一套。
|
||||||
|
- `../fonts.tex` 是**相对模板目录**的路径。所以要在模板目录内编译。
|
||||||
|
- 本文件可以重复 `\input`,多个 sty 各自引用不会冲突。
|
||||||
|
|
||||||
**度量对照**(10pt 下同一句英文的排印宽度,供将来换字体时参考):
|
## 可用的字体命令
|
||||||
|
|
||||||
| 字体 | 样句宽 | 相对 Termes | x 高 | cap 高 |
|
`\input{../fonts.tex}` 之后可用:
|
||||||
|---|---|---|---|---|
|
|
||||||
| Termes | 229.68pt | 100.0% | 0.450 | 0.662 |
|
|
||||||
| **Cochineal** | **225.42pt** | **98.1%** | 0.433 | 0.649 |
|
|
||||||
| Libertinus Serif | 234.62pt | 102.2% | 0.433 | 0.649 |
|
|
||||||
| XCharter | 246.69pt | 107.4% | 0.481 | 0.671 |
|
|
||||||
| TeX Gyre Pagella | 254.40pt | 110.8% | 0.472 | 0.695 |
|
|
||||||
|
|
||||||
### 4. HarmonyOS Sans —— 鸿蒙字体
|
| 命令 | 效果 | 实际字体 |
|
||||||
|
|---|---|---|
|
||||||
|
| `\songti` | 中文宋体 | OUC Serif |
|
||||||
|
| `\heiti` | 中文黑体 | OUC Sans |
|
||||||
|
| `\kaiti` | 中文楷体 | OUC Kai |
|
||||||
|
| `\fangsong` | 中文仿宋 | Zhuque Fangsong |
|
||||||
|
| `\tnr` | 西文衬线 | TeX Gyre Termes |
|
||||||
|
| `\tnrb` | 西文衬线粗体 | TeX Gyre Termes Bold |
|
||||||
|
| `\hm` | 鸿蒙黑体(中文) | HarmonyOS Sans SC |
|
||||||
|
| `\hmlatin` | 鸿蒙黑体(西文) | HarmonyOS Sans |
|
||||||
|
| `\oucUseCochineal` | 正文西文换成 Cochineal | Cochineal |
|
||||||
|
|
||||||
| | |
|
默认正文:中文 OUC Serif + 西文 TeX Gyre Termes。
|
||||||
|
|
||||||
|
另有两个独立字族,用于直接指定:
|
||||||
|
|
||||||
|
| 命令 | 实际字体 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 上游 | HarmonyOS Sans(华为) |
|
| `\OUCLatinCochineal` | Cochineal 常规 |
|
||||||
| 授权 | 华为官方声明允许**免费商用**(随 HarmonyOS 开发者文档发布) |
|
| `\OUCLatinCochinealBold` | Cochineal 粗体 |
|
||||||
| 保留原因 | `幻灯片/` 与 `科技报告/` 原有观感就是鸿蒙,换成思源会明显改变这两个模板的视觉 |
|
|
||||||
|
|
||||||
只保留实际用到的 6 个文件:`HarmonyOS_Sans_{Regular,Bold}`(西文)、
|
## 改默认字体
|
||||||
`HarmonyOS_Sans_{Regular,Bold}_Italic`、`HarmonyOS_Sans_SC_{Regular,Bold}`(中文)。
|
|
||||||
原目录里的 Black / Light / Medium / Thin 等 12 个字重全库无人引用,已删除。
|
|
||||||
|
|
||||||
> ⚠️ 鸿蒙字体的文件名用**下划线**分隔(`HarmonyOS_Sans_SC_Regular.ttf`),
|
改 `../fonts.tex` 里的 `\setCJKmainfont`(中文)和 `\setmainfont`(西文)。
|
||||||
> 不是 `族名-字重` 格式。所以在 fontspec 里不能写 `*-Regular` 通配,
|
|
||||||
> 必须显式给完整文件名。
|
|
||||||
|
|
||||||
### 5. FontAwesome —— 简历模板的图标符号
|
字体文件按 `Path = ../fonts/<目录>/` 定位,所以新增字体要放进对应的子目录。
|
||||||
|
|
||||||
| | |
|
## 授权
|
||||||
|
|
||||||
|
全部允许免费商用和再分发:
|
||||||
|
|
||||||
|
| 字体 | 授权 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 上游 | Font Awesome 4.x(原项目 Fonticons, Inc.) |
|
| OUC Serif / OUC Sans | SIL OFL 1.1 |
|
||||||
| 授权 | SIL OFL 1.1(字体本身)/ CC BY 4.0(图标设计) |
|
| OUC Kai | SIL OFL 1.1 |
|
||||||
| 保留原因 | `简历/` 模板的联系方式行用 `\smartphone` / `\email` / `\address` 等命令,每个前缀都要印一个图标 |
|
| Zhuque Fangsong | SIL OFL 1.1 |
|
||||||
| 版本 | 与 TeX Live 2022 内置的那份逐字节相同(md5 `9f6ff7d7cfd6f76d7a9c242bdd48c144`) |
|
| TeX Gyre Termes | GUST Font License |
|
||||||
|
| Cochineal | SIL OFL 1.1 |
|
||||||
|
| HarmonyOS Sans | 华为,官方允许免费商用 |
|
||||||
|
| Font Awesome | SIL OFL 1.1 |
|
||||||
|
|
||||||
只有 `FontAwesome.otf` 一个文件(130 KB)。TeX Live 里本来就带这份字体,之所以
|
不含商业字体,无方正、无 SimSun/SimHei/KaiTi/FangSong、无 Times New Roman。
|
||||||
还是拷进仓库,是为了守住「字体单一来源」这个约定 —— 否则 `简历/` 就成了唯一一个
|
|
||||||
字体来自 TeX Live 安装的模板,换一台没装 fontawesome 宏包用字体的机器就编不出来。
|
|
||||||
|
|
||||||
> ⚠️ 引用它的不是 `fonts.tex`,而是 `简历/fontawesome.sty` 里的
|
用本模板编译出的文档不受字体授权约束,版权归作者本人。
|
||||||
> `\newfontfamily{\FA}[Path=../fonts/fontawesome/,Extension=.otf]{FontAwesome}`。
|
|
||||||
> 原因:`\FA` 是在 `\RequirePackage{fontawesome}` 时就被定义好的(早于 `.cls`
|
|
||||||
> 后面所有语句),`awesome-source-cv.cls` 里再声明一次会报 `Font \FA already
|
|
||||||
> defined`;所以只能改 `fontawesome.sty` 本体。
|
|
||||||
|
|
||||||
---
|
## 字符集限制
|
||||||
|
|
||||||
## 三、字体是怎么被调用的
|
OUC Serif / Sans / Kai 只含 **GB2312** 字符(6763 汉字 + 常用标点 + 拉丁 + 希腊 + 数学符号)。
|
||||||
|
|
||||||
所有模板都只做一件事:在导言区 `\input{../fonts.tex}`(幻灯片与科技报告因为
|
超出 GB2312 的生僻字(部分人名、地名用字)会显示成空白或方框。
|
||||||
目录层级不同,路径略作调整)。`fonts.tex` 负责:
|
遇到这种情况,用 Zhuque Fangsong(12882 字,覆盖更广)或换用其他字体。
|
||||||
|
|
||||||
1. 加载 fontspec / xeCJK;
|
## 新增字体
|
||||||
2. 注册默认族与 `\songti` / `\heiti` / `\kaiti` / `\fangsong` / `\kaishu` /
|
|
||||||
`\tnr` / `\tnrb` / `\hm` / `\hmlatin`;
|
|
||||||
3. 把 `×` `—` `□` `○` `√` 等「长得像西文、其实该走中文」的符号
|
|
||||||
归入 CJK 字符类(详见该文件的注释);
|
|
||||||
4. 提供 `\ouclinespread` 行距工具。
|
|
||||||
|
|
||||||
各模板自己**不再写任何** `\setCJKmainfont` / `\setmainfont`。
|
1. 把字体文件放进 `fonts/新字体/`
|
||||||
|
2. 在 `../fonts.tex` 里加 `\newfontfamily` 或 `\setCJKfamilyfont`
|
||||||
|
3. 用 `Path = ../fonts/新字体/` 定位
|
||||||
|
|
||||||
### ⚠️ 三个容易踩的坑(都写在 fonts.tex 的注释里了)
|
多个档位(常规/粗体/斜体)在不同目录时,每个档位要单独写 `Path`
|
||||||
|
和 `Extension`,不能只靠主选项继承。
|
||||||
1. **必须保留 `fontset=none`。**
|
|
||||||
`\documentclass[UTF8,fontset=none]{ctexart}`。不写的话 ctex 会先按系统字体
|
|
||||||
配一套(Microsoft YaHei / SimSun / FangSong),再被覆盖,既浪费又有平台
|
|
||||||
依赖。`试卷/ouckey.sty` 因为继承 ctexart 默认 fontset,所以 fonts.tex 里
|
|
||||||
用 `\setCJKfamilyfont` + `\def` 而不是 `\newCJKfontfamily`——
|
|
||||||
后者是 LaTeX3 的 `\NewDocumentCommand`,命令已存在时会报
|
|
||||||
`! LaTeX3 Error: Control sequence \songti already defined.` 并中断编译。
|
|
||||||
|
|
||||||
2. **`Path=` 是相对编译时的工作目录,不是相对 .sty 文件。**
|
|
||||||
模板目录下 `xelatex xxx.tex`,所以写 `../fonts/...`。
|
|
||||||
幻灯片与科技报告的主题文件虽然在子目录里,路径仍按工作目录写 `../fonts/`。
|
|
||||||
|
|
||||||
3. **`Path=` 不能写宏。** 它是 fontspec 的参数,必须给字面字符串。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 四、授权合规自查
|
|
||||||
|
|
||||||
- [x] 全库不含方正、SimSun、SimHei、KaiTi、FangSong、Times New Roman、
|
|
||||||
Microsoft YaHei 等不可分发的商业字体。
|
|
||||||
- [x] 思源系列与霞鹜文楷的**子集**已改名,符合 OFL 1.1 §3(Reserved Font Name)。
|
|
||||||
- [x] 子集保留了 OFL 全文(name 表 13/14 号记录),符合 OFL 1.1 §1(随附授权)。
|
|
||||||
- [x] 改名后的 name 表写明"本字体为子集,与上游作者无关",未暗示背书。
|
|
||||||
- [x] TeX Gyre Termes 为 GUST Font License,允许随文档分发。
|
|
||||||
- [x] HarmonyOS Sans 为华为官方允许免费商用。
|
|
||||||
- [x] 本目录的 [LICENSE](LICENSE) 汇总了各字体的授权原文出处。
|
|
||||||
|
|
||||||
> **注意**:OFL 要求"以 OFL 字体排版产生的文档"不受 OFL 约束
|
|
||||||
> (§5 文档本身不因此被感染)。所以用本模板编译出来的论文、报告、
|
|
||||||
> 试卷,版权完全属于作者,不受这些字体授权的影响。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 五、体积
|
|
||||||
|
|
||||||
```
|
|
||||||
改造前(字体分散在各模板目录)
|
|
||||||
幻灯片/fonts/ 49 MB
|
|
||||||
科技报告/font/ 92 MB
|
|
||||||
合计 141 MB
|
|
||||||
|
|
||||||
改造后(统一到 fonts/)
|
|
||||||
ouc-serif 9.7 MB
|
|
||||||
ouc-sans 7.0 MB
|
|
||||||
ouc-kai 7.0 MB
|
|
||||||
zhuque-fangsong 8.4 MB
|
|
||||||
tex-gyre-termes 0.55 MB
|
|
||||||
cochineal 0.92 MB
|
|
||||||
harmonyos-sans 16.4 MB
|
|
||||||
合计 50 MB (省 65%)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 六、当前各模板的字体对应关系
|
|
||||||
|
|
||||||
| 模板 | 中文正文 | 中文标题/强调 | 西文 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `试卷归档封面/` | OUC Serif | OUC Sans | TeX Gyre Termes |
|
|
||||||
| `年度考核登记表/` | OUC Serif | OUC Sans | TeX Gyre Termes |
|
|
||||||
| `劳务发放说明表/` | OUC Serif | OUC Sans | TeX Gyre Termes |
|
|
||||||
| `课程执行大纲/` | OUC Serif | OUC Sans | TeX Gyre Termes |
|
|
||||||
| `试卷/` | OUC Serif / OUC Kai | OUC Sans | TeX Gyre Termes |
|
|
||||||
| `简历/` | OUC Serif / OUC Kai | OUC Serif Bold | **Cochineal** |
|
|
||||||
| `幻灯片/` | HarmonyOS Sans SC | HarmonyOS Sans SC Bold | HarmonyOS Sans |
|
|
||||||
| `科技报告/` | OUC Serif | OUC Serif Bold / OUC Kai | HarmonyOS Sans |
|
|
||||||
|
|
||||||
「改造前」用的是:SimSun / SimHei / KaiTi / FangSong / Times New Roman(前五个模板),
|
|
||||||
鸿蒙 + 方正书宋/小标宋/楷体/仿宋/中等线(科技报告)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 七、如何重新生成子集
|
|
||||||
|
|
||||||
如果需要把 GB2312 之外的字加进来,或上游字体发了新版:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 依赖:pip install fonttools
|
|
||||||
python -c "import fontTools; print(fontTools.version)"
|
|
||||||
|
|
||||||
# 1) 裁剪(name_IDs 必须给 '*',否则会丢掉 OFL 声明的 13/14 号记录)
|
|
||||||
python - <<'PY'
|
|
||||||
from fontTools import subset
|
|
||||||
opts = subset.Options()
|
|
||||||
opts.name_IDs = ['*'] # 关键:默认只取 0..6,会丢授权声明
|
|
||||||
opts.name_languages = ['*']
|
|
||||||
opts.notdef_outline = True
|
|
||||||
opts.recalc_bounds = True
|
|
||||||
opts.layout_features = ['*']
|
|
||||||
font = subset.load_font('上游字体.otf', opts)
|
|
||||||
subsetter = subset.Subsetter(options=opts)
|
|
||||||
subsetter.populate(text=open('keep_gb2312.txt', encoding='utf-8').read())
|
|
||||||
subsetter.subset(font)
|
|
||||||
subset.save_font(font, '裁剪后.otf', opts)
|
|
||||||
PY
|
|
||||||
|
|
||||||
# 2) 改 CFF 层名字(只改 name 表不够!PDF 内嵌名取的是 CFF 层)
|
|
||||||
python - <<'PY'
|
|
||||||
from fontTools.ttLib import TTFont
|
|
||||||
f = TTFont('裁剪后.otf')
|
|
||||||
cff = f['CFF '].cff
|
|
||||||
cff.fontNames[0] = 'OUCSerif-Regular'
|
|
||||||
td = cff.topDictIndex[0]
|
|
||||||
td.FamilyName = 'OUC Serif'
|
|
||||||
td.FullName = 'OUC Serif Regular'
|
|
||||||
# name 表同步改,并补 13/14 号授权记录与免责声明
|
|
||||||
f.save('OUCSerif-Regular.otf')
|
|
||||||
PY
|
|
||||||
```
|
|
||||||
|
|
||||||
改完务必验证 PDF 里内嵌的确实是新名字:
|
|
||||||
|
|
||||||
```python
|
|
||||||
import pymupdf
|
|
||||||
d = pymupdf.open('输出.pdf')
|
|
||||||
print({f[3] for p in d for f in p.get_fonts()})
|
|
||||||
# 期望看到 OUCSerif-Regular / OUCSans-Regular,而不是 SourceHanSerifSC
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 八、字体清单速查
|
|
||||||
|
|
||||||
| 文件 | 内部族名 | 字符数 | 大小 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `ouc-serif/OUCSerif-Regular.otf` | OUC Serif | 7555 | 4.6 MB |
|
|
||||||
| `ouc-serif/OUCSerif-Bold.otf` | OUC Serif | 7555 | 4.8 MB |
|
|
||||||
| `ouc-sans/OUCSans-Regular.otf` | OUC Sans | 7555 | 3.4 MB |
|
|
||||||
| `ouc-sans/OUCSans-Bold.otf` | OUC Sans | 7555 | 3.4 MB |
|
|
||||||
| `ouc-kai/OUCKai-Regular.ttf` | OUC Kai | 7557 | 3.4 MB |
|
|
||||||
| `ouc-kai/OUCKai-Bold.ttf` | OUC Kai | 7557 | 3.4 MB |
|
|
||||||
| `zhuque-fangsong/ZhuqueFangsong-Regular.ttf` | Zhuque Fangsong | 12882 | 8.4 MB |
|
|
||||||
| `tex-gyre-termes/texgyretermes-regular.otf` | TeX Gyre Termes | 1053 | 141 KB |
|
|
||||||
| `tex-gyre-termes/texgyretermes-bold.otf` | TeX Gyre Termes | 1053 | 139 KB |
|
|
||||||
| `tex-gyre-termes/texgyretermes-italic.otf` | TeX Gyre Termes | 1053 | 141 KB |
|
|
||||||
| `tex-gyre-termes/texgyretermes-bolditalic.otf` | TeX Gyre Termes | 1053 | 144 KB |
|
|
||||||
| `cochineal/Cochineal-Roman.otf` | Cochineal | 1237 | 227 KB |
|
|
||||||
| `cochineal/Cochineal-Bold.otf` | Cochineal | 1255 | 228 KB |
|
|
||||||
| `cochineal/Cochineal-Italic.otf` | Cochineal | 1186 | 228 KB |
|
|
||||||
| `cochineal/Cochineal-BoldItalic.otf` | Cochineal | 1198 | 219 KB |
|
|
||||||
| `harmonyos-sans/HarmonyOS_Sans_Regular.ttf` | HarmonyOS Sans | 874 | 147 KB |
|
|
||||||
| `harmonyos-sans/HarmonyOS_Sans_Bold.ttf` | HarmonyOS Sans | 874 | 146 KB |
|
|
||||||
| `harmonyos-sans/HarmonyOS_Sans_Regular_Italic.ttf` | HarmonyOS Sans | 807 | 141 KB |
|
|
||||||
| `harmonyos-sans/HarmonyOS_Sans_Bold_Italic.ttf` | HarmonyOS Sans | 807 | 141 KB |
|
|
||||||
| `harmonyos-sans/HarmonyOS_Sans_SC_Regular.ttf` | HarmonyOS Sans SC | 29063 | 8.3 MB |
|
|
||||||
| `harmonyos-sans/HarmonyOS_Sans_SC_Bold.ttf` | HarmonyOS Sans SC | 29063 | 8.2 MB |
|
|
||||||
+53
-160
@@ -1,198 +1,91 @@
|
|||||||
# 会议预算表
|
# 会议预算表
|
||||||
|
|
||||||
中国海洋大学会议预算表 LaTeX 模板(空表,可印刷手填)。
|
中国海洋大学会议经费预算表,A4 单页,空表可直接印刷手填。
|
||||||
|
|
||||||
## 来源
|
|
||||||
|
|
||||||
用户从微信收到的 `会议预算表.doc`(51712 字节,**OLE2 老式 .doc**,
|
|
||||||
`D0CF11E0` 签名,不是伪装成 .doc 的 docx)。
|
|
||||||
|
|
||||||
python-docx 读不了老格式,处理链路是:
|
|
||||||
|
|
||||||
```
|
|
||||||
.doc --(LibreOffice headless)--> .docx --(python-docx)--> 结构
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
soffice --headless --convert-to docx --outdir . 会议预算表.doc
|
|
||||||
```
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd 会议预算表
|
cd 会议预算表
|
||||||
xelatex 会议预算表.tex # 单次即可,无交叉引用
|
xelatex 会议预算表.tex
|
||||||
```
|
```
|
||||||
|
|
||||||
或仓库根:`bash build.sh 会议预算表`
|
或仓库根:`bash build.sh 会议预算表`
|
||||||
|
|
||||||
## 文件
|
## 文件
|
||||||
|
|
||||||
| 文件 | 作用 |
|
| 文件 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `oucmeeting.sty` | 版式包(页面、字体、表格环境 + 全部合并规则) |
|
| `会议预算表.tex` | 主文件,填内容改这里 |
|
||||||
| `会议预算表.tex` | 空表正文(只有内容,无任何 `\SetCell`) |
|
| `oucmeeting.sty` | 版式包,一般不改 |
|
||||||
| `README.md` | 本文件 |
|
|
||||||
|
|
||||||
## 版式参数(实测)
|
|
||||||
|
|
||||||
```
|
|
||||||
页面 A4 210 × 297 mm
|
|
||||||
边距 top 38.01 / bottom 35.01 / left 28.01 / right 26.00 mm
|
|
||||||
版心 155.99 × 223.98 mm
|
|
||||||
字号 标题 22pt,表格与说明 9pt
|
|
||||||
表格 28 行 × 7 列,边框 0.5pt,行高 5.6mm
|
|
||||||
```
|
|
||||||
|
|
||||||
四个边距都不常见,是原表为把 28 行塞进一页压出来的。照抄,不"优化"。
|
|
||||||
|
|
||||||
## 表格结构
|
## 表格结构
|
||||||
|
|
||||||
7 列基准网格,原 docx 的 `tblGrid` 是
|
28 行 × 7 列,分四段:
|
||||||
`[424, 2054, 790, 1262, 2056, 209, 2793]` twips = 169.12mm,
|
|
||||||
比分宽出版心 13.12mm(原文件靠 fixed 布局硬撑、压进页边距)。
|
|
||||||
|
|
||||||
→ 本模板等比缩到版心内,列宽
|
| 区段 | 行 | 内容 |
|
||||||
`[7.48, 36.23, 13.93, 22.26, 36.27, 3.69, 49.27] × 0.9224`。
|
|
||||||
|
|
||||||
28 行合并结构:
|
|
||||||
|
|
||||||
| 行 | 内容 | 跨度 |
|
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 1 | 会议名称 | 2+5 |
|
| 基本信息 | 1–6 | 会议名称、时间、地点、类型、参会人数、支出项目卡号、会议内容 |
|
||||||
| 2 | 会议时间 / 会议地点 | 2+2+2+1 |
|
| 收入预算 | 7–14 | 会务费收入、科研经费、财政拨款专项、学校预算经费、其他、合计 |
|
||||||
| 3 | 会议类型(三选一) | 2+5 |
|
| 支出预算 | 15–26 | 专家咨询费、交通费、住宿费、伙食费、其他费用(交通费/印刷费/会议室/补助/其他)、合计 |
|
||||||
| 4 | 参会人数 | 2+5 |
|
| 意见签字 | 27–28 | 经费负责人意见、所在单位负责人意见、签字盖章 |
|
||||||
| 5 | 会议支出项目卡号 | 2+5 |
|
|
||||||
| 6 | 会议内容 | 2+5 |
|
|
||||||
| 7 | **会议收入预算**(分节) | 跨 7 |
|
|
||||||
| 8 | 收入项目 / 经费卡号 / 金额 / 备注 | 2+2+2+1 |
|
|
||||||
| 9~13 | 会务费收入 / 科研经费 / 财政拨款专项 / 学校预算 / 其他 | 2+2+2+1 |
|
|
||||||
| 14 | 合计 | 2+2+2+1 |
|
|
||||||
| 15 | **会议支出预算**(分节) | 跨 7 |
|
|
||||||
| 16 | 支出项目 / 预算金额 / 实际支出 | 3+2+2 |
|
|
||||||
| 17~20 | 专家咨询费 / 城市间交通费 / 住宿费 / 伙食费 | 3+2+2 |
|
|
||||||
| 21~25 | **其他费用**(竖排)+ 交通费 / 印刷费 / 会议室 / 补助 / 其他 | 1+2+2+2 |
|
|
||||||
| 26 | 合计 | 3+2+2 |
|
|
||||||
| 27 | 意见栏(**独立签字表**,不在主表内) | 3+4 |
|
|
||||||
| 28 | 签字栏(同上) | 3+4 |
|
|
||||||
|
|
||||||
### ⚠️ 签字栏为什么是独立的表
|
## 填写方式
|
||||||
|
|
||||||
R27/R28(意见 + 签字)放在主表里**无论怎么写都会出问题**,四种组合全实测过:
|
这是**空表模板**,金额、卡号、日期、人名一律留空,打印后手填。
|
||||||
|
|
||||||
| 内容段数 | cell 声明 | 结果 |
|
要电子填写,在 `.tex` 正文里往对应位置补内容即可。比如会议名称:
|
||||||
|---|---|---|
|
|
||||||
| 8 段 | `cell{27}{4}={c=4}` | 右侧多一列(9 条竖线)❌ |
|
|
||||||
| 7 段 | `cell{27}{4}={c=4}` | 右侧多一列(9 条竖线)❌ |
|
|
||||||
| 2 段 | `cell{27}{4}={c=4}` | 列数对,但第 2 段被合并盖住,内容消失 ❌ |
|
|
||||||
| 2 段 | `cell{27}{2}={c=6}` | 网格散架(3 页、横线全无)❌ |
|
|
||||||
|
|
||||||
根因是 tabularray 2022A 对「跨整行大合并」处理不稳定,要求
|
|
||||||
「内容段数 / cell 起始列 / 跨度」三者严格自洽,在固定列宽 + colsep
|
|
||||||
的组合下很难同时满足。
|
|
||||||
|
|
||||||
⇒ 改成**物理隔离**:主表只到 R26「合计」(26 行),签字栏用独立的
|
|
||||||
`oucmeetsign` 环境紧贴下方。视觉上是同一张表(边框对接、列宽按主表
|
|
||||||
3:4 分界配平),排版上互不干扰。
|
|
||||||
|
|
||||||
签字表列宽算法(必须按主表实际竖线位置反推,不能自己估):
|
|
||||||
```
|
|
||||||
主表竖线 79.65 ~ 514.31 = 153.34mm,3:4 分界在 231.89 -> 距左 53.71mm
|
|
||||||
签字表 2 列:wd = 53.71-2 = 51.71mm / 153.34-53.71-2 = 97.63mm
|
|
||||||
```
|
|
||||||
|
|
||||||
## ⚠️ 三个必须知道的坑
|
|
||||||
|
|
||||||
### 1. 合并单元格必须用矩阵式语法,不能用 `\SetCell`
|
|
||||||
|
|
||||||
在本表的 7 列 `Q[c,m,wd=…]` + `colsep=1.0mm` 配置下,
|
|
||||||
一旦在单元格内容里写 `\SetCell[c=n]`,编译立刻报:
|
|
||||||
|
|
||||||
```
|
|
||||||
! Missing number, treated as zero.
|
|
||||||
! Illegal unit of measure (pt inserted.)
|
|
||||||
\__dim_eval_end:
|
|
||||||
```
|
|
||||||
|
|
||||||
**所有错误都定位到 `\end{tblr}`**,完全看不出是哪个格。最小复现:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\begin{tblr}{colspec={Q[c,m,wd=21mm] ...共7列..., colsep=0.8mm}}
|
会议名称 & 软件需求工程教学研讨会 & & & & & \\
|
||||||
\SetCell[c=2]{c} A & \SetCell[c=5]{l} B \\
|
|
||||||
\end{tblr} % 必崩
|
|
||||||
```
|
```
|
||||||
|
|
||||||
✅ 正确写法 —— 在 tblr 选项里用 `cell{行}{列}={c=n}{对齐}`:
|
### 页首信息
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\begin{tblr}{
|
\oucmeetattach{附件 1} % 左上角附件编号,不要则写 \oucmeetattach{}
|
||||||
colspec={...},
|
\oucmeettitle{中国海洋大学会议预算表} % 标题
|
||||||
cell{1}{1}={c=2}{c},
|
\oucmeetdateline{填表日期:... 金额单位:...} % 标题下方一行
|
||||||
cell{1}{3}={c=5}{l},
|
|
||||||
}
|
|
||||||
A & & B & & & & \\ % 被合并掉的格留空
|
|
||||||
\end{tblr}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
被合并掉的格**留空**(写 `& &`),不要写 `{}`。
|
### 表尾说明
|
||||||
|
|
||||||
好处:合并关系与内容彻底分离,改内容不会破坏结构。
|
```latex
|
||||||
|
\begin{oucmeetnotes}
|
||||||
### 2. `\SetCell[r=n]` 与 `\SetCell[c=m]` 不能在同一行
|
\oucmeetnote{1、}{说明内容}
|
||||||
|
\oucmeetnote{2、}{说明内容}
|
||||||
纵向合并和横向合并同时出现,报同样那串错。
|
\end{oucmeetnotes}
|
||||||
本表因此全部改用 `cell{}` 矩阵语法(含纵向合并 `cell{21}{1}={r=5}{c}`)。
|
|
||||||
|
|
||||||
「其他费用」用 `\shortstack{其\\[4bp]他\\[4bp]费\\[4bp]用}` 逐字竖排,
|
|
||||||
**不是** `\rotatebox{90}` 旋转——旋转只是把横排整句转个角度,
|
|
||||||
不是"上下排列"。
|
|
||||||
|
|
||||||
#### 字距必须卡准,否则字会贴格线
|
|
||||||
|
|
||||||
合并格高 81.9bp,四字的文字块高度随字距变化(实测数据):
|
|
||||||
|
|
||||||
| 字距 | 文字块高 | 上下留白 | 观感 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `\\[17bp]` | 94bp | 2.5bp | ❌ 比格还高,字和表格线连成一片 |
|
|
||||||
| `\\[8bp]` | 67bp | 7.4bp | ⚠️ 偏挤 |
|
|
||||||
| **`\\[4bp]`** | **56bp** | **13.4bp** | ✅ 采用 |
|
|
||||||
| 不加参数 | 43bp | 19bp | ⚠️ 字挤成一小团,看不出竖排 |
|
|
||||||
|
|
||||||
⚠️ 拉字距不能用局部 `\baselineskip`——`\shortstack` 内部会重置它,
|
|
||||||
实测设 19bp 完全无效(字距仍是 11.6bp)。必须在 `\\` 上给可选参数。
|
|
||||||
⚠️ 也不能用 `\parbox{}{其\\他\\费\\用}`——那会变成 4 个独立行盒子,
|
|
||||||
tabularray 排版错乱,四个字跑到不同段落。
|
|
||||||
|
|
||||||
### 3. colspec / hline / vline / ht 的参数不能用宏
|
|
||||||
|
|
||||||
tabularray 用自带的展开器解析这些选项,遇到用户宏直接报
|
|
||||||
`! Undefined control sequence.`。全部写字面值。
|
|
||||||
|
|
||||||
## 页高预算(重要)
|
|
||||||
|
|
||||||
28 行 × 行高 + 标题区 + 说明,必须 ≤ 223.98mm:
|
|
||||||
|
|
||||||
```
|
|
||||||
28 × 5.6mm = 156.8mm
|
|
||||||
标题区(附件1 + 22pt 标题 + 日期行)≈ 30mm
|
|
||||||
说明 3 条(其中第 2 条两行)≈ 35mm
|
|
||||||
合计 ≈ 222mm ✅ 刚好放进一页
|
|
||||||
```
|
```
|
||||||
|
|
||||||
⚠️ 行高 5.6mm 是**下限附近**。若把行高改回 6.0mm,28 行多出 11.2mm,
|
条目数可增减,「1、」「2、」写在第一个参数里。
|
||||||
第 3 条说明就会被挤到第 2 页。改行高前先算这笔账。
|
|
||||||
|
|
||||||
## 验证
|
## 表格内改内容
|
||||||
|
|
||||||
```
|
正文里每行对应表格一行,用 `&` 分列。**每行必须写满 7 段(6 个 `&`)**,
|
||||||
1 页 error 0 Overfull 0 Underfull 0
|
被合并掉的格子留空:
|
||||||
表格 155.52mm,版心 155.99mm → 在界内
|
|
||||||
内容 50 项逐项核对,全部存在
|
```latex
|
||||||
双端一致:WSL TeX Live 2025 / Windows TeX Live 2022
|
会议时间 & & & & 会议地点 & & \\
|
||||||
```
|
```
|
||||||
|
|
||||||
## 说明
|
合并关系在 `oucmeeting.sty` 的 `cell{行}{列}={c=跨度}{对齐}` 里声明。
|
||||||
|
改列宽或改结构时看那里。
|
||||||
|
|
||||||
这是**空表**。金额、卡号、日期、人名一律留空,供下载后手填或转 Word 填写。
|
### 「其他费用」竖排
|
||||||
不含任何真实数据。
|
|
||||||
|
四个字竖排、跨 5 行。字距在正文里控制:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\shortstack{其\\[4bp]他\\[4bp]费\\[4bp]用}
|
||||||
|
```
|
||||||
|
|
||||||
|
数值调大则字距拉开、字块变高。格高约 82bp,`4bp` 时上下各留 13bp。
|
||||||
|
|
||||||
|
## 版式
|
||||||
|
|
||||||
|
```
|
||||||
|
A4,边距 上 38.01 / 下 35.01 / 左 28.01 / 右 26.00 mm
|
||||||
|
正文 9pt,标题 22pt
|
||||||
|
表格 28 行 × 7 列,边框 0.5pt,行高 5.6mm
|
||||||
|
```
|
||||||
|
|
||||||
|
行高会影响总高度。5.6mm 时刚好一页;改到 6.0mm 会把表尾说明挤到第二页。
|
||||||
+60
-147
@@ -1,183 +1,96 @@
|
|||||||
# 劳务发放说明表 — 中国海洋大学 劳务发放说明表(LaTeX 版)
|
# 劳务发放说明表
|
||||||
|
|
||||||
把实验室用的《劳务发放说明表》Word 版复刻为 LaTeX 模板。版式与原 `.docx`
|
中国海洋大学劳务费发放说明表,A4 单页。
|
||||||
逐项对齐,**不含任何真人信息**:姓名、人数、项目名称、单位名称全部是编的。
|
|
||||||
|
|
||||||
## 文件
|
|
||||||
|
|
||||||
| 文件 | 说明 |
|
|
||||||
| :-- | :-- |
|
|
||||||
| `劳务发放说明表.tex` | 主文件。填表只改第 1 节(4 个变量) |
|
|
||||||
| `ouclw.sty` | 版式包。页面/字体/列宽/行高/全部尺寸写在这里,附换算注释 |
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
cd 劳务发放说明表
|
||||||
xelatex 劳务发放说明表.tex
|
xelatex 劳务发放说明表.tex
|
||||||
```
|
```
|
||||||
|
|
||||||
单页,跑一遍即可(无交叉引用)。
|
或仓库根:`bash build.sh 劳务发放说明表`
|
||||||
|
|
||||||
需要 **XeLaTeX**,并安装 `ctex`、`geometry`、`fontspec`、`xeCJK`、`tabularray`。
|
## 文件
|
||||||
实测环境:TeX Live 2022 + `tabularray 2022A`。
|
|
||||||
|
|
||||||
## 改内容
|
| 文件 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `劳务发放说明表.tex` | 主文件,填内容改这里 |
|
||||||
|
| `ouclw.sty` | 版式包,一般不改 |
|
||||||
|
|
||||||
|
## 填写参数
|
||||||
|
|
||||||
|
全部在 `\begin{document}` 之前定义:
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\lwunit}{{\songti 信息科学与工程学部}} % 用工单位(学部 / 学院)
|
\newcommand{\lwunit} {{\songti 信息科学与工程学部}} % 用工单位
|
||||||
\newcommand{\lwreason}{{\songti 科研项目数据整理}} % 用工事由
|
\newcommand{\lwreason}{{\songti 科研项目数据整理}} % 用工事由
|
||||||
\newcommand{\lwnote}{} % 备注(可留空)
|
\newcommand{\lwnote} {} % 备注,可留空
|
||||||
\newcommand{\lwwork}{%
|
\newcommand{\lwwork}{% % 用工说明正文
|
||||||
聘请{\songti 李承宇}等{\songti 2}位研究生参与《{\songti 近岸海域生态健康
|
聘请{\songti 李承宇}等{\songti 2}位研究生参与……}
|
||||||
多源数据融合与智能评估技术}》项目的研究工作。}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
上列值是**样张实际用的虚构内容**(人名校验过:`李承宇` 不对应任何真实人员)。
|
| 参数 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `\lwunit` | 用工单位(学部/学院) |
|
||||||
|
| `\lwreason` | 用工事由 |
|
||||||
|
| `\lwnote` | 备注,可留空 |
|
||||||
|
| `\lwwork` | 用工说明正文,即表格中「工作内容」一栏 |
|
||||||
|
|
||||||
### 关于 `\lwwork` 的句式
|
参数值里用 `{\songti ...}` 包裹是为了指定字体,可去掉。
|
||||||
|
|
||||||
原文是一句「聘请某研究生等 N 位参与某项目研究工作」的表述 ——
|
## 表格结构
|
||||||
真人姓名、人数、真实项目名均未保留,**句式一字未动**。
|
|
||||||
填表时把这三处换成实际内容即可:
|
|
||||||
|
|
||||||
| 样张值 | 含义 | 换成 |
|
| 行 | 内容 |
|
||||||
| :-- | :-- | :-- |
|
|---|---|
|
||||||
| `李承宇` | 第一位研究生的姓名 | 真实姓名("等"字后面若只有一人,可删"等 N 位") |
|
| R0 | 用工单位(盖章) + 单位名称 |
|
||||||
| `2`(位) | 研究生人数 | 实际人数 |
|
| R1–R3 | 用工事由 + 工作内容 + 备注 |
|
||||||
| 《`近岸海域…技术`》 | 项目全称 | 真实项目名 |
|
| R4 | 三处签字:批准单位负责人 / 用工单位负责人 / 经办人 |
|
||||||
|
|
||||||
> 不是满篇 `×` 的原因:这张表**正文只有一句话**,全打叉的话整页看着像没填完,
|
## 改表格内文字
|
||||||
> 也判断不出这句话在该行里排几行。填一句完整的话才知道行高要不要调。
|
|
||||||
|
|
||||||
## 版式数据来源
|
正文在 `\begin{lwtable}` 与 `\end{lwtable}` 之间。每行写满 4 个格子(3 个 `&`)
|
||||||
|
加结尾 `\\`。跨度已固定在 `ouclw.sty` 里,不用管。
|
||||||
|
|
||||||
全部尺寸从原 `.docx` 的 OOXML 里量出来,换算关系:
|
合并格里的文字**必须用 `\lwfit` 或 `\lwcell` 等定宽盒子包起来**:
|
||||||
|
|
||||||
- 长度:`mm = twips ÷ 1440 × 25.4`,`pt = twips ÷ 20`
|
|
||||||
- 字号:`w:sz` 是半磅值,`sz=28` ⇒ 14 pt
|
|
||||||
- 行距:`docGrid linePitch=312` twips ⇒ 15.6 pt
|
|
||||||
|
|
||||||
| 项目 | docx 原值 | 换算 |
|
|
||||||
| :-- | :-- | :-- |
|
|
||||||
| 纸张 | `pgSz 11906×16838` | A4 210×297 mm |
|
|
||||||
| 页边距(上下) | `pgMar top/bottom 1361` | 24.01 mm |
|
|
||||||
| 页边距(左右) | `pgMar left/right 1797` | 31.70 mm |
|
|
||||||
| 表宽 | `tblW 8522` | 150.32 mm |
|
|
||||||
| 列宽 c1..c4 | `1384, 1418, 2883, 2837` | 24.41 / 25.01 / 50.85 / 50.04 mm |
|
|
||||||
| 单元格内边距(左右) | `tblCellMar 108` | 1.905 mm |
|
|
||||||
| 边框 | `tblBorders sz=4` | 0.5 pt |
|
|
||||||
| 字号 | `w:sz 28` | 14 pt,宋体 |
|
|
||||||
| 行距 | `linePitch 312` | 15.6 pt |
|
|
||||||
|
|
||||||
各行行高由**段落数**决定(原表没有 `trHeight`),每段一个行距 15.6 pt:
|
|
||||||
|
|
||||||
| 行 | 段数 | 高度 |
|
|
||||||
| :-- | :-- | :-- |
|
|
||||||
| R0 用工单位 | 2(`用工单位` / `(公章)`) | 31.2 pt = 11.01 mm |
|
|
||||||
| R1 用工事由 | 1 | 15.6 pt = 5.50 mm |
|
|
||||||
| R2 具体工作 | 9(长句 + 8 空段) | 140.4 pt = 49.53 mm |
|
|
||||||
| R3 三方签字 | 4(标签 + 2 空段 + 日期) | 62.4 pt = 22.01 mm |
|
|
||||||
| R4 备注 | 2 | 31.2 pt = 11.01 mm |
|
|
||||||
| 合计 | | 280.8 pt = 99.06 mm |
|
|
||||||
|
|
||||||
### 为什么左右页边距不对称
|
|
||||||
|
|
||||||
原表宽 150.32 mm,比 docx 版心(146.68 mm)宽 3.71 mm,而 `tblPr` 里**没有
|
|
||||||
`jc`、`tblInd` 又是 0** —— Word 按左对齐处理:表从左边距 31.70 mm 起排,
|
|
||||||
右端溢进右侧页边距 3.71 mm。
|
|
||||||
|
|
||||||
所以本模板照实复现这个不对称:`left = 31.70mm`、`totalwidth = 150.32mm`,
|
|
||||||
右边界自然落到 `210 − 31.70 − 150.32 = 27.98 mm`。**不要**改成左右等边距
|
|
||||||
(那样表会整体左移 1.86 mm,与 Word 里看到的位置不符)。
|
|
||||||
|
|
||||||
## 四个必须知道的坑
|
|
||||||
|
|
||||||
### 1. ctex 的 `\linespread ≈ 1.3` 会吃掉你设的行距
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\fontsize{14}{15.6}\selectfont % \baselineskip = 20.28pt ✗
|
& \lwcellv{\lwunit\lwblank{1}}
|
||||||
\linespread{1}\relax\fontsize{14}{15.6}\selectfont % = 15.60pt ✓
|
& \lwcellv{\lwreason}
|
||||||
|
& \lwwork\lwblank{8}
|
||||||
```
|
```
|
||||||
|
|
||||||
`\fontsize` 第二个参数本该直接设定 `\baselineskip`,但 `\selectfont` 时会
|
不包的话,文字比跨列合计更宽时不会折行,会把整表撑出版心。
|
||||||
**再乘一次 `\linespread`**。ctex 默认 `\linespread ≈ 1.3`,于是 15.6 pt 被放大
|
|
||||||
成 20.28 pt,五行表从 99 mm 涨到 129 mm,`ht=` 也压不住(内容本身就那么高,
|
|
||||||
tabularray 只能被动撑开)。
|
|
||||||
|
|
||||||
本包的对策是 `\lwbodyfont`:
|
### 常用盒子命令
|
||||||
|
|
||||||
|
| 命令 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| `\lwcell{文字}` | 定宽盒子,自动折行 |
|
||||||
|
| `\lwcellv{文字}` | 同上,垂直居中 |
|
||||||
|
| `\lwfit{跨度}{文字}` | 按指定跨度定宽 |
|
||||||
|
| `\lwblank{n}` | 插入 n 个空行位(撑高度) |
|
||||||
|
| `\lwstack{...}` | 多行堆叠 |
|
||||||
|
| `\lwsign{跨度}{标签}` | 签字栏 |
|
||||||
|
| `\lwspanA`…`\lwspanD` | 各格的跨度宽度常量 |
|
||||||
|
|
||||||
|
### 签字栏
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\lwbodyfont}{\linespread{1}\relax\fontsize{14}{15.6}\selectfont}
|
\lwsign{\lwspanA}{批准单位负责人签字}
|
||||||
\AtBeginDocument{\lwbodyfont}
|
& & \lwsign{\lwwc}{用工单位负责人签字}
|
||||||
|
& \lwsign{\lwwd}{经办人签字} \\
|
||||||
```
|
```
|
||||||
|
|
||||||
`\AtBeginDocument` 那一次不能省——ctex 在 begin document 时会重设 `\linespread`。
|
跨度常量 `\lwwa`–`\lwwd` 与 `\lwspanA`–`\lwspanD` 对应各列。
|
||||||
|
|
||||||
### 2. 合并格 `{c}` 是不折行的 LR 模式
|
## 版式
|
||||||
|
|
||||||
`cell{r}{c}={c=n}{c}` 的 `{c}` 是 **LR 模式**,不是段落模式:
|
|
||||||
|
|
||||||
- 格内文字比所跨各列合计更宽时,它**不折行**,而是把列撑宽、整表超出版心;
|
|
||||||
- 合并格里的 `\hsize` **没有**被重设成该跨度宽度,仍是外层版心宽,
|
|
||||||
长文本会按版心折行、冲出格子。
|
|
||||||
|
|
||||||
⇒ 合并格里的文字一律包定宽 `\parbox`,本表提供 `\lwcell` / `\lwcellv` /
|
|
||||||
`\lwstack` / `\lwsign` 四个入口,`.tex` 里只要有内容就用它们,别裸写。
|
|
||||||
|
|
||||||
### 3. 合并格的“内容可用宽”要补回 `2·colsep·(n−1)`
|
|
||||||
|
|
||||||
单列的内容宽 = `wd`(左右两半 `colsep` 已被 colspec 扣掉);
|
|
||||||
但跨 n 列合并后,**n 列之间的 (n−1) 组内边距会被回收进内容宽**:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
内容可用宽 = Σ 所跨各列 wd + 2 · colsep · (n − 1)
|
A4,单页
|
||||||
|
正文宋体,表格内文字用 \songti 显式指定
|
||||||
```
|
```
|
||||||
|
|
||||||
漏算的后果很隐蔽:`\parbox` 比真实格宽窄,短文本看不出问题,长文本会
|
## 注意
|
||||||
**提前折行**。本表「批准单位负责人签字」共 9 字 × 14 pt = 44.45 mm,
|
|
||||||
而 c1+c2 只有 41.37 mm,就曾被折成「批准单位负责人签」+「字」两行,
|
|
||||||
docx 里明明是一行。正确值是 `41.3653 + 2×1.905 = 45.1753mm`。
|
|
||||||
|
|
||||||
### 4. `\parbox[t]` 会让行高超目标
|
示例内容为虚构数据,使用时整段替换。
|
||||||
|
|
||||||
tabularray 给每个单元格垫了 strut,`[t]` 生成的盒子顶部与 strut 顶部相加,
|
|
||||||
实测每行白白多出 **3.6 pt**(R0 从 31.67 → 35.26)。
|
|
||||||
|
|
||||||
原表 R0C1 / R2C1 之所以“贴顶”,不是靠 `vAlign=top`(它们其实没写 `vAlign`),
|
|
||||||
而是靠**段落数把行高填满**(2 段 = 31.2 pt、9 段 = 140.4 pt,正好等于行高)。
|
|
||||||
内容高度已等于行高时,`[c]` 居中的结果就等同于贴顶。
|
|
||||||
|
|
||||||
⇒ `.tex` 里用 `\lwcellv{内容\lwblank{n}}` 补足段落数,`\parbox` 保持 `[c]`。
|
|
||||||
|
|
||||||
## 与 docx 的已知差异
|
|
||||||
|
|
||||||
| 项 | docx | 本模板 | 说明 |
|
|
||||||
| :-- | :-- | :-- | :-- |
|
|
||||||
| 表宽 | 150.319 mm | 150.137 mm | 差 0.18 mm。tabularray 计宽按 n−1 根竖线、画宽按 n 根,系统性差 0.5 pt,为消除 Overfull 微调了列宽 |
|
|
||||||
| 行高 | 11.01 / 5.50 / 49.53 / 22.01 / 11.01 mm | 每行 +0.15 mm | 同上,竖线计入行高 |
|
|
||||||
| 字体 | 宋体 | OUC Serif(思源宋体子集) | 原用系统 SimSun。现改为仓库公共字体包 `../fonts/`,换机器/换系统都能编,且允许分发 |
|
|
||||||
| 标题 | 宋体 14 pt **加粗** | 同 | 字号与正文相同,只靠加粗区分 |
|
|
||||||
|
|
||||||
## 校验方法
|
|
||||||
|
|
||||||
不用肉眼看 PDF,直接量矢量:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pdftocairo -svg 劳务发放说明表.pdf out.svg # 取线条精确坐标
|
|
||||||
pdftotext -bbox 劳务发放说明表.pdf out.xml # 取每个字块的坐标
|
|
||||||
```
|
|
||||||
|
|
||||||
SVG 里解析 `<path d="M x y L x y" transform="matrix(...)"/>`,按
|
|
||||||
「`|Δy|<0.9` 且 `|Δx|>10` = 横线」「`|Δx|<0.9` 且 `|Δy|>2` = 竖线」分类去重,
|
|
||||||
即可得到每条线的精确端点。本模板的实测结果:
|
|
||||||
|
|
||||||
```
|
|
||||||
表宽 150.137 mm (目标 150.319,差 −0.18)
|
|
||||||
表左 31.662 mm (目标 31.700,差 −0.04)
|
|
||||||
表右 181.799 mm (目标 182.019,差 −0.22)
|
|
||||||
R0 11.172 / R1 5.668 / R2 49.646 / R3 22.159 / R4 11.172 mm 全部达标
|
|
||||||
```
|
|
||||||
|
|
||||||
三个签字格的标签基线完全重合(`rel-top 1.06 pt`),日期行也完全重合
|
|
||||||
(`rel-top 47.69 pt`)——这一条是特意做的:合并格与普通列的垂直居中算法
|
|
||||||
不同,若不统一包 `\parbox`,第一格会比另两格低 1.55 pt。
|
|
||||||
+80
-151
@@ -1,189 +1,118 @@
|
|||||||
# 年度考核登记表 — 中国海洋大学 教职工年度考核登记表(LaTeX 版)
|
# 年度考核登记表
|
||||||
|
|
||||||
把学校下发的 Word 版《中国海洋大学教职工年度考核登记表》复刻为 LaTeX 模板,
|
中国海洋大学教职工年度考核登记表,A4 单页。
|
||||||
版式与原 `.docx` 逐项对齐,**表格里不含任何真人信息**(姓名/职工号/出生年月/
|
|
||||||
单位/岗位全部是编的)。
|
|
||||||
|
|
||||||
> 样张填的是一份**完整的虚构考核表**:张远航(1985.03,信息科学与工程学部
|
|
||||||
> 计算机科学与技术学院,教授三级,中共党员),2025 年度,年度总结写了
|
|
||||||
> 思政 / 教学(176 学时)/ 科研(到账 320 万元)/ 人才培养四段。
|
|
||||||
> 之所以不写成满篇 `×`,是因为这张表**表格密、字数多**,光看叉号判断不出
|
|
||||||
> 行高会不会被内容撑开。虚构内容能直接看出「写这么多字正好排满 2 页」。
|
|
||||||
|
|
||||||
## 文件
|
|
||||||
|
|
||||||
| 文件 | 说明 |
|
|
||||||
| :-- | :-- |
|
|
||||||
| `年度考核登记表.tex` | 主文件。填表只改第 1 节(基本信息)与 `\khsummary`(年度总结) |
|
|
||||||
| `ouckhtb.sty` | 版式包。页面/字体/列宽/行高/全部尺寸都写在这里,附换算注释 |
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
cd 年度考核登记表
|
||||||
xelatex 年度考核登记表.tex
|
xelatex 年度考核登记表.tex
|
||||||
xelatex 年度考核登记表.tex # 跑两遍,第二遍取到正确页码
|
|
||||||
```
|
```
|
||||||
|
|
||||||
需要 **XeLaTeX**(用 fontspec + xeCJK),并安装:
|
或仓库根:`bash build.sh 年度考核登记表`
|
||||||
`ctex`、`geometry`、`fontspec`、`xeCJK`、`tabularray`。
|
|
||||||
|
|
||||||
字体不需要安装 —— 全部来自仓库公共字体包 `../fonts/`(由 `../fonts.tex` 加载),
|
## 文件
|
||||||
详见 [`../fonts/README.md`](../fonts/README.md)。**不再依赖系统里的宋体/黑体/仿宋**。
|
|
||||||
|
|
||||||
实测环境:TeX Live 2022 + `tabularray 2022A`。用 LuaLaTeX 理论上也行,但未验证。
|
| 文件 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `年度考核登记表.tex` | 主文件,填内容改这里 |
|
||||||
|
| `ouckhtb.sty` | 版式包,一般不改 |
|
||||||
|
|
||||||
产出 2 页、A4、正反面打印正好。
|
## 填写参数
|
||||||
|
|
||||||
## 改内容
|
全部在 `\begin{document}` 之前定义:
|
||||||
|
|
||||||
### 基本信息
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\khtbyear{2025} % 表头“2025 年度”那一行
|
\khtbyear{2025} % 考核年度,显示为表外标题的一部分
|
||||||
|
|
||||||
\newcommand{\khnum}{0000000} % 职工号
|
\newcommand{\khnum} {0000000} % 职工号
|
||||||
\newcommand{\khname}{{\fangsong 张远航}} % 姓名
|
\newcommand{\khname} {{\fangsong 张远航}} % 姓名
|
||||||
\newcommand{\khsex}{{\fangsong 男}} % 性别
|
\newcommand{\khsex} {{\fangsong 男}} % 性别
|
||||||
\newcommand{\khbirth}{{\fangsong 1985.03}} % 出生年月
|
\newcommand{\khbirth} {{\fangsong 1985.03}} % 出生年月
|
||||||
\newcommand{\khdept}{{\fangsong 信息科学与工程学部}} % 单位(学部 / 学院)
|
\newcommand{\khdept} {{\fangsong 信息科学与工程学部}} % 单位
|
||||||
\newcommand{\khsubdept}{{\fangsong 计算机科学与技术学院}} % 系(研究所、实验室、科室)
|
\newcommand{\khsubdept} {{\fangsong 计算机科学与技术学院}} % 系/研究所/科室
|
||||||
\newcommand{\khparty}{{\fangsong 中共党员}} % 政治面貌
|
\newcommand{\khparty} {{\fangsong 中共党员}} % 政治面貌
|
||||||
\newcommand{\khtitle}{{\fangsong 教授}} % 现专业技术职务
|
\newcommand{\khtitle} {{\fangsong 教授}} % 现专业技术职务
|
||||||
\newcommand{\khpost}{{\fangsong 教授三级}} % 所聘岗位
|
\newcommand{\khpost} {{\fangsong 教授三级}} % 所聘岗位
|
||||||
```
|
```
|
||||||
|
|
||||||
> 上列值是**样张实际用的虚构内容**。职工号 `0000000` 故意留着没编 ——
|
| 参数 | 说明 |
|
||||||
> 职工号位数各校各单位不等,编一个反而会误导「照这个位数填」。
|
|---|---|
|
||||||
>
|
| `\khtbyear{年}` | 考核年度 |
|
||||||
> ⚠️ 「出生年月」的**标签**不是写在 `\khbirth` 里,而是单独的
|
| `\khnum` | 职工号 |
|
||||||
> `\khbirthlabel`(默认 `出生\par 年月`,折两行)。原因见下文第 0 条:
|
| `\khname` | 姓名 |
|
||||||
> 那一格只有 15.31mm,放不下 4 个 14pt 的字(要 19.68mm)。
|
| `\khsex` | 性别 |
|
||||||
> 想让标签恢复成一行「出生年月」,值就会重新被挤掉。
|
| `\khbirth` | 出生年月 |
|
||||||
|
| `\khdept` | 单位(学部/学院) |
|
||||||
|
| `\khsubdept` | 系、研究所、实验室、科室 |
|
||||||
|
| `\khparty` | 政治面貌 |
|
||||||
|
| `\khtitle` | 现专业技术职务 |
|
||||||
|
| `\khpost` | 所聘岗位 |
|
||||||
|
|
||||||
> **`{\fangsong ...}` 不能去掉。** 占位符 `×` 是 U+00D7,xeCJK 默认按 Unicode
|
参数值里的 `{\fangsong ...}` 是指定字体,可去掉换成其他字族。
|
||||||
> 区段把它判成**西文**,交给 fontspec 的西文字体(Termes/Times),而那儿的
|
|
||||||
> `×` 宽度与汉字不一致,几个就能撑破整列。
|
|
||||||
>
|
|
||||||
> **更好的做法**:`../fonts.tex` 里已经全局加了
|
|
||||||
> `\xeCJKDeclareCharClass{CJK}{"00D7}`,把 `×` 归入 CJK 字符类 ——
|
|
||||||
> 于是它自动按汉字全角宽度排,**不必再包 `\fangsong` 也不会撑破**。
|
|
||||||
> 这是本次字体改造顺带修掉的老 bug(原注释的修法从未真正生效过)。
|
|
||||||
|
|
||||||
### 年度总结
|
## 年度总结正文
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\khsummary}{%
|
\newcommand{\khsummary}{%
|
||||||
第一段……\par
|
第一段内容。\par
|
||||||
第二段……\par
|
第二段内容。\par
|
||||||
第三段……}
|
第三段内容。}
|
||||||
```
|
```
|
||||||
|
|
||||||
段间用 `\par`(不要用空行 —— 空行在 `\newcommand` 参数里会被当成分段但不易数)。
|
多段之间用 `\par` 分隔,不要留空行。
|
||||||
首行自动缩进 2 字,末行自动带「本人签名 / 年 月 日」,都写在 `ouckhtb.sty` 里。
|
|
||||||
|
|
||||||
## 版式数据来源
|
## 表格结构
|
||||||
|
|
||||||
所有尺寸都从 `.docx` 内部的 OOXML 数值换算,不使用目测:
|
| 区段 | 内容 |
|
||||||
|
|---|---|
|
||||||
|
| 表头 | 职工号、姓名、性别、出生年月 |
|
||||||
|
| 基本信息 | 单位、系、政治面貌、职务、岗位 |
|
||||||
|
| 年度总结 | `\khsummary` 的长文本格,竖排标题 |
|
||||||
|
| 考核结果 | 三级选择与签字 |
|
||||||
|
| 签名栏 | 本人签字、单位意见、学校意见 |
|
||||||
|
|
||||||
```
|
## 改表格内文字
|
||||||
twips → mm : mm = twips / 1440 × 25.4
|
|
||||||
twips → pt : pt = twips / 20 (1 pt = 1/72 in)
|
正文在表格环境内,每行用 `&` 分列。合并格里的文字**必须用 `\khtbfit`
|
||||||
w:sz : 半磅值,÷ 2 即 pt
|
包起来**,指定跨度宽度:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\SetCell[c=2]{c} \khtbfit{\khtbspanA}{单\hspace{1em}位} & &
|
||||||
|
\SetCell[c=3]{c} \khtbfit{\khtbspanB}{\khdept} & & &
|
||||||
```
|
```
|
||||||
|
|
||||||
| 项 | docx 值 | LaTeX 值 |
|
不包的话文字不会折行,会把表格撑出版心。
|
||||||
| :-- | :-- | :-- |
|
|
||||||
| 纸张 | 11907 × 16840 twips | A4(210 × 297 mm) |
|
|
||||||
| 表宽 `tblW` | 8976 twips | 158.33 mm(11 列 + 边框) |
|
|
||||||
| 11 个 `gridCol` | 1087 283 1221 1047 284 1105 952 600 870 80 1447 | 见 `ouckhtb.sty` 第 3.1 节 |
|
|
||||||
| 正文字号 | `w:sz=28` | 仿宋 14 pt / 行距 15.6 pt |
|
|
||||||
| 大标题 | `w:sz=44`,`w:spacing=-14` | 黑体 22 pt / 字距 −0.7 pt |
|
|
||||||
| 行高 `trHeight` | 412 460 939 1261 1252 1009 556 1258 1258 | 7.27 / 8.11 / 16.56 / 22.24 / 22.08 / 17.80 / 9.81 / 22.19 / 22.19 mm |
|
|
||||||
|
|
||||||
### 页边距为什么不照抄 docx
|
### 跨度常量
|
||||||
|
|
||||||
docx 是左右各 30 mm 版心(150 mm),但表宽 158.33 mm 比它还宽 8.33 mm,
|
| 常量 | 对应列 |
|
||||||
Word 是靠 `tblPr/jc=center` 把这张表“压”进页边距里的。
|
|---|---|
|
||||||
|
| `\khtbspanA` … `\khtbspanH` | 各格的跨度宽度 |
|
||||||
|
| `\khtbwa` … `\khtbwk` | 各列宽度 |
|
||||||
|
|
||||||
本模板把页边距改成 `(210 − 158.33)/2 = 25.835 mm`,使 `\textwidth` 恰好等于表宽:
|
### 其他常用命令
|
||||||
|
|
||||||
- 表格天然居中,不需要 `\leftskip` / `\centerline` 之类的偏移;
|
| 命令 | 用途 |
|
||||||
- **表格在纸面上的绝对位置与 Word 完全一致**(左右各 25.835 mm);
|
|---|---|
|
||||||
- 编译时不会刷 `Overfull \hbox`。
|
| `\khtbtitle` | 印表外标题(含年度) |
|
||||||
|
| `\khtbcell{文字}` | 定宽盒子 |
|
||||||
|
| `\khtbvert{标题}` | 竖排格标题(用于年度总结格) |
|
||||||
|
| `\khtbunderline{n}` | 下划线空行 |
|
||||||
|
| `\khtbchoices` | 考核结果的三级选项 |
|
||||||
|
| `\khtbseal` | 盖章位 |
|
||||||
|
| `\khtbsign` | 签字位 |
|
||||||
|
| `\khtbsummarysign` | 年度总结格下方的签字 |
|
||||||
|
| `\khtbstack{...}` | 多行堆叠 |
|
||||||
|
| `\khtbxi` | 系/研究所一栏的值 |
|
||||||
|
|
||||||
表外文字(标题、脚注)仍是水平居中,视觉上与 30 mm 版心没有差别。
|
## 版式
|
||||||
|
|
||||||
## 排版时的坑(sty 里都有详细注释)
|
```
|
||||||
|
A4,单页
|
||||||
0. 🔴 **表头 `cell{r}{c}={c=n}` 会静默丢内容 —— 已全部改成行内 `\SetCell`。**
|
表格行高按原表设定,年度总结格为高行
|
||||||
这是本模板最难查的一个 bug:某个格子的值**整格不显示**,日志零 error 零
|
|
||||||
warning,光看日志和 PDF 页码完全发现不了。
|
|
||||||
|
|
||||||
- 现象:「出生年月」的值一直是空白。用 `××××.××` 占位时也是空白,
|
|
||||||
所以原版一直没人发现;换成真实内容才暴露。
|
|
||||||
- 根因:`cell{r}{c}` 里那个 `c` 是**数据行的单元序号**,不是视觉列号。
|
|
||||||
表头那三处 `c=2` 加起来要求该行吃掉 15 个视觉列,而表只有 11 列,
|
|
||||||
超出部分被静默丢弃 —— 丢的正好是最后一个值。
|
|
||||||
- 迷惑点:同一行写 12 格 → 丢值;写 10 格 / 9 格 → **反而显示**
|
|
||||||
(空缺给了它余量)。所以「格子数对不对」在这里完全不能当判断依据。
|
|
||||||
- 正解:表头不写 `cell{}`,合并直接标在被合并的那格上:
|
|
||||||
`\SetCell[c=2]{c} 职工号 & & 0000000 & ...`,每行照常写满 11 格。
|
|
||||||
- 附带修的:这个表 R0 行本来就装不下 —— 前六个字段已占 115.76mm,
|
|
||||||
剩 42.20mm 要装「出生年月」标签(19.68mm)+ 值(17.22mm),
|
|
||||||
但列宽被 `c9=15.31 / c10=1.38 / c11=25.51` 切死,标签占不住 c9
|
|
||||||
只能整体右移,值就被挤出去。处理是把标签折成两行「出生 / 年月」
|
|
||||||
(每行 9.84mm 放得下),值回到 c10-c11。**列宽一个都没改。**
|
|
||||||
|
|
||||||
1. **合并单元格不折行。** 合并格的单元类型 `{c}` 是 LR 模式,
|
|
||||||
格子里的文字比所跨各列合计更宽时,它**不折行,而是把列撑宽、整表超出版心**。
|
|
||||||
实测「系(研究所、实验室、科室)」把表从 448 pt 撑到 559 pt。
|
|
||||||
→ 所以合并格里的文字一律包 `\khtbfit{跨度宽宏}{文字}`。
|
|
||||||
单列的 `Q[c,m,wd=…]` 没有这个问题(超了只是溢出,列宽不变)。
|
|
||||||
|
|
||||||
2. **合并格里的 `\hsize` 没被重设。** span=10 的格子里 `\hsize` 仍是整页版心宽,
|
|
||||||
长文本会按 450 pt 折行、冲出格子。→ 长内容必须用定宽 `\parbox`(`\khtbcell`)。
|
|
||||||
|
|
||||||
3. **跨度声明写法:`cell{r}{c}={c=n}{c}` 与行内 `\SetCell[c=n]{c}` 都要用
|
|
||||||
`{c=n}{c}` 这一种。** `={c=n}`、`={n}{c}`、`={span=n}{c}` 都不认,最后那个
|
|
||||||
会报 `The key 'tblr-cell-span/span' is unknown`。
|
|
||||||
⚠️ 但如第 0 条所述,**跨列请优先用行内 `\SetCell`**,表头 `cell{}` 有丢内容的风险。
|
|
||||||
|
|
||||||
4. **`colspec` / `row{}` 里不能放宏。** tabularray 在宏展开之外解析列类型,
|
|
||||||
会报 `Unexpandable command … inside column type`。所以列宽只能字面写死。
|
|
||||||
|
|
||||||
另外两个容易忘的:
|
|
||||||
|
|
||||||
- `longtblr` 默认会把各列按 `\textwidth` 等比拉伸(`tblr` 不会),必须写 `stretch=0`;
|
|
||||||
- `longtblr` 会在续页处印「表 0: (Continued)」,必须用 `\DefTblrTemplate` 把
|
|
||||||
`caption` / `capcont` / `conthead-text` / `contfoot-text` **四个模板全清**。
|
|
||||||
|
|
||||||
## 与原 docx 的已知差异
|
|
||||||
|
|
||||||
| 位置 | docx | 本模板 | 说明 |
|
|
||||||
| :-- | :-- | :-- | :-- |
|
|
||||||
| 表头「×××× 年度」 | `firstLine` 缩进 2 字、未设居中 | 居中 | 更像原排版疏漏,按意图改居中。想还原就把 `\khtbtitle` 里的 `\centering` 换成 `\hspace*{2\ccwd}` |
|
|
||||||
| 「师德考核结果」首列 | `师师德考核结果` | `师德考核结果` | docx 原文首字重复(WPS 竖排遗留),已按正常写法更正 |
|
|
||||||
| 「单位年度考核建议档次」首列 | `单单位年度考核建议档次` | `单位年度考核建议档次` | 同上 |
|
|
||||||
| 单元格内边距 | 左右各 108 twips(1.905 mm) | 0 | c10 只有 1.41 mm,比两倍内边距还窄,统一内边距会算出负宽。代价是文字可贴竖线,但全部单元格本就水平居中,观感一致 |
|
|
||||||
| 未勾选框 | Wingdings `¨`(char 0x00A8) | U+25A1 `□` | Wingdings 在 Linux/macOS 上不可靠。仓库里的仿宋、黑体、宋体都含 `□`;且 `../fonts.tex` 已把 U+25A1 归入 CJK 类,不会再落到不含该字的西文字体上 |
|
|
||||||
| 电子签名图片 | 内嵌两张手写签名 JPEG | 无 | 模板不含真人信息 |
|
|
||||||
|
|
||||||
## 校验方法(想改版式时照这个验)
|
|
||||||
|
|
||||||
不要靠肉眼看 PDF。用矢量坐标对:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
xelatex 年度考核登记表.tex
|
|
||||||
pdftocairo -svg 年度考核登记表.pdf pg.svg # 转成 SVG 取精确线条坐标
|
|
||||||
pdftotext -bbox 年度考核登记表.pdf - # 取每个字的 xMin/yMin/xMax/yMax
|
|
||||||
```
|
```
|
||||||
|
|
||||||
正确结果应当满足:
|
## 注意
|
||||||
|
|
||||||
- 表格左边界 73.14 pt、右边界 520.91 pt(宽度 447.8 pt ≈ 157.96 mm);
|
示例内容为虚构数据,使用时全部替换。签字、日期栏留空手填。
|
||||||
- 表格所有横线都是 **10 段**(8 个网格列位置被合并掉,只剩 10 段可见);
|
|
||||||
- 页数为 2;
|
|
||||||
- `grep "Overfull\|too small" 年度考核登记表.log` 无输出。
|
|
||||||
|
|
||||||
当前状态:**零 Overfull、零 Underfull、2 页、表宽 157.96 mm**(目标 158.33 mm,
|
|
||||||
差 0.23%,为消除 0.45 pt 的 `Overfull` 累积误差而取整所致,肉眼不可辨)。
|
|
||||||
+141
-337
@@ -1,363 +1,167 @@
|
|||||||
# 中国海洋大学幻灯片LaTex模板
|
# 幻灯片
|
||||||
|
|
||||||
中国海洋大学幻灯片LaTex非官方模板。
|
Beamer 演示文稿,16:9,中国海洋大学配色主题。
|
||||||
|
|
||||||
本模板修改自<a href="https://github.com/Helmholtz-AI-Energy/beamer-template" target="_blank">HelmholtzAI</a>模板。在原有模板基础上进行了大量修改。
|
## 编译
|
||||||
|
|
||||||
模板主要使用海大公布的标准色,包括海大蓝、海大天蓝、海大红、樱缤粉、文脉棕、专金、专银,以及后加的苍松绿、暮山紫、琥珀橙。
|
```bash
|
||||||
|
cd 幻灯片
|
||||||
|
xelatex slides.tex
|
||||||
|
xelatex slides.tex % 跑两遍,目录与总页数才正确
|
||||||
|
```
|
||||||
|
|
||||||
此外,使用了大量的信息框来增加模板的活力。
|
或仓库根:`bash build.sh 幻灯片`(自动跑两遍)
|
||||||
|
|
||||||
> 本目录原为独立仓库 `ouc-slide-latex-template`,2026-10 起并入 `ouc_latex_template` 统一维护,旧仓库不再更新。
|
## 文件
|
||||||
|
|
||||||
# 文件结构
|
```
|
||||||
|
幻灯片/
|
||||||
|
├── slides.tex 主文件
|
||||||
|
├── oucslide.sty 版式包
|
||||||
|
├── theme/ 主题的五个组成部分
|
||||||
|
│ ├── beamerthemeOUCSlide.sty
|
||||||
|
│ ├── beamercolorthemeOUCSlide.sty
|
||||||
|
│ ├── beamerfontthemeOUCSlide.sty
|
||||||
|
│ ├── beamerinnerusthemeOUCSlide.sty
|
||||||
|
│ └── beamerouterthemeOUCSlide.sty
|
||||||
|
├── figs/ 插图
|
||||||
|
└── logos/ 校徽等标识
|
||||||
|
```
|
||||||
|
|
||||||
模板中的文件主要包括:
|
|
||||||
|
|
||||||
1. slides.tex:主文件,编写的演示文稿内容主要存放在该文件当中。
|
|
||||||
2. oucslide.sty:模板的样式文件。
|
|
||||||
3. (字体不在本目录) 全部字体已统一到仓库根 `../fonts/`,由 `../fonts.tex` 统一加载。默认字体仍是华为鸿蒙字体。
|
|
||||||
4. theme:主题文件夹。
|
|
||||||
1. beamercolorthemeOUCSlide.sty:颜色定义文件。
|
|
||||||
2. beamerfontthemeOUCSlide.sty:字体定义文件。
|
|
||||||
3. beamerinnerthemeOUCSlide.sty:内部元素定义文件。
|
|
||||||
4. beamerouterthemeOUCSlide.sty:整体布局定义文件。
|
|
||||||
5. beamerthemeOUCSlide.sty:主题定义文件。
|
|
||||||
5. logos:模板中使用的Logo存放文件夹。
|
|
||||||
6. figs:插入的图片文件夹。
|
|
||||||
7. fontawesome.pdf:图标使用说明文件。
|
|
||||||
|
|
||||||
# 使用方法
|
|
||||||
1. 本模板现为 `ouc_latex_template` 仓库的 `幻灯片/` 子目录,克隆主仓库即可:
|
|
||||||
```bash
|
|
||||||
git clone https://code.yangyq.net/laoyang/ouc_latex_template.git
|
|
||||||
cd ouc_latex_template/幻灯片
|
|
||||||
```
|
|
||||||
子目录内自包含(`theme/`、`logos/`、`figs/` 都在本目录),只有字体是共享的上层目录 `../fonts/`,不需要额外的宏包搜索路径。
|
|
||||||
2. 安装Tex编译器,推荐使用<a href="https://tug.org/texlive/" target="_blank">TexLive</a>,安装成功后,可以使用自带的TeXworks打开目录下的tex文件进行编译。
|
|
||||||
3. 可以安装其他的IDE工具进行Tex文件的编写和修改,推荐使用<a href="https://code.visualstudio.com/" target="_blank">Visual Studio Code</a>。
|
|
||||||
4. 编译时,请选择XeLaTex,有时候,可能需要连续编译两次,以得到正确的页码和图表编号。
|
|
||||||
|
|
||||||
# 编译器版本兼容性
|
|
||||||
|
|
||||||
模板已内置**版本自动判别**,同一份源码在 TeX Live 2022 及以后各年份均可直接编译,**不需要改代码、也不需要切分支**。
|
|
||||||
|
|
||||||
| TeX Live | beamer 版本 | 状态 |
|
|
||||||
|------|-------------|------|
|
|
||||||
| 2022 | 3.66 | 已验证通过(本机实测,30 页) |
|
|
||||||
| 2023 | 3.69 | 已验证通过 |
|
|
||||||
| 2024 | 3.71 | 已验证通过 |
|
|
||||||
| 2025 | 3.72 | 已验证通过 |
|
|
||||||
| 2026 | 3.77 | 已验证通过 |
|
|
||||||
|
|
||||||
> 低于 TeX Live 2022 的版本未做验证,不保证可用。
|
|
||||||
|
|
||||||
## 为什么需要版本判别
|
|
||||||
|
|
||||||
beamer 的内部实现会随 TeX Live 版本变化,而模板中对内部宏的补丁(`\patchcmd`)会因此失效。最典型的一次是:
|
|
||||||
|
|
||||||
- **beamer 3.69(TeX Live 2023)** 起,`\beamer@@frametitle` 改用 `\beamer@insertframetitlecontinuation`,使得面向旧版写法的补丁匹配失败,报 `Patching original frame title failed`。
|
|
||||||
- 模板现已加入**版本自动判别**(依据 `\beamer@insertframetitlecontinuation` 是否存在,判断逻辑写在文件顶层 `theme/beamerfontthemeOUCSlide.sty`),因此各年份**不需要再改动源码**。
|
|
||||||
- 若将来 beamer 再次改动内部实现,按同样思路在该文件顶层加判别分支即可。
|
|
||||||
|
|
||||||
## 关于 `slides.pdf`
|
|
||||||
|
|
||||||
仓库内的 `slides.pdf` 是成品样张,用于预览效果。它由**较新版本**的 TeX Live 编译;用本机较旧版本重新编译时,个别页面的装饰层定位可能有细微差别(例如结尾页右下角的网址位置),**正文内容与版式一致性不受影响**。
|
|
||||||
|
|
||||||
## 维护约定
|
|
||||||
|
|
||||||
每当有新的 TeX Live 年份发布时:
|
|
||||||
|
|
||||||
1. 在新版本的 TeX Live 下,用 **XeLaTeX 编译本目录的 `slides.tex`**;
|
|
||||||
2. 如果编译不通过,修改 `theme/beamerfontthemeOUCSlide.sty` 顶层的版本判别分支,注意保持向后兼容(不要让新年份的改动破坏旧年份);
|
|
||||||
3. 在兼容性表格里补一行,注明已验证通过的版本。
|
|
||||||
|
|
||||||
# 元素介绍
|
|
||||||
## 基本信息
|
## 基本信息
|
||||||
Tex文件的开头,是基本信息部分,可以根据需要添加`\title`{标题}、`\subtitle`{子标题}、`\author`{作者}、`\date`{\today}、`\institute`{所属机构}。
|
|
||||||
|
|
||||||
`\newcommand{\last}{敬请批评指正!}` 的作用是为了制作最后一页致谢页面而单独设置的,可以修改为任何致谢语句。
|
```latex
|
||||||
|
\documentclass[aspectratio=169,UTF8,t]{beamer}
|
||||||
## 特殊页面
|
|
||||||
|
|
||||||
模板中有三个特殊的页面,分别是:标题页(首页)、目录页和结尾页。这三个页面由于其特殊性,不能使用frame的常规模板,因此,为它们创建了三个命令进行生成:
|
|
||||||
|
|
||||||
|
\title{中国海洋大学幻灯片LaTex模板}
|
||||||
|
\subtitle{助力你的科研梦想}
|
||||||
|
\author{张远航}
|
||||||
|
\date{\today}
|
||||||
|
\institute{计算机科学与技术学院}
|
||||||
|
\newcommand{\last}{敬请批评指正!} % 结束语
|
||||||
```
|
```
|
||||||
\maketitle
|
|
||||||
\makeoutline
|
|
||||||
\makelast
|
|
||||||
```
|
|
||||||
使用者三个命令后,将会自动创建首页、目录页和结尾页。
|
|
||||||
|
|
||||||
首页和结尾页,使用的是基本信息中的数据,而目录页的内容,将根据`\section`进行填充。
|
|
||||||
|
|
||||||
## 目录页样式(自适应方框)
|
|
||||||
|
|
||||||
目录页默认使用**自适应方框**样式:每一个一级标题(`\section`)被放进一个独立的方框里,**方框的高度、以及方框内文字的字号,都会根据一级标题的数目自动计算**,并且方框会自动均分、铺满整个目录页。章节少时方框又高又大、字号醒目;章节多时方框自动变矮、字号自动缩小,不需要手工调任何一个数字。
|
|
||||||
|
|
||||||
方框内的文字**左对齐**,左侧只留一点点缩进,读起来更像一份正常的目录。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 配色:默认海大红,蓝色可选
|
|
||||||
|
|
||||||
目录页默认使用**海大红**(`oucred`)——和各章节标题页的颜色保持一致。
|
|
||||||
|
|
||||||
这是因为目录页上「目录」二字本身是**海大蓝**的,如果目录项再用蓝色,整页就分不出层次。用海大红正好和章节标题页呼应。
|
|
||||||
|
|
||||||
如果就喜欢蓝色,改一行即可切回海大蓝:
|
|
||||||
|
|
||||||
```
|
|
||||||
\toctheme{red} % 默认:海大红,与各章节标题页同色
|
|
||||||
\toctheme{blue} % 海大蓝,与目录页标题「目录」同色
|
|
||||||
```
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 三种方框样式
|
|
||||||
|
|
||||||
在导言区用一行命令即可切换,样式与配色可以自由组合:
|
|
||||||
|
|
||||||
```
|
|
||||||
\settocstyle{box} % 默认:浅色底 + 圆角框 + 圆形序号
|
|
||||||
\settocstyle{solid} % 实心色底 + 白色文字
|
|
||||||
\settocstyle{bar} % 白底 + 左侧粗色条
|
|
||||||
```
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
章节较多时(下面这张是 9 个一级标题),方框和字号会自动压缩:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 可调参数
|
|
||||||
|
|
||||||
所有参数都可以在导言区用 `\setlength` 覆盖,一般**不需要改**:
|
|
||||||
|
|
||||||
| 参数 | 默认值 | 含义 |
|
|
||||||
|------|--------|------|
|
|
||||||
| `\tocareamargin` | `52pt` | 目录区上下预留的高度(自动模式下从 `\textheight` 中扣除) |
|
|
||||||
| `\tocareaheight` | `0pt` | 直接指定目录区高度;`0pt` 表示自动 |
|
|
||||||
| `\tocboxgap` | `10pt` | 方框之间的理想间距(空间紧张时会自动压缩) |
|
|
||||||
| `\tocboxgapmin` | `2pt` | 方框之间允许的最小间距 |
|
|
||||||
| `\tocboxmaxheight` | `110pt` | 单个方框的最大高度 |
|
|
||||||
| `\tocboxleftpad` | `2.5pt` | 方框内文字距左边框的距离(只留一点点) |
|
|
||||||
| `\tocfontmax` | `26pt` | 方框内文字的最大字号 |
|
|
||||||
| `\tocfontwarn` | `8pt` | 字号低于该值时会给出警告 |
|
|
||||||
|
|
||||||
例如,希望方框之间更紧凑一些:
|
|
||||||
|
|
||||||
```
|
|
||||||
\setlength{\tocboxgap}{6pt}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 几点说明
|
|
||||||
|
|
||||||
1. **目录页需要连续编译两次**:章节数目是从上一次编译生成的 `.toc` 文件里读出来的。第一次编译时 `.toc` 还是空的,目录页会是空白,再编译一次即可正常。
|
|
||||||
2. 方框的序号和标题是**超链接**,在 PDF 里点击会直接跳到对应章节。
|
|
||||||
3. 一级标题**太多时(大约 9 个以上)**,方框和字号会变得偏小,编译日志里会有 `oucslide Warning` 提示。这种情况下建议合并章节,或者把目录页改回普通的列表样式。
|
|
||||||
4. 如果确实想换回旧版那种简洁的列表目录,把 `\makeoutline` 里的 `\ouc@toc@body` 换回 `\tableofcontents[hideallsubsections]` 即可(旧的模板定义仍保留在 `beamerouterthemeOUCSlide.sty` 中)。
|
|
||||||
|
|
||||||
## 使用分节
|
|
||||||
|
|
||||||
本模板使用分节进行整体规划,章节共三级,对应的关键字分别是:
|
|
||||||
```
|
|
||||||
\section
|
|
||||||
\subsection
|
|
||||||
\subsubsection
|
|
||||||
```
|
|
||||||
其中,`\section` 会有单独的页面进行显示。如下图所示。而且,section还将会出现在目录页面中。
|
|
||||||

|
|
||||||
`\subsection` 和 `\subsubsection`都没有单独的页面相对应,他们会出现在对应章节的frame中,作为标题进行呈现,并且加入了自动编号的效果。需要说明的是,`\subsection`是必须的,而 `\subsubsection` 却可有可无。他们呈现出的最终的效果,如下图所示。
|
|
||||||

|
|
||||||
**需要注意的是,虽然frame的标题,是由subsection和subsubsection自动生成的,但是frame中的frametitle仍然是必须的,否则没有frametitle这个元素,标题无法自动填充。**
|
|
||||||
|
|
||||||
## 使用Frame
|
|
||||||
章节确定好后,就可以增加Frame来编写幻灯片。使用代码:
|
|
||||||
```
|
|
||||||
\begin{frame}
|
|
||||||
\frametitle{测试}
|
|
||||||
\end{frame}
|
|
||||||
```
|
|
||||||
就可以插入一张幻灯片。
|
|
||||||
|
|
||||||
需要注意的是:如果幻灯片中使用了代码块,则需要加入关键字`fragile`。这样,引入的代码才能保持它们原有的样子,如下所示:
|
|
||||||
```
|
|
||||||
\begin{frame}[fragile]
|
|
||||||
\frametitle{测试}
|
|
||||||
\end{frame}
|
|
||||||
```
|
|
||||||
当然,也可以使用定义的特殊的frame模板来达到这种效果。
|
|
||||||
```
|
|
||||||
\begin{fragileframe}
|
|
||||||
\frametitle{测试}
|
|
||||||
\end{fragileframe}
|
|
||||||
```
|
|
||||||
他们的效果是一样的。
|
|
||||||
|
|
||||||
## 字体
|
|
||||||
模板使用的默认字体是<a href="https://developer.harmonyos.com/cn/docs/design/font-0000001157868583" target="_blank">华为鸿蒙字体 (HarmonyOS Sans)</a>。该字体可以免费商用。
|
|
||||||
|
|
||||||
如果对字体不满意,可把字体放进仓库根的 `fonts/` 目录,并在 `theme/beamerfontthemeOUCSlide.sty` 中修改。**注意**:`Path=` 是相对编译时工作目录(= `幻灯片/`)的,所以写 `../fonts/xxx/`,不是 `fonts/`。
|
|
||||||
|
|
||||||
只保留实际用到的 6 个鸿蒙文件(Regular/Bold 及其 Italic,加 SC Regular/Bold)——原先 `幻灯片/fonts/` 里的 Black / Light / Medium / Thin 等 12 个字重全库无人引用,已随目录一并删除,省下 49 MB。
|
|
||||||
|
|
||||||
推荐的字体包括:<a href="https://github.com/adobe-fonts/source-han-sans" target="_blank">思源黑体</a>、<a href="https://alibabafont.taobao.com/wow/alibabafont/act/alifont" target="_blank">阿里普惠字体</a>、<a href="https://www.thosefree.com/oppo-sans" target="_blank">OPPO字体</a>、<a href="https://web.vip.miui.com/page/info/mio/mio/detail?postId=33935854" target="_blank">小米字体</a>。这些字体基本上都可以免费商用,并且效果都很不错。关于他们是否能够继续免费商用的政策,请查阅其官方网站以得到最准确的信息。
|
|
||||||
|
|
||||||
## 颜色
|
|
||||||
根据海大公布的标准颜色,定义了相关颜色。其中文名称和代码如下表所示。
|
|
||||||
|
|
||||||
当然,也可以使用LaTex自带的颜色,例如white、black等。
|
|
||||||
|
|
||||||
| 名称 | 中文名 | 说明 |
|
|
||||||
|--------------|--------------|------|
|
|
||||||
| oucblue | 海大蓝 | 海大标准色 |
|
|
||||||
| ouclightblue | 海大天蓝 | 海大标准色 |
|
|
||||||
| oucred | 海大红 | 海大标准色 |
|
|
||||||
| ouccherry | 樱缤粉 | 海大标准色 |
|
|
||||||
| oucbrown | 文脉棕 | 海大标准色 |
|
|
||||||
| oucgolden | 专金 | 海大标准色 |
|
|
||||||
| oucsilver | 专银 | 海大标准色 |
|
|
||||||
| oucpine | 苍松绿 | 新增,深绿 |
|
|
||||||
| oucdusk | 暮山紫 | 新增,深紫 |
|
|
||||||
| oucamber | 琥珀橙 | 新增,深橘 |
|
|
||||||
|
|
||||||
### 新增的三个颜色
|
|
||||||
|
|
||||||
已有的浅色(樱缤粉、专金、专银)在内容多的时候不太够用,因此补充了三个**较深的颜色**——
|
|
||||||
深色的好处是**和白色文字有足够的对比度**,可以直接当作色块底色(`pointbox`、`titlebox`、
|
|
||||||
`block` 等)使用,不必再担心白字看不清。
|
|
||||||
|
|
||||||
| 名称 | 色值 | 白字对比度 | 命名与定位 |
|
|
||||||
|------|------|-----------|-----------|
|
|
||||||
| `oucpine` | RGB 30, 86, 64 | 8.54 | **苍松绿**——取自传统色「苍松」,色相偏青的深绿,沉静稳重 |
|
|
||||||
| `oucdusk` | RGB 92, 58, 118 | 9.04 | **暮山紫**——取自传统色「暮山紫」(暮色中的远山),深紫而不艳 |
|
|
||||||
| `oucamber` | RGB 196, 82, 16 | 4.60 | **琥珀橙**——取自传统色「琥珀」,高饱和的深橘 |
|
|
||||||
|
|
||||||
三点说明:
|
|
||||||
|
|
||||||
1. **琥珀橙和文脉棕不会混淆**:文脉棕是「低饱和的暗褐」,琥珀橙是「高饱和的深橘」,
|
|
||||||
两者在饱和度上拉开了明显差距(色相接近,但饱和度 0.61 vs 0.98)。
|
|
||||||
2. 三个新颜色**同样带十个色阶**(`oucpine10` ~ `oucpine90` 等),浅色等级可以当背景底。
|
|
||||||
3. 对比度按 WCAG 计算,**≥ 4.5 即白字清晰可读**。三个新颜色都在 4.5 以上
|
|
||||||
(对比度越高,白字越清晰)。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 颜色等级
|
|
||||||
为了显示更丰富的色彩,定义的海大标准色,每一种颜色,都有十个等级,等级越低,颜色越浅。例如:对于海大蓝,其等级颜色从oucblue90-oucblue10不等,分成10个等级。
|
|
||||||
|
|
||||||
## 信息框
|
|
||||||
信息框使用边框的形式,提升幻灯片的表现力。
|
|
||||||
|
|
||||||
主要的信息框包括:列表框(`vcolorbox`)、提示框(`notebox`、`importantbox`)、信息框(`titlebox`)、要点框(`pointbox`)、块(`block`、`exampleblock`、`alertblock`)、标题框(`headbox`)和文本框(`textbox`)。它们的效果,如下图所示。
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
### 要点框自动排布(pointboxgrid)
|
|
||||||
|
|
||||||
要点框数量多的时候,不需要自己摆 `columns`——用 `pointboxgrid` 环境会自动排成网格:
|
|
||||||
|
|
||||||
```
|
|
||||||
\begin{pointboxgrid}{高度}
|
|
||||||
\pointitem{标题}{颜色}{内容}
|
|
||||||
\pointitem{标题}{颜色}{内容}
|
|
||||||
...
|
|
||||||
\end{pointboxgrid}
|
|
||||||
```
|
|
||||||
|
|
||||||
**排布规则:每行最多 4 个;超过 4 个自动分成多行,并尽量均匀(上行不少于下行)。**
|
|
||||||
|
|
||||||
| 个数 | 排布 | 个数 | 排布 |
|
|
||||||
|------|------|------|------|
|
|
||||||
| 1~4 | 一行 | 9 | 3 + 3 + 3 |
|
|
||||||
| 5 | 3 + 2 | 10 | 4 + 3 + 3 |
|
|
||||||
| 6 | 3 + 3 | 11 | 4 + 4 + 3 |
|
|
||||||
| 7 | 4 + 3 | 12 | 4 + 4 + 4 |
|
|
||||||
| 8 | 4 + 4 | N | 行数 = ⌈N/4⌉,前 N mod 行数 行每行多放一个 |
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
几点说明:
|
|
||||||
|
|
||||||
1. **高度参数的含义和 `pointbox` 的 `height` 一样**,是固定高度——内容别写超,超了会画到框外(见下)。数量多时记得**把高度调小**。
|
|
||||||
2. **行数多了会超出页面底部**。经验值:正文区高约 243pt,总高 ≈ `69 + 行数×高度 + (行数−1)×25`(pt)。
|
|
||||||
所以 **4 行时高度不要超过 24pt**。超过时编译日志里会有 `oucslide Warning` 提醒。
|
|
||||||
3. 想让每行放更多/更少,可改 `\l_ouc_pbg_max`(默认 4);间距可改 `\l_ouc_pbg_gap`(横向,默认 8pt)与
|
|
||||||
`\l_ouc_pbg_vgap`(纵向,默认 6pt)。
|
|
||||||
4. 单个要点框仍然可以像以前那样手写 `columns` + `pointbox`,两种用法并存。
|
|
||||||
|
|
||||||
## 图示组件(扁平风格)
|
|
||||||
|
|
||||||
模板自带 9 个**扁平简约**图示组件:圆角色块 + 实心纯色 + 白字 + 细箭头,
|
|
||||||
**无渐变、无阴影、无立体**。全部用纯 TikZ 绘制,不依赖任何外部绘图宏包。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 颜色:一个或多个都可以
|
|
||||||
|
|
||||||
所有组件的**颜色列表写在方括号里**(可选参数)。写一个就是全部同色,
|
|
||||||
写多个就**按顺序取色、不够时自动循环**:
|
|
||||||
|
|
||||||
```
|
|
||||||
\flatflow[oucblue]{数据采集, 数据清洗, 模型训练, 结果评估} % 全部海大蓝
|
|
||||||
\flatflow[oucblue,oucred,oucpine,oucamber]{数据采集, 数据清洗, 模型训练, 结果评估}
|
|
||||||
% ← 4 个块 4 种颜色
|
|
||||||
\flatflow[oucred,oucblue]{块一, 块二, 块三, 块四, 块五, 块六}
|
|
||||||
% ← 2 色循环:红蓝红蓝红蓝
|
|
||||||
```
|
|
||||||
|
|
||||||
> ⚠️ 颜色**必须写成方括号 `[ ]`**。若误写成花括号 `{ }`,颜色会被当成第一个条目,
|
|
||||||
> 编译时会报 `图示组件的颜色要写在方括号里` 的明确错误(不会静默出错)。
|
|
||||||
|
|
||||||
### 九个组件速查
|
|
||||||
|
|
||||||
| 命令 | 说明 |
|
| 命令 | 说明 |
|
||||||
|------|------|
|
|---|---|
|
||||||
| `\flatflow[颜色]{条目1, 条目2, ...}` | **横向箭头流程**,自动等分满宽 |
|
| `\title{}` | 主标题 |
|
||||||
| `\flatstack[颜色]{条目1, 条目2, ...}` | 纵向流程 |
|
| `\subtitle{}` | 副标题 |
|
||||||
| `\flatcycle[颜色]{条目1, ...}` | 循环图(弧线箭头首尾相接) |
|
| `\author{}` | 作者 |
|
||||||
| `\flathub[颜色]{中心文字}{环绕1, 环绕2, ...}` | **中心辐射**(中心圆 + 环绕卡片) |
|
| `\date{}` | 日期 |
|
||||||
| `\flatsteps[颜色]{条目1, ...}` | 阶梯递进 |
|
| `\institute{}` | 单位 |
|
||||||
| `\flattime[颜色]{年份列表}{事件列表}` | 时间轴(节点上下交替) |
|
| `\last` | 结束页文字 |
|
||||||
| `\flatquad[颜色]{左上}{右上}{左下}{右下}` | 四象限 |
|
|
||||||
| `\flatpyramid[颜色]{顶层, ..., 底层}` | 金字塔(上窄下宽) |
|
|
||||||
| `\flatcompare[左色][右色]{左标题}{左内容}{右标题}{右内容}` | 左右对比 |
|
|
||||||
|
|
||||||
示例(`slides.tex` 里有完整的 5 页演示):
|
`aspectratio=169` 是 16:9。要 4:3 改成 `aspectratio=43`。
|
||||||
|
|
||||||
```
|
## 文档骨架
|
||||||
\flatflow[oucblue,oucred,oucpine,oucamber]{数据采集, 数据清洗, 模型训练, 结果评估}
|
|
||||||
|
|
||||||
\flathub[oucblue,oucred,oucpine,oucamber,oucdusk]{核心}{可行性, 必要性, 创新性, 实用性}
|
```latex
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
\flattime[oucblue,oucred,oucpine,oucdusk]{2020, 2021, 2023, 2025}{立项, 方案设计, 中期检查, 结题验收}
|
\maketitle % 标题页
|
||||||
|
\makeoutline % 目录页
|
||||||
|
|
||||||
\flatcompare[oucpine][oucred]{优势}{响应快、成本低、易于维护}{不足}{精度受限、依赖数据质量}
|
\section{简介}
|
||||||
|
\subsection{模板简介}
|
||||||
|
\begin{frame}
|
||||||
|
\frametitle{简介}
|
||||||
|
正文内容。
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\makeoutline % 每节前重复目录(可选)
|
||||||
|
|
||||||
|
\section{下一节}
|
||||||
|
\begin{frame}
|
||||||
|
\frametitle{页面标题}
|
||||||
|
...
|
||||||
|
\end{frame}
|
||||||
|
|
||||||
|
\makelast % 结束页
|
||||||
|
\end{document}
|
||||||
```
|
```
|
||||||
|
|
||||||
`\flatquad` 与 `\flatcompare` 的颜色是独立的固定参数(分别 1 个和 2 个),
|
| 命令 | 说明 |
|
||||||
不参与循环取色。
|
|---|---|
|
||||||
|
| `\maketitle` | 标题页 |
|
||||||
|
| `\makeoutline` | 目录页,可在每节前反复调用 |
|
||||||
|
| `\makelast` | 结束页,显示 `\last` 的内容 |
|
||||||
|
|
||||||
### 几点说明
|
## 单页写法
|
||||||
|
|
||||||
1. 颜色可以直接用模板的 10 个颜色(`oucblue`、`oucred`、`oucpine`、`oucdusk`、`oucamber` 等)。
|
```latex
|
||||||
2. 横向流程会自动把 N 个块加间隙**摊满整行**,不需要手算宽度。
|
\begin{frame}
|
||||||
3. 纵向对比、四象限这类元素较宽,建议用 `\begin{center}...\end{center}` 居中。
|
\frametitle{页面标题}
|
||||||
4. 这套组件已用 TeX Live 2022~2026 逐一编译验证:0 错误、0 溢出,且跨版本渲染逐像素一致。
|
\begin{itemize}
|
||||||
|
\item 第一点
|
||||||
|
\item 第二点
|
||||||
|
\end{itemize}
|
||||||
|
\end{frame}
|
||||||
|
```
|
||||||
|
|
||||||
## 代码
|
分栏:
|
||||||
|
|
||||||
模板可以插入代码块,使用`lstlisting`即可。
|
```latex
|
||||||
|
\begin{frame}
|
||||||
|
\frametitle{两栏}
|
||||||
|
\begin{columns}
|
||||||
|
\begin{column}{0.48\textwidth}
|
||||||
|
左栏内容
|
||||||
|
\end{column}
|
||||||
|
\begin{column}{0.48\textwidth}
|
||||||
|
右栏内容
|
||||||
|
\end{column}
|
||||||
|
\end{columns}
|
||||||
|
\end{frame}
|
||||||
|
```
|
||||||
|
|
||||||
## 公式
|
## 主题与配色
|
||||||
模板中可以直接插入公式,和LaTex中没有什么区别。
|
|
||||||
|
|
||||||
## 脚注
|
主题在 `theme/` 下,分五块:整体、配色、字体、内部元素、外部元素。
|
||||||
可以在任何地方使用脚注。即便是在各种信息框中也可以。
|
改配色看 `beamercolorthemeOUCSlide.sty`,改字体看
|
||||||
|
`beamerfontthemeOUCSlide.sty`。
|
||||||
|
|
||||||
|
已加载的宏包:
|
||||||
|
|
||||||
|
| 宏包 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| `tcolorbox` | 彩色盒子 |
|
||||||
|
| `fontawesome` | 图标 |
|
||||||
|
| `caption` / `subcaption` | 图注 |
|
||||||
|
| `verbatim` | 代码原样输出 |
|
||||||
|
|
||||||
|
## 插图
|
||||||
|
|
||||||
|
图片放 `figs/`:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.6\textwidth]{figs/fig01.png}
|
||||||
|
\caption{图标题}
|
||||||
|
\end{figure}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 版式
|
||||||
|
|
||||||
|
```
|
||||||
|
16:9(aspectratio=169)
|
||||||
|
顶部对齐(t 选项)
|
||||||
|
海大蓝配色
|
||||||
|
标题页 + 目录页 + 内容页 + 结束页
|
||||||
|
页脚含校徽、页码、作者
|
||||||
|
```
|
||||||
|
|
||||||
|
## 自定义命令
|
||||||
|
|
||||||
|
| 命令 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| `\maketitle` | 标题页 |
|
||||||
|
| `\makeoutline` | 目录页 |
|
||||||
|
| `\makelast` | 结束页 |
|
||||||
|
| `\banner{}` | 横幅标题 |
|
||||||
|
| `\oucurl{url}` | 排网址链接 |
|
||||||
|
| `\bottomslider` / `\topslider` | 底部/顶部进度条 |
|
||||||
|
| `\footerlogo` | 页脚校徽 |
|
||||||
|
|
||||||
|
## 注意
|
||||||
|
|
||||||
|
示例内容为虚构数据,使用时全部替换。
|
||||||
+71
-324
@@ -1,55 +1,26 @@
|
|||||||
# 成绩构成说明 — 中国海洋大学《成绩构成说明》(LaTeX 版)
|
# 成绩构成说明
|
||||||
|
|
||||||
把任课教师手写的「成绩构成说明」做成 LaTeX 模板。原件是一份填过的
|
中国海洋大学课程成绩构成说明表,A4 单页,正文小四(12pt)。
|
||||||
`.doc` 实例(两段话 + 标题,无表格、无签字栏),本模板在**保留其信息
|
|
||||||
内容**的前提下重新组织,并补齐归档必需项。
|
|
||||||
|
|
||||||
> **本模板不含原件任何真实数据。** 课程名、学年、学期、教师姓名、
|
|
||||||
> 所有比例、日期均已替换,已 grep 验证零命中。
|
|
||||||
>
|
|
||||||
> 样张填的是一份**完整的虚构课程**:《数字逻辑》2025 秋学期、任课教师「张远航」、
|
|
||||||
> 理论课 80% + 实验课 20%、平时 30%(作业 20% + 点名 10%)+ 期末 70%。
|
|
||||||
> 这套比例是**自洽的**(20+10=30、30+70=100、80+20=100),正好能演示
|
|
||||||
> 模板的比例校验功能;与 [`课程教学日历/`](../课程教学日历/)、
|
|
||||||
> [`试卷归档封面/`](../试卷归档封面/)、[`试卷/`](../试卷/) 为同一门课。
|
|
||||||
|
|
||||||
## 目录
|
|
||||||
|
|
||||||
- [文件](#文件)
|
|
||||||
- [编译](#编译)
|
|
||||||
- [改内容](#改内容)
|
|
||||||
- [相对于原件的改动](#相对于原件的改动)
|
|
||||||
- [比例自洽校验](#比例自洽校验)
|
|
||||||
- [版式参数](#版式参数)
|
|
||||||
- [五个坑](#五个坑)
|
|
||||||
- [真实数据零泄漏](#真实数据零泄漏)
|
|
||||||
- [字体](#字体)
|
|
||||||
|
|
||||||
## 文件
|
|
||||||
|
|
||||||
| 文件 | 说明 |
|
|
||||||
| :-- | :-- |
|
|
||||||
| `成绩构成说明.tex` | 主文件。填表只改第 1 节(10 个宏) |
|
|
||||||
| `oucgrade.sty` | 版式包。页面/字体/表格/签字栏,附换算注释 |
|
|
||||||
| `成绩构成说明.pdf` | 成品样张(1 页) |
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
cd 成绩构成说明
|
||||||
xelatex 成绩构成说明.tex
|
xelatex 成绩构成说明.tex
|
||||||
```
|
```
|
||||||
|
|
||||||
**单页,跑一遍即可**(无交叉引用,不需要 bibtex)。
|
或仓库根:`bash build.sh 成绩构成说明`
|
||||||
|
|
||||||
⚠️ 必须在**本目录**下编译,不要从仓库根调用 —— `fonts.tex` 用的是
|
## 文件
|
||||||
相对路径 `../fonts/`。
|
|
||||||
|
|
||||||
需要 XeLaTeX,并安装 `ctex`、`geometry`、`fontspec`、`xeCJK`、
|
| 文件 | 说明 |
|
||||||
`tabularray`、`enumitem`、`graphicx`。实测环境:TeX Live 2022。
|
|---|---|
|
||||||
|
| `成绩构成说明.tex` | 主文件,填内容改这里 |
|
||||||
|
| `oucgrade.sty` | 版式包,一般不改 |
|
||||||
|
|
||||||
## 改内容
|
## 填写参数
|
||||||
|
|
||||||
### 课程信息(10 个宏)
|
改 `\begin{document}` 之后的第 1 节,共 10 个宏,正文不用动:
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\grdcourse}{数字逻辑} % 课程名称
|
\newcommand{\grdcourse}{数字逻辑} % 课程名称
|
||||||
@@ -57,312 +28,88 @@ xelatex 成绩构成说明.tex
|
|||||||
\newcommand{\grdseason}{秋} % 季学期(春 / 秋)
|
\newcommand{\grdseason}{秋} % 季学期(春 / 秋)
|
||||||
\newcommand{\grdteacher}{张远航} % 任课教师
|
\newcommand{\grdteacher}{张远航} % 任课教师
|
||||||
|
|
||||||
\newcommand{\grdtheory}{80} % 理论课占总成绩 %
|
\newcommand{\grdtheory}{80} % 理论课占总成绩
|
||||||
\newcommand{\grdlab}{20} % 实验课占总成绩 %
|
\newcommand{\grdlab}{20} % 实验课占总成绩
|
||||||
|
|
||||||
\newcommand{\grddaily}{30} % 平时成绩占理论课 %
|
\newcommand{\grddaily}{30} % 平时成绩占理论课
|
||||||
\newcommand{\grdfinal}{70} % 期末考试成绩占理论课 %
|
\newcommand{\grdfinal}{70} % 期末考试成绩占理论课
|
||||||
|
|
||||||
\newcommand{\grdhw}{20} % 作业占理论课 %
|
\newcommand{\grdhw}{20} % 作业占理论课
|
||||||
\newcommand{\grdattend}{10} % 点名占理论课 %
|
\newcommand{\grdattend}{10} % 点名占理论课
|
||||||
|
|
||||||
\newcommand{\grdlabnote}{由实验课教师根据实验报告与实验操作评定。}
|
\newcommand{\grdlabnote}{由实验课教师根据实验报告与实验操作评定。}
|
||||||
```
|
```
|
||||||
|
|
||||||
上列前四项是**样张实际用的虚构值**。**数字只填数字,不要带 `%` 号**,百分号由模板加。
|
| 参数 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `\grdcourse` | 课程名称 |
|
||||||
|
| `\grdyear` | 学年 |
|
||||||
|
| `\grdseason` | 季学期,春 / 秋 |
|
||||||
|
| `\grdteacher` | 任课教师 |
|
||||||
|
| `\grdtheory` | 理论课占总成绩百分比 |
|
||||||
|
| `\grdlab` | 实验课占总成绩百分比 |
|
||||||
|
| `\grddaily` | 平时成绩占理论课百分比 |
|
||||||
|
| `\grdfinal` | 期末考试占理论课百分比 |
|
||||||
|
| `\grdhw` | 作业占理论课百分比 |
|
||||||
|
| `\grdattend` | 点名占理论课百分比 |
|
||||||
|
| `\grdlabnote` | 实验课评定方式,一句话说明 |
|
||||||
|
|
||||||
### 「占本类」与「占总成绩」是两回事
|
百分数只填数字,不要带 `%`。
|
||||||
|
|
||||||
这是本模板最要紧的一个设计,见下节。
|
## 比例必须自洽
|
||||||
|
|
||||||
### 改写正文
|
模板会自动检查三组加法:
|
||||||
|
|
||||||
- 总述:`\grdpara{...}`
|
|
||||||
- 分节:`\grdsec{一、成绩构成}`
|
|
||||||
- 列表:`\begin{grdlist} \grditem{项}{:说明} \end{grdlist}`
|
|
||||||
- 表格单元格:`\grdth{}`(表头)/ `\grdtd{}`(表身)
|
|
||||||
|
|
||||||
## 相对于原件的改动
|
|
||||||
|
|
||||||
原件全文只有这些内容(**下面是脱敏摘录**,原件里的真实课程名 / 学年 / 教师名
|
|
||||||
用 `××××` 盖掉了;样张 PDF 里排的是虚构的《数字逻辑》2025 秋):
|
|
||||||
|
|
||||||
```
|
```
|
||||||
成绩构成说明
|
理论课 + 实验课 = 100
|
||||||
×××× 20××学年 ×季学期 期末考试
|
平时成绩 + 期末考试 = 理论课
|
||||||
理论课成绩占总成绩的80%。理论课成绩包括平时成绩、期末考试成绩。
|
作业 + 点名 = 平时成绩
|
||||||
平时成绩占30%(作业占20%,点名占10%),期末考试成绩占70%。
|
|
||||||
实验成绩占总成绩的20%。由实验课老师提供。
|
|
||||||
```
|
|
||||||
|
|
||||||
它的问题有四个,逐个解决:
|
|
||||||
|
|
||||||
### 1. 三层百分数混用不同基准,读者要心算三轮
|
|
||||||
|
|
||||||
| 句子 | 百分数 | **基准实际是** | 折总成绩 |
|
|
||||||
| :-- | --: | :-- | --: |
|
|
||||||
| 理论课占总成绩的 80% | 80% | 总成绩 | 80% |
|
|
||||||
| 平时成绩占 30% | 30% | **理论课** | 24% |
|
|
||||||
| 作业占 20% | 20% | **理论课** | 16% |
|
|
||||||
| 期末考试成绩占 70% | 70% | **理论课** | 56% |
|
|
||||||
|
|
||||||
「平时占 30%」看着像占总成绩三成,实际上只占 **24%**。教务抽查时
|
|
||||||
这里最常被挑错,学生也容易误读。
|
|
||||||
|
|
||||||
**改法**:表格左右并置「占本类」与「占总成绩」两列,后者由
|
|
||||||
`\grdcalc{理论课\%}{分项\%}` 自动算出,不给心算留余地。
|
|
||||||
|
|
||||||
### 2. 层级关系埋在句子里
|
|
||||||
|
|
||||||
「平时成绩占30%(作业占20%,点名占10%)」—— 括号里的两个数加起来
|
|
||||||
才是括号外的数,这种嵌套在一个句子里读起来要来回扫。
|
|
||||||
|
|
||||||
**改法**:改成 6 列表格,一级项目跨行合并,层级一眼可见。
|
|
||||||
|
|
||||||
### 3. 没有说明「怎么算」
|
|
||||||
|
|
||||||
原件说了比例,没说作业怎么平均、缺交怎么扣、点名缺几次记零。
|
|
||||||
这些是学生真正会问的,也是申诉时的依据。
|
|
||||||
|
|
||||||
**改法**:新增「二、分项说明」一节,用列表逐项写清(文字留占位,
|
|
||||||
任课教师按自己课程的规则填)。
|
|
||||||
|
|
||||||
### 4. 没有签字栏
|
|
||||||
|
|
||||||
**这是用户明确要求补的。** 没有任课教师签字的成绩构成说明,在教务
|
|
||||||
归档时不被认作有效文件。
|
|
||||||
|
|
||||||
**改法**:右下角落款,含签字线与「年 月 日」三个手写填空位。
|
|
||||||
|
|
||||||
⚠️ **「年 月 日」不印年份**。成绩构成说明是学期末签署的文件,年份
|
|
||||||
由签字人当场手写;模板里预留 `20××` 反而会占掉手写空间、并诱导
|
|
||||||
使用者去改占位符。所以这一行只有三个字 + 两处 `\hspace` 间距。
|
|
||||||
|
|
||||||
### 另外新增(可关闭)
|
|
||||||
|
|
||||||
「三、成绩评定与异议」一节 —— 说明总成绩如何取整、异议如何在几个
|
|
||||||
工作日内提出。原件没有,但归档材料有这一节更完整。
|
|
||||||
|
|
||||||
不要的话把 `.tex` 里这个开关改成 0:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\def\grdwithini{0} % 1=印这一节,0=不印
|
|
||||||
```
|
|
||||||
|
|
||||||
⚠️ 关掉后正文变短,签字栏会往上移。若想让它仍贴底部,把 `oucgrade.sty`
|
|
||||||
里签字块前的 `\par\vspace{3mm}` 调大即可(见[坑 3](#坑-3签字栏被挤到第-2-页))。
|
|
||||||
|
|
||||||
## 比例自洽校验
|
|
||||||
|
|
||||||
模板会检查三组加法:
|
|
||||||
|
|
||||||
```
|
|
||||||
平时 + 期末 = 100 (构成全部理论课)
|
|
||||||
作业 + 点名 = 平时 (构成全部平时成绩)
|
|
||||||
理论课 + 实验课 = 100 (构成全部总成绩)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
不通过时:
|
不通过时:
|
||||||
|
- 编译 log 里打 `*** oucgrade: 比例不自洽 ***`
|
||||||
|
- PDF 上印一个醒目的提示
|
||||||
|
|
||||||
1. `.log` 里打出
|
## 表格结构
|
||||||
`*** oucgrade: 比例不自洽 --- 作业+点名 应构成全部平时成绩: 实际 25+10, 应为 30 ***`
|
|
||||||
2. PDF **标题正下方**印一行红字警告
|
|
||||||
|
|
||||||
**为什么值得做**:成绩构成说明是要归档、要被抽查的文件,比例加不起来
|
| 区段 | 内容 |
|
||||||
是最常见也最难被自己发现的错误 —— 原件那句「平时 30%(作业 20%,
|
|---|---|
|
||||||
点名 10%)」正是靠心算才看得出 20+10=30。
|
| 表头 | 课程名称、学年学期、任课教师 |
|
||||||
|
| 总成绩构成 | 理论课 / 实验课两行,各占百分比 |
|
||||||
|
| 理论课内部 | 平时成绩 / 期末考试 |
|
||||||
|
| 平时成绩内部 | 作业 / 点名 |
|
||||||
|
| 实验课说明 | 一行文字 |
|
||||||
|
| 签字栏 | 任课教师、教研室主任、教学院长 |
|
||||||
|
|
||||||
**已做负面测试**:把 `\grdhw` 从 20 改成 25 重编,log 报
|
## 改表格内文字
|
||||||
`实际 25+10, 应为 30`,PDF 第 1 页顶部出现警告;改回 20 后警告消失。
|
|
||||||
|
|
||||||
⚠️ 警告印在**开头**不是文末。文末的提示会被签字栏挤到第 2 页,
|
正文里表格用标准 `tabular`,各格改写直接改文字。
|
||||||
而第 2 页通常没人翻 —— 等于没提示。
|
|
||||||
|
|
||||||
## 版式参数
|
### 常用命令
|
||||||
|
|
||||||
### 页面
|
| 命令 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| `\grdmaintitle` | 主标题 |
|
||||||
|
| `\grdsubtitle` | 副标题 |
|
||||||
|
| `\grdsubtitleline` | 副标题下横线 |
|
||||||
|
| `\grdsec{标题}` | 分区标题 |
|
||||||
|
| `\grditem{文字}` | 条目 |
|
||||||
|
| `\grdpara{文字}` | 段落 |
|
||||||
|
| `\grdth{内容}` | 表头格 |
|
||||||
|
| `\grdtd{内容}` | 表体格 |
|
||||||
|
| `\grdcalc{算式}` | 算式格(自动排版) |
|
||||||
|
| `\grdsignblock` | 签字栏整块 |
|
||||||
|
| `\grdsmall{文字}` | 小字 |
|
||||||
|
| `\grdcheck` | 运行比例校验 |
|
||||||
|
| `\grdwarnifbad` | 不自洽时印警告 |
|
||||||
|
|
||||||
| 项 | 值 | 来源 |
|
## 版式
|
||||||
| :-- | --: | :-- |
|
|
||||||
| 纸张 | A4 210×297mm | `pgSz 11906×16838` twips |
|
|
||||||
| 上下边距 | 25.40mm | `pgMar top/bottom 1440` |
|
|
||||||
| 左右边距 | 31.75mm | `pgMar left/right 1800` |
|
|
||||||
| 版心 | 146.50 × 246.20mm | 210−2×31.75 / 297−2×25.40 |
|
|
||||||
| 页脚距 | 17.51mm | `pgMar footer 992` |
|
|
||||||
|
|
||||||
换算:`mm = twips / 1440 × 25.4`,`pt = twips / 20`。
|
```
|
||||||
|
A4,正文小四(12pt),边距标准
|
||||||
### 字号
|
表格带框线
|
||||||
|
|
||||||
| 用途 | 原件 (w:sz) | 本模板 | 实测输出 |
|
|
||||||
| :-- | --: | --: | --: |
|
|
||||||
| 大标题 | 36 半磅 = 18pt | `18bp` | 18.00 |
|
|
||||||
| 副标题 | 24 = 12pt | `12bp` | 12.00 |
|
|
||||||
| 正文 | 28 = 14pt | `14bp` | 14.00 |
|
|
||||||
| 表格/签字 | — | `12bp` | 12.00 |
|
|
||||||
|
|
||||||
⚠️ **必须写 `bp` 不能写 `pt`**。Word 的 pt 是 PostScript pt(1/72 in),
|
|
||||||
TeX 默认 pt 是 1/72.27 in,差 0.36%。写 `14pt` 实测输出 14.05。
|
|
||||||
|
|
||||||
### 行距
|
|
||||||
|
|
||||||
| 用途 | 值 | 说明 |
|
|
||||||
| :-- | --: | :-- |
|
|
||||||
| 正文 | 21.5bp | 14pt 的 1.54 倍 |
|
|
||||||
| 表格/签字 | 17bp | 12pt 的 1.42 倍 |
|
|
||||||
|
|
||||||
原件 `docGrid linePitch=312` = 15.6pt,对 14pt 字只有 1.11 倍,太挤。
|
|
||||||
本模板用 21.5bp(1.54 倍)—— 这是**有意的改善**,不是复刻。
|
|
||||||
21.5 是为压到一页反复试出来的值,可读下限约 1.4 倍,还有余量。
|
|
||||||
|
|
||||||
### 表格列宽
|
|
||||||
|
|
||||||
6 列,Σ wd = 123.64mm:
|
|
||||||
|
|
||||||
| 列 | 宽 | 内容 |
|
|
||||||
| :-- | --: | :-- |
|
|
||||||
| 项目 | 22.00mm | 理论课 / 实验课 |
|
|
||||||
| 占本类 | 14.00mm | 80% |
|
|
||||||
| 细分项目 | 26.00mm | 平时成绩 / 期末 |
|
|
||||||
| 占本类 | 14.00mm | 30% |
|
|
||||||
| 占总成绩 | 17.00mm | 24% |
|
|
||||||
| 评定依据 | 29.40mm | 作业 + 出勤 |
|
|
||||||
|
|
||||||
**Σwd 为什么是 123.64 而不是 146.50**:`Q[wd=...]` 是内容区宽度,
|
|
||||||
不含 `colsep`。每列实际占位 = `wd + 2×colsep`,6 列共多占
|
|
||||||
`6×2×1.905 = 22.86mm`。所以
|
|
||||||
`Σwd = 146.50 − 22.86 = 123.64mm`。
|
|
||||||
|
|
||||||
⚠️ **画满全格线之后每列还要再扣 0.5pt**。只画外框时表宽里不含内部
|
|
||||||
竖线;一旦 `vline{1-Z}` 把 5 条内部竖线都画上,表宽就多出
|
|
||||||
`5×0.5 = 2.5pt`,编译报 `Overfull \hbox (2.47554pt too wide)`。
|
|
||||||
所以最后一列从 30.28mm 收到 29.40mm(−2.5pt)补回来。
|
|
||||||
|
|
||||||
### 行高:`ht` 是最小值,且跨行格不会自己长高
|
|
||||||
|
|
||||||
这两点一起踩过,都表现为"字贴着格线":
|
|
||||||
|
|
||||||
| `ht` 是否小于内容高 | 结果 |
|
|
||||||
| :-- | :-- |
|
|
||||||
| 是(如 `ht=7.5mm` < 54.73pt) | 行被内容撑到 54.73pt,**上下零留白**,末行墨迹底离行线只剩 0.90pt(0.32mm),其他行是 4.97pt(1.75mm)—— 一眼看出挤 |
|
|
||||||
| 否(`ht=22mm` = 62.4pt) | 行高 62.86pt,上下各留约 3.8pt,末行墨迹底离行线 4.08pt(1.44mm),与其他行同量级 |
|
|
||||||
|
|
||||||
所以 **`ht` 给了不等于生效,必须大于内容自然高度**。本例「平时成绩
|
|
||||||
(作业 20%、点名 10%)」在 26mm 列里折 3 行,自然高 54.73pt
|
|
||||||
(= 2×17bp + 盒高),要撑开就得给到 22mm。
|
|
||||||
|
|
||||||
`ht` 按**表格行号**给,不是按逻辑块:`row{1}` 是表头、`row{2}` 是
|
|
||||||
「理论课/平时成绩」那一行。抬高 `row{3}`(「期末」行)只会移动中间
|
|
||||||
那条线,对跨行块的高度没有影响。
|
|
||||||
|
|
||||||
## 五个坑
|
|
||||||
|
|
||||||
### 坑 1:`.tex` 里写带 `@` 的宏名
|
|
||||||
|
|
||||||
`.tex` 文档中 `@` 的 catcode 是 12(其他),不是 11(字母)。写
|
|
||||||
`\grd@chk` 会被解析成 `\grd` + `@chk`,报
|
|
||||||
`! LaTeX Error: Missing \begin{document}`,并且**连累后面所有内容**
|
|
||||||
(报一串 Undefined control sequence)。
|
|
||||||
|
|
||||||
**规矩**:带 `@` 的内部宏一律定义在 `.sty` 里,`.tex` 只调用不带 `@`
|
|
||||||
的公开接口(如 `\grdcheck`)。
|
|
||||||
|
|
||||||
### 坑 2:tabularray 的 `hline{}` 里不能用带 `@` 的宏
|
|
||||||
|
|
||||||
```latex
|
|
||||||
hline{1,Z}={\grd@rulev} % ✗ 报 \l__tblr_v_tl ->\grd @rulev
|
|
||||||
hline{1,Z}={0.5pt} % ✓ 写字面值
|
|
||||||
```
|
```
|
||||||
|
|
||||||
tabularray 把 `hline` 的参数当**字符串重新 tokenize**,那一刻 `@` 的
|
## 注意
|
||||||
catcode 已经退化,宏名在 `@` 处断开。
|
|
||||||
|
|
||||||
**规矩**:`hline` / `vline` 的线宽写字面值,别用宏包一层。
|
示例内容为虚构数据,使用时全部替换。签字栏留空手填。
|
||||||
|
|
||||||
⚠️ 关于 `1-Z` 与 `1,Z`:
|
|
||||||
|
|
||||||
| 写法 | 含义 | 效果 |
|
|
||||||
| :-- | :-- | :-- |
|
|
||||||
| `hline{1,Z}` | 第 1 条 + 最后 1 条 | 只有顶框和底框 |
|
|
||||||
| `hline{1-Z}` | 第 1 条到末条(全部) | 每条行线都画 |
|
|
||||||
|
|
||||||
本模板用 `1-Z`:**所有格线都画满**。只画外框时,跨行格(理论课)
|
|
||||||
与单行格的分界、以及数据行之间全是空白,非常容易看错行。这是
|
|
||||||
用户明确要求改掉的点。
|
|
||||||
|
|
||||||
代价是每列要再扣 0.5pt 表宽(见上文「画满全格线之后每列还要再扣」
|
|
||||||
一节),并且暴露出一个原本被掩盖的缺陷:跨行格里的第 3 行字一直
|
|
||||||
是贴着格线的(详见上文「行高」一节)。**画满格线会让所有"零留白"
|
|
||||||
的排版问题显形** —— 这是好事,但要预留调 `ht` 的时间。
|
|
||||||
|
|
||||||
### 坑 3:签字栏被挤到第 2 页
|
|
||||||
|
|
||||||
试过四种写法,只有最后一种同时满足「一页」+「不出界」:
|
|
||||||
|
|
||||||
| 写法 | 结果 |
|
|
||||||
| :-- | :-- |
|
|
||||||
| `\par\vspace{4mm}` + minipage | ✗ 翻页(minipage 紧跟 `\par` 是合法断页点) |
|
|
||||||
| `\vfill` 顶到底部 | ✗ 不翻页但**出界**:年月日 y=774.9,版心底只有 771.6 |
|
|
||||||
| `\vfill` + 块内 `\vspace*{5mm}` | ✗ 又翻页(`\vfill` 与块高之和超出剩余空间时,TeX 不接受压缩 `\vfill`,只能整块搬迁) |
|
|
||||||
| `\par\vspace{3mm}` + minipage | ✓ 一页,内容底 769.8,余 1.8pt |
|
|
||||||
|
|
||||||
**结论**:不要指望竖直胶帮你「自动贴底」。单页文档里最稳的是
|
|
||||||
**固定间距 + 实测校准** —— 改正文后重编一次,看内容底距 771.6 还有多少。
|
|
||||||
|
|
||||||
### 坑 4:minipage 内部用 `\hfill` 做右对齐
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\begin{minipage}{76mm}
|
|
||||||
任课教师(签字):\rule{40mm}{0.4pt}\par % 行尾没有 \parfillskip 弹性
|
|
||||||
\end{minipage}
|
|
||||||
```
|
|
||||||
|
|
||||||
minipage 里的行末会被拉伸到满宽,12pt 的字出现夸张字距 ——
|
|
||||||
实测「任」「课」「教」「师」被拉到 **34.8pt 一字**。
|
|
||||||
|
|
||||||
**正解**:minipage 内 `\raggedright`,`\hfill` 只放在外面:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\noindent\makebox[\textwidth][r]{\begin{minipage}{76mm}\raggedright ...\end{minipage}}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 坑 5:列表引导符「·」缺字
|
|
||||||
|
|
||||||
本库 OUC Serif 子集里**没有** `·`(U+00B7) 和 `•`(U+2022),
|
|
||||||
用它们会报 `Missing character: There is no · (U+00B7)`,印出来是空白。
|
|
||||||
|
|
||||||
实测该字体有 `●`(U+25CF) 与 `○`(U+25CB),且 `fonts.tex` 已把这两个
|
|
||||||
码位归入 CJK 字符类,可直接用。本模板用缩小 0.6 倍的 `●` 作引导符。
|
|
||||||
|
|
||||||
## 真实数据零泄漏
|
|
||||||
|
|
||||||
原件是**填过的实例**(真实课程名、学年、教师姓名、全部比例)。
|
|
||||||
本模板把这些逐项换掉:课程名 / 学年 / 教师名换成虚构的《数字逻辑》2025 秋
|
|
||||||
「张远航」,原件的比例也未保留。
|
|
||||||
|
|
||||||
已 grep 确认以下关键词在 `oucgrade.sty`、`成绩构成说明.tex` 与 `README.md`
|
|
||||||
中**零命中**(含注释):原件实例的课程名、学生人数、开课号、教师姓名、
|
|
||||||
单位名称,以及原件出现过的具体年份。本 README 不列出这些原文,
|
|
||||||
避免「为了证明零泄漏而把真实信息写进来」。
|
|
||||||
|
|
||||||
> 关于 `80`/`20`/`30`:样张里这几个数**不是从原件抄的**,是按「理论 80 +
|
|
||||||
> 实验 20、平时 30(作业 20 + 点名 10)+ 期末 70」重新配的一组自洽比例,
|
|
||||||
> 目的是让模板的比例校验(见前文「比例自洽校验」)能演示出「三项都成立」
|
|
||||||
> 的状态。原件那组比例本身有对不上的地方,不适合当范例。
|
|
||||||
|
|
||||||
## 字体
|
|
||||||
|
|
||||||
全部来自仓库公共字体包 `../fonts.tex`(唯一允许声明字体的地方):
|
|
||||||
|
|
||||||
| 用途 | 字体 | 授权 |
|
|
||||||
| :-- | :-- | :-- |
|
|
||||||
| 正文宋体 | OUC Serif(思源宋体 GB2312 子集) | SIL OFL 1.1 |
|
|
||||||
| 标题楷体 | OUC Kai(霞鹜文楷子集) | SIL OFL 1.1 |
|
|
||||||
| 分节黑体 | OUC Sans(思源黑体子集) | SIL OFL 1.1 |
|
|
||||||
| 西文 | TeX Gyre Termes | GUST Font License |
|
|
||||||
|
|
||||||
⚠️ 原件标题用的是**方正楷体_GB2312**,那是商业字体,本库不含也不能分发。
|
|
||||||
改用霞鹜文楷(同属楷书形态,开源可商用)。这是**有意的替换**,不是遗漏。
|
|
||||||
|
|
||||||
⚠️ 不要用 `\setCJKmainfont` 直接指定系统字体(SimSun / SimHei 等)——
|
|
||||||
换到 Linux / macOS 就编不出来。全部走 `../fonts.tex`。
|
|
||||||
+144
-160
@@ -1,210 +1,194 @@
|
|||||||
# 教材
|
# 教材
|
||||||
|
|
||||||
中国海洋大学 教材 LaTeX 模板。
|
教材、专著的成书排版,A4 多页,含封面、目录、章节、附录、参考文献。
|
||||||
|
|
||||||
版式从《软件需求工程导论》(sre 仓库)的成品书抽取而来,
|
|
||||||
保留其全部排版特性,正文内容为占位示例。
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd 教材
|
cd 教材
|
||||||
xelatex 教材.tex # 无参考文献时,单次即可
|
|
||||||
```
|
|
||||||
|
|
||||||
有参考文献时(本模板默认就有)走完整流程:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
xelatex 教材.tex
|
xelatex 教材.tex
|
||||||
bibtex 教材
|
bibtex 教材
|
||||||
xelatex 教材.tex
|
xelatex 教材.tex
|
||||||
xelatex 教材.tex
|
xelatex 教材.tex
|
||||||
```
|
```
|
||||||
|
|
||||||
或仓库根:`bash build.sh 教材`(已自动处理 bibtex)
|
或仓库根:`bash build.sh 教材`(自动依次跑完,含 bibtex)
|
||||||
|
|
||||||
## 文件
|
## 文件
|
||||||
|
|
||||||
| 文件 | 作用 |
|
| 文件 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `ouctextbook.sty` | 版式配置(编号层级、封面色、宏包、断行) |
|
| `教材.tex` | 主文件,书名与正文改这里 |
|
||||||
| `elegantbook.cls` | **本地化过的**文档类(改过字体,见下) |
|
| `ouctextbook.sty` | 版式配置 |
|
||||||
| `教材.tex` | 示例正文 |
|
| `elegantbook.cls` | 文档类 |
|
||||||
| `reference.bib` | 参考文献库(内容是虚构条目) |
|
| `reference.bib` | 参考文献库,换成自己的 |
|
||||||
| `README.md` | 本文件 |
|
|
||||||
|
|
||||||
## ⚠️ 唯一的结构性差异:本模板带一份 cls
|
## ⚠️ 前两行不能动
|
||||||
|
|
||||||
仓库其他模板只需 `\input{../fonts.tex}`。本模板还需要一份
|
|
||||||
**改过字体的 `elegantbook.cls`**,原因如下。
|
|
||||||
|
|
||||||
### elegantbook 的三档中文字体,全都不通用
|
|
||||||
|
|
||||||
| 选项 | 实际字体 | 问题 |
|
|
||||||
|---|---|---|
|
|
||||||
| `founder`(默认) | FZShuSong-Z01 / FZHei-B01 / FZKai-Z03 / FZFangSong-Z02 | **方正商业字体,不能分发** |
|
|
||||||
| `ctexfont` | 系统字体(Windows=SimSun/SimHei,macOS=PingFang) | 同一份源码三个平台三种样子 |
|
|
||||||
| `nofont` | 不设,交给用户 | 不配置就直接报错 |
|
|
||||||
|
|
||||||
### 但只写 nofont 还不够
|
|
||||||
|
|
||||||
`elegantbook.cls` 自身还硬编码了两处西文字体:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\setmainfont{TeXGyreTermesX}[...] % 西文衬线
|
\documentclass[lang=cn,newtx,10pt,black,chinesefont=nofont]{elegantbook}
|
||||||
\setsansfont{texgyreheros}[...] % 西文无衬线
|
\input{../fonts.tex}
|
||||||
```
|
```
|
||||||
|
|
||||||
这两款在精简版 TeX Live 和很多机器上都没有,会直接报
|
- `chinesefont=nofont` 必须写,否则会去加载系统字体或商业字体,跨平台不一致
|
||||||
|
- `\input{../fonts.tex}` 必须在 `\documentclass` 之后、`\begin{document}` 之前
|
||||||
|
|
||||||
```
|
## 书名信息
|
||||||
! Package fontspec Error: The font "texgyreheros-regular" cannot be found
|
|
||||||
```
|
|
||||||
|
|
||||||
而且是 9 个错误连发(类的每个字体档位都失败一次)。
|
|
||||||
|
|
||||||
**实测:在 `\documentclass` 之后用 `\setsansfont` 覆盖无效** ——
|
|
||||||
类加载时字体族已经注册失败,后面的重新指定救不回来。
|
|
||||||
|
|
||||||
### 所以 cls 必须本地化
|
|
||||||
|
|
||||||
模板目录里的 `elegantbook.cls` 相对上游改了三处,都带
|
|
||||||
「本地化」注释,便于将来对比上游版本:
|
|
||||||
|
|
||||||
| 位置 | 改动 | 原因 |
|
|
||||||
|---|---|---|
|
|
||||||
| 第 176 行附近 | `TeXGyreTermesX` → `texgyretermes`,加 `Path=../fonts/tex-gyre-termes/` | 用仓库自带字体 |
|
|
||||||
| 第 184 行附近 | `texgyreheros` → `OUCSans`,加 `Path=../fonts/ouc-sans/` | 仓库没有 Hero |
|
|
||||||
| `\maketitle` 内 | `example-image` → `\ouc@coverblank` | 无封面图时不插占位图 |
|
|
||||||
|
|
||||||
### 中文依赖链
|
|
||||||
|
|
||||||
`nofont` 模式下 elegantbook **不定义** `\songti` / `\heiti` / `\kaishu` /
|
|
||||||
`\fangsong`,但它的 `\cbfseries`、章节标题都依赖 `\heiti`。
|
|
||||||
|
|
||||||
这层依赖由 `../fonts.tex` 补上——那里已用 `\def` 定义这四个命令。
|
|
||||||
**若哪天 fonts.tex 改了这几个命令的名字,本模板的章节标题会立刻失去中文字体。**
|
|
||||||
|
|
||||||
## ⚠️ 封面:三个坑
|
|
||||||
|
|
||||||
### 1. 不写 `\cover{}` 会插一张 "Image" 占位图
|
|
||||||
|
|
||||||
elegantbook 在 `\maketitle` 里:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\ifcsname @cover\endcsname
|
\title{教材模板示例}
|
||||||
\includegraphics[width=\linewidth]{\@cover}
|
\subtitle{副标题写在这里}
|
||||||
\else
|
\author{作者甲 \quad 作者乙 \quad 作者丙}
|
||||||
\includegraphics[width=\linewidth]{example-image} ← mwe 宏包的灰底占位图
|
\institute{中国海洋大学}
|
||||||
\fi
|
\date{2026/11/1}
|
||||||
|
\version{第一版}
|
||||||
|
\extrainfo{出版社}
|
||||||
```
|
```
|
||||||
|
|
||||||
首页顶着 "Image" 两个大字。本地化版本已把 `else` 分支换成空盒子。
|
| 命令 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `\title{}` | 书名 |
|
||||||
|
| `\subtitle{}` | 副标题 |
|
||||||
|
| `\author{}` | 作者,多人用 `\quad` 隔开 |
|
||||||
|
| `\institute{}` | 单位 |
|
||||||
|
| `\date{}` | 日期 |
|
||||||
|
| `\version{}` | 版本 |
|
||||||
|
| `\extrainfo{}` | 出版社 |
|
||||||
|
|
||||||
### 2. 空盒子的宽度不能是 0
|
### 封面图
|
||||||
|
|
||||||
第一版把占位改成 `\rule{0pt}{0pt}`(0 宽),结果**冒出 5pt Overfull**,
|
不放图就只要纯色带封面。要放图:
|
||||||
且只出现在 `\maketitle` 那一行,怎么调 `\hspace`、`minipage` 宽度都去不掉。
|
|
||||||
|
|
||||||
根因:0 宽空盒让 `\linewidth` 在 titlepage 里的计算与 `\textwidth` 差了 5pt,
|
|
||||||
后续并排的 `\parbox` + 两个 `minipage` 就超了。
|
|
||||||
|
|
||||||
✅ 正解给占位盒一个满宽:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\ouc@coverblank}{\rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
|
\cover{cover.jpg}
|
||||||
```
|
```
|
||||||
|
|
||||||
实测 0 Overfull。
|
图片放进本目录。
|
||||||
|
|
||||||
### 3. 要真封面就写 `\cover{文件}`
|
### 封面色
|
||||||
|
|
||||||
把图片放进本目录,导言区加 `\cover{cover.jpg}` 即可,走插图分支。
|
默认青绿 RGB(32,178,170)。要换颜色,正文里调:
|
||||||
|
|
||||||
## 版式参数
|
|
||||||
|
|
||||||
```
|
|
||||||
页面 A4 210 × 297 mm
|
|
||||||
边距 上下 25.4mm,左右 20mm
|
|
||||||
headheight 2.17cm,headsep 4mm,footskip 12mm
|
|
||||||
字号 10pt(比仓库其他模板的 12pt 小,原教材如此)
|
|
||||||
行距 1.2 倍(elegantbook 默认)
|
|
||||||
封面色 RGB(32, 178, 170) 青绿
|
|
||||||
```
|
|
||||||
|
|
||||||
## 标题编号
|
|
||||||
|
|
||||||
```
|
|
||||||
章 1
|
|
||||||
节 1.1
|
|
||||||
小节 1.1.1
|
|
||||||
小小节 1.1.1.1 ← secnumdepth=3,编号最多到这里
|
|
||||||
第 5 级 (1)(2)(3) ← 不进编号体系,随小节重置
|
|
||||||
```
|
|
||||||
|
|
||||||
第 5 级为什么要单独处理:`secnumdepth=4` 会排出 `3.1.1.1.1` 这种过长编号,
|
|
||||||
教材里很难看。改用带括号的序号,与正文行文习惯一致。
|
|
||||||
|
|
||||||
## 章的标准结构
|
|
||||||
|
|
||||||
原教材 13 章全部遵循,做模板时保留:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\chapter{标题}
|
\oucSetCoverColor{blue}
|
||||||
导语(3~5 段,概述本章问题、结构、与相邻章的关系)
|
|
||||||
\section{...}
|
|
||||||
\section{本章小结} % 用 \oucsummary
|
|
||||||
\section{习题} % 用 \oucexercises
|
|
||||||
```
|
```
|
||||||
|
|
||||||
两个小节做成了命令,避免各章写法不一致。
|
## 文档结构
|
||||||
|
|
||||||
## 字体(全部来自仓库,无商业字体)
|
```latex
|
||||||
|
\begin{document}
|
||||||
| 用途 | 字体 | 来源目录 |
|
\maketitle % 标题页
|
||||||
|---|---|---|
|
\frontmatter % 前置部分,页码用罗马数字
|
||||||
| 中文正文 | OUC Serif | `../fonts/ouc-serif/` |
|
\tableofcontents % 目录
|
||||||
| 中文黑体 | OUC Sans | `../fonts/ouc-sans/` |
|
\chapter*{前言} % 前言(不进编号)
|
||||||
| 中文楷体(代斜体) | OUC Kai | `../fonts/ouc-kai/` |
|
\mainmatter % 正文,页码用阿拉伯数字
|
||||||
| 中文仿宋 | Zhuque Fangsong | `../fonts/zhuque-fangsong/` |
|
\chapter{第一章}
|
||||||
| 西文正文 | TeX Gyre Termes | `../fonts/tex-gyre-termes/` |
|
...
|
||||||
| 西文无衬线 | OUC Sans | `../fonts/ouc-sans/` |
|
\appendix % 附录,章号变 A、B、C
|
||||||
|
\chapter{附录一}
|
||||||
PDF 内嵌字体实测:
|
\nocite{*}
|
||||||
```
|
\printbibliography[heading=bibintoc, title=\ebibname]
|
||||||
OUCSerif-Regular / OUCSerif-Bold / OUCKai-Regular
|
\end{document}
|
||||||
TeXGyreTermes-Regular / -Bold / -Italic
|
|
||||||
LMMono10-Regular ← \texttt 用的等宽,TeX Live 自带
|
|
||||||
```
|
```
|
||||||
|
|
||||||
⚠️ `LMMono10` 是 Computer Modern 等宽字体,用于 `\texttt{}`(代码、DOI)。
|
## 章的标准写法
|
||||||
仓库 fonts.tex **没有配等宽字体**,elegantbook 也没有。它由 TeX Live
|
|
||||||
自带,WSL 和 Windows 两端都有,所以跨平台一致,不算问题。
|
|
||||||
要换成别的等宽字体,在导言区加 `\setmonofont{...}`。
|
|
||||||
|
|
||||||
## 验证
|
```latex
|
||||||
|
\chapter{章节标题}
|
||||||
|
|
||||||
```
|
本章导语,3~5 段,概述本章要解决的问题与结构。
|
||||||
8 页 error 0 Overfull 0 Underfull 0
|
|
||||||
字体全部来自 ../fonts/,无商业字体、无系统字体
|
\section{节标题}
|
||||||
全库 16/16 通过
|
正文段落。
|
||||||
|
|
||||||
|
\subsection{小节标题}
|
||||||
|
\subsubsection{小小节标题}
|
||||||
|
|
||||||
|
\paragraph{第五级标题}
|
||||||
|
这一级用「(1)(2)(3)」编号。
|
||||||
|
|
||||||
|
\oucsummary
|
||||||
|
本章小结正文。
|
||||||
|
|
||||||
|
\oucexercises
|
||||||
|
\begin{enumerate}
|
||||||
|
\item 习题一。
|
||||||
|
\end{enumerate}
|
||||||
```
|
```
|
||||||
|
|
||||||
⚠️ Windows 端本机未能编译(TeX Live 写字体缓存被安全策略拦截),
|
| 命令 | 说明 |
|
||||||
但模板只依赖 TeX Live 标准宏包与发行版自带字体,不涉及平台特有资源。
|
|---|---|
|
||||||
原教材本身就是在 Windows + TeX Live 2022 上编译的。
|
| `\chapter{}` | 章(1, 2, 3) |
|
||||||
|
| `\section{}` | 节(1.1) |
|
||||||
|
| `\subsection{}` | 小节(1.1.1) |
|
||||||
|
| `\subsubsection{}` | 小小节(1.1.1.1) |
|
||||||
|
| `\paragraph{}` | 第五级,用(1)(2)(3)编号 |
|
||||||
|
| `\oucsummary` | 印「本章小结」节标题 |
|
||||||
|
| `\oucexercises` | 印「习题」节标题 |
|
||||||
|
|
||||||
## 与原教材的差异
|
编号最多到第 4 级(1.1.1.1),第 5 级不再用点分编号,避免出现
|
||||||
|
「3.1.1.1.1」这种过长编号。`\paragraph` 的序号随 `\subsubsection` 重置。
|
||||||
|
|
||||||
| 项 | 原教材 | 本模板 | 原因 |
|
## 参考文献
|
||||||
|---|---|---|---|
|
|
||||||
| 封面图 | cover.jpg | 无(纯色带) | 模板不附图片 |
|
|
||||||
| 字体 | 方正四大字体 | 仓库开源字体 | 商业字体不能分发(#17 的规矩) |
|
|
||||||
| 西文无衬线 | texgyreheros | OUC Sans | 仓库没有 Hero |
|
|
||||||
| 正文 | 13 章 265 页 | 1 章示例 | 只抽骨架 |
|
|
||||||
|
|
||||||
## 已知问题
|
```latex
|
||||||
|
\addbibresource[location=local]{reference.bib} % 导言区
|
||||||
|
\nocite{*} % 正文末尾,引用全部条目
|
||||||
|
\printbibliography[heading=bibintoc, title=\ebibname]
|
||||||
|
```
|
||||||
|
|
||||||
`\texttt{}` 用的是 Computer Modern 等宽(LMMono10),与正文西文
|
`\nocite{*}` 表示列出文献库里全部条目。正式写作时删掉它,只列实际引用的。
|
||||||
Termes 风格不搭。成因是仓库未统一配置等宽字体,见上文字体表。
|
|
||||||
目前仅 2 处用到(示例里的 `booktabs` 和一条 DOI),不影响观感。
|
`reference.bib` 里的条目是虚构的,替换成自己的文献库。
|
||||||
|
|
||||||
|
## 插图与表格
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{image/xxx.png}
|
||||||
|
\caption{图标题}
|
||||||
|
\label{fig:example}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering
|
||||||
|
\caption{表标题}
|
||||||
|
\label{tab:example}
|
||||||
|
\begin{tabular}{|l|l|}
|
||||||
|
\hline
|
||||||
|
列一 & 列二 \\ \hline
|
||||||
|
\end{tabular}
|
||||||
|
\end{table}
|
||||||
|
```
|
||||||
|
|
||||||
|
图题在图下方,表题在表上方。`[H]` 强制图跟文字,教材排版常用。
|
||||||
|
|
||||||
|
TikZ 可直接画关系图、流程图:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\begin{tikzpicture}[box/.style={draw, rounded corners, align=center,
|
||||||
|
fill=blue!6, minimum width=3.2cm}]
|
||||||
|
\node[box] (a) at (0,0) {甲方};
|
||||||
|
\node[box] (b) at (4,0) {乙方};
|
||||||
|
\draw[->, thick] (a) -- (b);
|
||||||
|
\end{tikzpicture}
|
||||||
|
```
|
||||||
|
|
||||||
|
已加载的 TikZ 库:`shapes.geometric`、`shapes.misc`、`arrows.meta`、
|
||||||
|
`arrows`、`decorations.pathreplacing`、`decorations.markings`、
|
||||||
|
`positioning`、`calc`、`fit`、`backgrounds`。
|
||||||
|
|
||||||
|
## 版式
|
||||||
|
|
||||||
|
```
|
||||||
|
A4,边距 上下 25.4mm,左右 20mm
|
||||||
|
正文 10pt,行距 1.2 倍
|
||||||
|
标题:章 22pt 黑体,节 14pt 黑体
|
||||||
|
封面色带 RGB(32,178,170) 青绿
|
||||||
|
页码:前置罗马数字,正文阿拉伯数字
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意
|
||||||
|
|
||||||
|
示例内容为占位文字,使用时全部替换。
|
||||||
+59
-208
@@ -1,247 +1,98 @@
|
|||||||
# 特殊事项说明表 — 中国海洋大学 特殊事项说明表(LaTeX 版)
|
# 特殊事项说明表
|
||||||
|
|
||||||
把报销用的《中国海洋大学特殊事项说明表》Word 版复刻为 LaTeX 模板。
|
中国海洋大学报销用特殊事项说明表,A4 单页,含事项描述与三级签字审批。
|
||||||
版式与原 `.docx` **逐点对齐**(见文末「实测偏差」),
|
|
||||||
**不含任何真人信息**:事项描述是虚构的报销事由,三处日期留空待手写。
|
|
||||||
|
|
||||||
## 文件
|
|
||||||
|
|
||||||
| 文件 | 说明 |
|
|
||||||
| :-- | :-- |
|
|
||||||
| `特殊事项说明表.tex` | 主文件。填表只改第 1 节(4 个变量) |
|
|
||||||
| `ouccsx.sty` | 版式包。页面/字体/行高/全部尺寸写在这里,附换算注释 |
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
cd 特殊事项说明表
|
||||||
xelatex 特殊事项说明表.tex
|
xelatex 特殊事项说明表.tex
|
||||||
```
|
```
|
||||||
|
|
||||||
单页,跑一遍即可(无交叉引用)。
|
或仓库根:`bash build.sh 特殊事项说明表`
|
||||||
|
|
||||||
需要 **XeLaTeX**,并安装 `ctex`、`geometry`、`fontspec`、`xeCJK`、`fancyhdr`。
|
## 文件
|
||||||
实测环境:TeX Live 2022。
|
|
||||||
|
|
||||||
## 改内容
|
| 文件 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `特殊事项说明表.tex` | 主文件,填内容改这里 |
|
||||||
|
| `ouccsx.sty` | 版式包,一般不改 |
|
||||||
|
|
||||||
|
## 填写参数
|
||||||
|
|
||||||
|
全部在 `\begin{document}` 之前定义:
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\sxdesc}{% % 事项描述(必填)
|
\newcommand{\sxdesc}{%
|
||||||
因项目研讨需要,前往菏泽进行项目研讨与系统演示,因携带大件演示设备,
|
因渤海湾生态环境监测浮标需要例行维护,前往昌邑近岸观测站更换传感器……}
|
||||||
公共交通多有不便,因此采用自驾方式前往。}
|
|
||||||
|
|
||||||
\newcommand{\sxdateA}{} % 项目负责人签字处日期
|
\newcommand{\sxdateA}{} % 项目负责人签字处日期
|
||||||
\newcommand{\sxdateB}{} % 单位负责人签字处日期
|
\newcommand{\sxdateB}{} % 单位负责人签字处日期
|
||||||
\newcommand{\sxdateC}{} % 科技管理部门签字处日期
|
\newcommand{\sxdateC}{} % 科技管理部门签字处日期
|
||||||
```
|
```
|
||||||
|
|
||||||
就这四个。**表内其余文字全是学校规定原文,不要改** ——
|
| 参数 | 说明 |
|
||||||
「兹证明该事项真实有效,本人愿意为此承担责任。」「学院对本单位科研
|
|---|---|
|
||||||
经费使用承担监督和管理责任。」以及备注三条,都在 `ouccsx.sty` 里
|
| `\sxdesc` | 事项描述正文,可写多段(用 `\par` 分开) |
|
||||||
装配好了,改了就与原件不一致。
|
| `\sxdateA` | 项目负责人签字处日期 |
|
||||||
|
| `\sxdateB` | 单位负责人签字处日期 |
|
||||||
|
| `\sxdateC` | 科技管理部门签字处日期 |
|
||||||
|
|
||||||
### 关于 `\sxdesc`
|
### 日期怎么写
|
||||||
|
|
||||||
描述**可以写多段**,空行或 `\\` 分段都行,表格会自动让出空间:
|
留空则印成「 年 月 日」供手写。要打印具体日期:
|
||||||
|
|
||||||
- 写短 → 空白落在「描述区」与「签名区」之间,签名区位置不动
|
```latex
|
||||||
- 写长 → 空白被吃掉,签名区仍然不动
|
\newcommand{\sxdateA}{2026} % 只印年份
|
||||||
|
\newcommand{\sxdateA}{2026}{10}{28} % 但这不是正确写法
|
||||||
> 这是本模板比原 docx 更稳的地方。原件靠 R0 里的 **8 个空段** 给手写
|
|
||||||
> 留白,描述一写长就把签名区顶到下一行(Word 里也一样)。本模板删掉
|
|
||||||
> 那 8 个空段,改成「上下两半 + 中间 `\vfil`」,两头都不破版。
|
|
||||||
|
|
||||||
⚠️ 描述特别长时签名区会挤出行外 —— 这是内容超量的正常表现(Word 里
|
|
||||||
写太多同样会把格子撑高),把描述删短即可,不是 bug。
|
|
||||||
|
|
||||||
### 关于三处日期
|
|
||||||
|
|
||||||
留空则印成「 年 月 日」,签字时手写。
|
|
||||||
想直接打印就填年份:`\newcommand{\sxdateA}{2026}` 会印在「年」前面。
|
|
||||||
|
|
||||||
> 默认留空的理由同 `成绩构成说明`:印了年份就占掉手写空间,
|
|
||||||
> 而且报销常常是事后补开,日期往往就是签字那天。
|
|
||||||
|
|
||||||
## 版式数据来源
|
|
||||||
|
|
||||||
全部尺寸从原 `.docx` 的 OOXML 里量出来,换算关系:
|
|
||||||
|
|
||||||
- 长度:`mm = twips ÷ 1440 × 25.4`,`pt = twips ÷ 20`
|
|
||||||
- 字号:`w:sz` 是半磅值,`sz=21` ⇒ 10.5 pt
|
|
||||||
- 行距:`w:line` 是 1/20 pt,`lineRule="exact"` 时即精确值
|
|
||||||
|
|
||||||
| 项目 | docx 原值 | 换算 |
|
|
||||||
| :-- | :-- | :-- |
|
|
||||||
| 纸张 | `pgSz 11906×16838` | A4 210×297 mm |
|
|
||||||
| 页边距(上下) | `pgMar top/bottom 2155/1985` | 38.01 / 35.00 mm |
|
|
||||||
| 页边距(左右) | `pgMar left/right 1588/1474` | 28.01 / 26.00 mm |
|
|
||||||
| 表宽 | `tblW 9613` | 169.54 mm = 480.65 bp |
|
|
||||||
| 表左缩进 | `tblInd −546` | −9.63 mm(把表顶出版心) |
|
|
||||||
| 单元格内边距 | `tblCellMar 108` | 5.4 pt(左右),上下为 0 |
|
|
||||||
| 边框 | `tblBorders sz=4` | 0.5 pt |
|
|
||||||
| 字号 | 标题 `sz44`/正文 `sz21`/签字日期 `sz24`/页码 `sz28` | 22 / 10.5 / 12 / 14 pt |
|
|
||||||
| 行距 | 标题 `line500`/备注 `line300`/表内未设 | 25 / 15 pt/Word 单倍(字号×1.3) |
|
|
||||||
|
|
||||||
表格结构:**单列 3 行**(`tblGrid` 只有一个 `gridCol`,每行一个 `tc`),
|
|
||||||
即三行整宽方框上下叠。没有合并单元格、没有多列,所以没用 `tabularray`
|
|
||||||
—— 手工 `\vbox` 叠三块反而更可控(行高精确、内线不重复、内容可用 `\vfil` 撑)。
|
|
||||||
|
|
||||||
### 行高为什么用实测值而不是 `trHeight`
|
|
||||||
|
|
||||||
`trHeight` 是 5091 / 1140 / 634 twips,`hRule="atLeast"`。
|
|
||||||
`atLeast` 是「最小」,实际高度由内容撑开:
|
|
||||||
|
|
||||||
| 行 | `trHeight` | 实际被内容撑到 | 段落数 |
|
|
||||||
| :-- | :-- | :-- | :-- |
|
|
||||||
| R0 事项描述 | 254.55 pt | **284.00 bp** | 19 |
|
|
||||||
| R1 单位负责人 | 57 pt | **58.35 bp** | 4 |
|
|
||||||
| R2 科技管理 | 31.70 pt | **56.80 bp** | 4 |
|
|
||||||
|
|
||||||
照 `trHeight` 会让整表矮 40 bp。故取实测撑开后的高度。
|
|
||||||
|
|
||||||
## 六个必须知道的坑
|
|
||||||
|
|
||||||
这一节的每一条都是实测踩出来的,改 `ouccsx.sty` 之前务必看完。
|
|
||||||
|
|
||||||
### 1. 版心要取「表格宽度」,不是 docx 版心
|
|
||||||
|
|
||||||
原表宽 169.54 mm,比 docx 版心(156 mm)宽 13.54 mm,
|
|
||||||
靠 `tblInd = −546 twips` 向左顶出版心。
|
|
||||||
|
|
||||||
若把 `geometry` 设成 docx 版心(`left = 28.01mm`),表格必然超出版心
|
|
||||||
13.54 mm,报一条 `Overfull \hbox`,而且改内容时位置会漂。
|
|
||||||
|
|
||||||
⇒ 本包把版心**直接设成表格宽度**:`left = 16.47mm`、`totalwidth = 169.54mm`。
|
|
||||||
表格正好填满版心,零 Overfull,与原件逐点相同。
|
|
||||||
|
|
||||||
代价:标题若用 `\centering` 会落在 287.03 bp,而原件在 300.41 bp(居中于
|
|
||||||
docx 版心),偏左 13.4 bp。故标题另给 `\sxtitleindent` + `\sxtitlewidth`
|
|
||||||
把中心校回去 —— **不要**把标题改成 `\centering`。
|
|
||||||
|
|
||||||
### 2. `\baselineskip` 管不了本表的行距
|
|
||||||
|
|
||||||
本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68 bp),
|
|
||||||
因为 10.5 pt 与 12 pt 的字混排,Word 按「**下一行**字号 × 1.3」算。
|
|
||||||
|
|
||||||
而 `\baselineskip` **只在同一段落内部**管行距。一旦每行 `\par` 自成一段,
|
|
||||||
段与段之间是另一套规则:
|
|
||||||
|
|
||||||
```
|
|
||||||
段间基线距 = 上段末行深度 + \parskip + 本段首行字高
|
|
||||||
```
|
```
|
||||||
|
|
||||||
这里 `\parskip = 0`、首行字高由字体 ascent 定死,`\baselineskip` 根本没被读到。
|
正确写法是用完整版命令(三参数版本,写在同一行的花括号内):
|
||||||
实测第一版所有行距被压成 13.51,12 pt 的签名行也没变高,整表矮 2.25 bp。
|
|
||||||
|
|
||||||
⇒ 正解:不依赖 `\baselineskip`,逐行显式插胶:
|
```latex
|
||||||
|
\newcommand{\sxdateA}{\sxdatefull{2026}{10}{28}}
|
||||||
```
|
|
||||||
基线距 = 上盒深度 + \kern + 本盒高度
|
|
||||||
⇒ \kern = 目标距 − 上盒深度 − 本盒高度
|
|
||||||
```
|
```
|
||||||
|
|
||||||
这就是 `\sx@bl` / `\sx@blp` 的全部内容。与字体度量彻底解耦:换字体、
|
要只印年份就用 `\newcommand{\sxdateA}{2026}`,其余留空手填。
|
||||||
换字号、描述写长写短,行距一个 bp 都不变。
|
|
||||||
|
|
||||||
唯一的例外是「段内折行的长句」—— 那是一个段落里的多行,规则不同,
|
## 生成的表格
|
||||||
`\baselineskip` 在此**有效**,故 `\sx@blp` 仍给它。
|
|
||||||
|
|
||||||
### 3. 块首行必须用 `\kern`,不能用 `\vskip`
|
`\sxform` 一条命令印出整个表:
|
||||||
|
|
||||||
TeX 会**丢弃 `\vbox` 开头的胶**。用 `\vskip` 给的顶距会静默消失
|
```latex
|
||||||
(实测「事项描述:」给 10.53 只落到 5.38,等于只剩字高)。
|
\begin{document}
|
||||||
`\kern` 不受这条约束,且照样计入盒高。
|
\sxform
|
||||||
|
\end{document}
|
||||||
同理,块**末尾**不能用 `\vskip` 补空白(胶也被丢弃),
|
|
||||||
要用 `\sx@bl` 的可选参数 `#1` 直接撑末盒的深度。
|
|
||||||
|
|
||||||
### 4. 负的 `\kern` 不能被挡
|
|
||||||
|
|
||||||
相邻两行的目标距可能小于「上盒深度 + 本盒高度」。例:年月日行是 12 pt 字,
|
|
||||||
目标距 14.04,而 `2.99 + 12.06 = 15.05`,差值是 **−1.01**。
|
|
||||||
|
|
||||||
最初加了 `\ifdim\sx@tmp>\z@` 守卫,负值被静默吞掉 → 该行退回自然距 15.05,
|
|
||||||
整块错位 10 bp。负 `\kern` 在 TeX 里完全合法(盒间轻微重叠),不该挡。
|
|
||||||
|
|
||||||
### 5. 多行段落:`\ht` 参照的是**末行**基线
|
|
||||||
|
|
||||||
`\vbox` 的 `\ht = 首行高度 + (n−1)·行距`,它的参考点是**末行基线**。
|
|
||||||
|
|
||||||
所以「上一行基线 → 本段首行基线」的距离不是 `pd + kern + ht`,
|
|
||||||
而是 `pd + kern + ht − (n−1)·行距`。漏掉这一项,多行段自己被推下一整行,
|
|
||||||
其后所有行跟着错(实测 0.48 而非 14.04)。
|
|
||||||
|
|
||||||
⇒ 用 `\prevgraf` 取段内行数,把 `(n−1)·行距` 加回 `kern`。`\dp` 不用改 ——
|
|
||||||
`\vbox` 的 `\dp` 就是末行的真实深度。
|
|
||||||
|
|
||||||
⚠️⚠️ `\prevgraf` 有两道坎,两个都踩过:
|
|
||||||
- 必须在 `\vbox` **内部**取 —— 盒一关闭就恢复成外层值(实测把 2 读成 0)
|
|
||||||
- 必须在 `\par` **之后**取 —— 它是在段落断行那一步才被写入的(`\par` 前读到仍为 0)
|
|
||||||
|
|
||||||
### 6. `\vbox to N` 设的是**高度**,深度另计
|
|
||||||
|
|
||||||
若最后一项是带深度的 `\box`,`\vbox to N` 的 `\dp` 就是那个深度,
|
|
||||||
**总高变成 `N + 深度`**。本表末行深 3.11,于是 R0 变成 287.11 而非 284.00,
|
|
||||||
四条横线全部下移。
|
|
||||||
|
|
||||||
⇒ 末尾补一条 `\vskip\z@`:让末项变成胶(胶无深度),`\dp` 归零,
|
|
||||||
总高才正好等于 `N`。见 `\sx@cellvf`。
|
|
||||||
|
|
||||||
## 与原件的有意差异
|
|
||||||
|
|
||||||
| 项 | docx | 本模板 | 说明 |
|
|
||||||
| :-- | :-- | :-- | :-- |
|
|
||||||
| 字体 | 宋体 SimSun | OUC Serif(思源宋体子集) | 原用系统字体。改仓库公共字体包 `../fonts/`,换机器/换系统都能编,且允许分发 |
|
|
||||||
| 标题字体 | 方正小标宋简体 | OUC Serif **真粗体** | 小标宋是商业字体,本库不分发。按 `课程执行大纲/` 的既定做法换真粗体:小标宋本就是宋体的标题变体,真粗体比伪粗更接近,笔画不糊 |
|
|
||||||
| 第 3 条备注编号 | 手打的「 3. 」,无 `numPr` | 与前两条统一排齐 | 唯一的位置差异:原件该条比前两条偏 0.36 bp。原件是漏配自动编号后手打的,属笔误;本模板统一对齐 |
|
|
||||||
| R0 描述区留白 | 8 个空段 | 上下两半 + 中间 `\vfil` | 见上文「关于 `\sxdesc`」。描述长短不再影响签名区位置 |
|
|
||||||
|
|
||||||
除此之外**没有**任何版式差异。
|
|
||||||
|
|
||||||
## 实测偏差
|
|
||||||
|
|
||||||
不用肉眼看 PDF,直接用 `pymupdf` 取矢量坐标,与 Word 2007 导出的 PDF 逐项相减:
|
|
||||||
|
|
||||||
```python
|
|
||||||
span['origin'] # 真实基线坐标(bbox 顶端受字形上伸部影响,误差约 2 bp)
|
|
||||||
page.get_drawings() # 每条线的精确端点
|
|
||||||
```
|
```
|
||||||
|
|
||||||
结果(33 个文字元素 + 6 条线,`dY`/`dX` 为「本模板 − 原件」,单位 bp):
|
表格内容:
|
||||||
|
|
||||||
| 元素 | dY | dX |
|
| 区段 | 内容 |
|
||||||
| :-- | :-- | :-- |
|
|---|---|
|
||||||
| 标题 | 0.00 | −0.01 |
|
| 标题 | 特殊事项说明表 |
|
||||||
| 四条表格横线 | 0.00 | — |
|
| 事项描述 | `\sxdesc` 的内容,占主表区 |
|
||||||
| 事项描述 / 描述首行 / 次行 | 0.00 | +0.03 |
|
| 签字栏 | 三处签字与日期 |
|
||||||
| 兹证明 | 0.00 | +0.04 |
|
| 表尾 | 说明条款 |
|
||||||
| 项目负责人(签名) | 0.00 | +0.03 |
|
|
||||||
| 年月日(三处,各 3 字) | 0.00 | +0.03 |
|
|
||||||
| 项目负责人是 / 责任。/ 非科研经费 | 0.00 | +0.03 |
|
|
||||||
| 本人证明 / 单位负责人 / 单位公章 | 0.00 | +0.03 |
|
|
||||||
| 学院对本单位 | 0.00 | +0.03 |
|
|
||||||
| 科技管理 / 负责人签字 / 单位公章 | 0.00 | +0.03 |
|
|
||||||
| 备注四条 | −0.01 | −0.42 ~ −0.82 |
|
|
||||||
| 页码 | 0.00 | 0.00 |
|
|
||||||
|
|
||||||
**33 个文字元素的 dY 全部 0.00**(< 0.005 mm),dX ≤ 0.04 bp,
|
## 常用命令
|
||||||
唯备注区 dX 偏 0.42~0.82 bp(约 0.15~0.29 mm,肉眼不可辨)——
|
|
||||||
那是 OUC Serif 与 SimSun 的字宽差累积,不是定位误差。
|
|
||||||
|
|
||||||
像素级差分(150 dpi)总差异 3.03%,且每条差异带都精确落在有文字的行上,
|
| 命令 | 用途 |
|
||||||
**没有整体错位的偏移带** —— 3% 全是字形轮廓不同造成的。
|
|---|---|
|
||||||
|
| `\sxform` | 印出整张表 |
|
||||||
|
| `\sxtitle{标题}` | 改主标题文字 |
|
||||||
|
| `\sxtable` | 只印表格部分(不含标题) |
|
||||||
|
| `\sxnotes` / `\sxnoteitem` | 表尾说明条目 |
|
||||||
|
| `\sxfootcontent` | 表尾内容 |
|
||||||
|
| `\sxfonttitle` / `\sxfontbody` / `\sxfontsign` / `\sxfontfoot` | 各区块字体设置 |
|
||||||
|
|
||||||
## 校验方法
|
## 版式
|
||||||
|
|
||||||
量矢量而不是量像素:
|
```
|
||||||
|
A4,单页
|
||||||
```bash
|
标题黑体,正文宋体,签字栏楷体
|
||||||
pdftocairo -svg 特殊事项说明表.pdf out.svg # 线条精确坐标
|
三处签字:项目负责人 / 单位负责人 / 科技管理部门
|
||||||
pdftotext -bbox 特殊事项说明表.pdf out.xml # 字块坐标
|
|
||||||
```
|
```
|
||||||
|
|
||||||
或用 `pymupdf`(本模板就是这么核的):`page.get_drawings()` 取线,
|
## 注意
|
||||||
`get_text('rawdict')` 取 `span['origin']` 作基线。
|
|
||||||
|
|
||||||
⚠️ 注意 `bp` 与 `pt` 的不同:PDF 用户单位是 **bp**(1/72 in),
|
示例内容是虚构数据,使用时整段替换 `\sxdesc`。签字与日期栏留空手填。
|
||||||
LaTeX 的 `pt` 是 1/72.27 in,差 0.375%。A4 上累积到 2 pt,
|
|
||||||
超过一个字符宽。**本包凡与 PDF 对齐的几何量一律用 `bp`**。
|
|
||||||
+124
-78
@@ -1,84 +1,130 @@
|
|||||||
# 中国海洋大学科技报告 LaTeX 模板
|
# 科技报告
|
||||||
|
|
||||||
一个基于 `ctexart` 的科技报告模板,可用于撰写科技报告、实验讲义、教程、说明文档等。
|
科技报告、实验讲义、教程、说明文档,A4 多页,含封面、摘要、目录、正文。
|
||||||
|
|
||||||
> 本目录原为独立仓库 `ouc-report-latex-template`,2026-10 起并入 `ouc_latex_template` 统一维护,旧仓库不再更新。
|
## 编译
|
||||||
|
|
||||||
## 特性
|
```bash
|
||||||
|
cd 科技报告
|
||||||
- **中英文字体一体化**:英文默认使用鸿蒙字体(HarmonyOS Sans),中文使用仓库公共字体包(宋体 / 宋体粗 / 楷体 / 仿宋 / 黑体),字体文件在仓库根 `../fonts/` 目录,编译时自动调用,**无须安装任何字体**;
|
xelatex report.tex
|
||||||
- **模块化文档类**:`report.cls` 按功能拆分为 `cls/` 下的多个模块(全局设定、字体、页面布局、标题、页眉页脚、信息框、代码块等),便于按需修改;
|
xelatex report.tex % 跑两遍,目录与交叉引用才正确
|
||||||
- **三种信息框**:`titledbox`(带标题)、`notebox`(提示)、`importantbox`(重要),基于 tcolorbox 实现;
|
|
||||||
- **代码排版**:基于 listings 预设了多种样式,支持行内命令 `shellbox` / `invertedshellbox` 展示 shell 命令及输出;
|
|
||||||
- **自动水印**:默认以「单位 + 部门」作为全页水印,可在 `input/setting.tex` 中调整文字、透明度与大小;
|
|
||||||
- **图表与引用**:tabularx 表格、图片插入、自动编号与交叉引用、目录 / 图目录 / 表目录;
|
|
||||||
- **图标支持**:通过 fontawesome 可直接使用 `\faHeart` 等图标命令(详见根目录 `fontawesome.pdf`)。
|
|
||||||
|
|
||||||
## 环境要求
|
|
||||||
|
|
||||||
- **TeX 发行版**:TeX Live 2022 及以上(必须使用 **XeLaTeX** 编译);
|
|
||||||
- 无需额外安装字体或其他依赖,使用 `scheme-full` 或包含常用宏包的发行版即可。
|
|
||||||
|
|
||||||
## 使用方法
|
|
||||||
|
|
||||||
1. 本目录是 `ouc_latex_template` 仓库的 `科技报告/` 子目录,克隆主仓库即可:
|
|
||||||
```bash
|
|
||||||
git clone https://code.yangyq.net/laoyang/ouc_latex_template.git
|
|
||||||
cd ouc_latex_template/科技报告
|
|
||||||
```
|
|
||||||
2. 在 `input/info.tex` 中填写标题、副标题、作者、单位、部门等信息;
|
|
||||||
3. 在 `report.tex` 中撰写正文(或按 `\input` 方式组织章节文件);
|
|
||||||
4. 使用 XeLaTeX 编译**两遍**(第一遍生成目录与交叉引用信息,第二遍写入正文):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
xelatex report.tex
|
|
||||||
xelatex report.tex
|
|
||||||
```
|
|
||||||
|
|
||||||
5. 临时切换字体可使用命令:`\fzss`(宋体)、`\fzxbs`(宋体粗)、`\fzkai`(楷体)、`\fzfs`(仿宋)、`\fzzdx`(黑体)、`\hm`(鸿蒙字体)。命令名沿用旧版(fz 取自原方正系列),实际用的是随仓库分发的开源字体,对应关系见 `cls/font.cls` 的注释。
|
|
||||||
|
|
||||||
## 署名与联系方式(二次分发前请修改)
|
|
||||||
|
|
||||||
模板里有两处「作者 / 联系方式」信息,**性质不同,别改错地方**:
|
|
||||||
|
|
||||||
| 想改什么 | 改哪个文件的哪里 | 说明 |
|
|
||||||
|---|---|---|
|
|
||||||
| **模板维护者**的联系方式 | `report.cls` 顶部的 `Maintainer:` 一行 | 目前是占位符 `someone@example.com`。它只出现在注释里,**不参与排版**,改成什么都不会影响编译结果 —— 你要把这份模板再分发出去,就换成你自己的。 |
|
|
||||||
| **报告本身**的作者 / 单位 / 部门 | `input/info.tex` 里的 `\theauthor`、`\theaffiliation`、`\thedept` | 会印在**封面**上;单位与部门还会成为全页**水印**(水印的文字、透明度、大小在 `input/setting.tex` 里调)。 |
|
|
||||||
|
|
||||||
> 也就是说:`report.cls` 顶部那行与你的报告内容无关;报告里显示的作者信息一律在 `input/info.tex`。
|
|
||||||
|
|
||||||
## TeX Live 版本兼容性
|
|
||||||
|
|
||||||
同一份源码在下列 TeX Live 版本下均可直接编译(XeLaTeX),**不需要切分支、不需要改代码**:
|
|
||||||
|
|
||||||
| TeX Live | 状态 |
|
|
||||||
|------|------|
|
|
||||||
| 2022 | 已验证通过(基线) |
|
|
||||||
| 2023 | 已验证通过 |
|
|
||||||
| 2024 | 已验证通过 |
|
|
||||||
| 2025 | 已验证通过 |
|
|
||||||
| 2026 | 已验证通过 |
|
|
||||||
|
|
||||||
> 本目录原为独立仓库 `ouc-report-latex-template`,曾按 TeX Live 年份维护多套分支。
|
|
||||||
> 2026-10 并入 `ouc_latex_template` 后**只保留 `main` 一份源码**(已实测各年份通用),
|
|
||||||
> 旧仓库的分支不再更新。
|
|
||||||
|
|
||||||
## 目录结构
|
|
||||||
|
|
||||||
```
|
|
||||||
.
|
|
||||||
├── report.cls # 文档类(模块化加载 cls/ 下各子模块)
|
|
||||||
├── cls/ # 功能模块:全局设定、字体、页面、标题、信息框、代码块等
|
|
||||||
├── input/ # 文档内容:封面、目录、摘要、信息与整体设置
|
|
||||||
├── figs/ # 图片资源
|
|
||||||
├── (字体在仓库根 fonts/) # 不再自备字体,详见 ../fonts/README.md
|
|
||||||
├── fontawesome.pdf # fontawesome 图标使用手册
|
|
||||||
└── report.tex # 主文件(XeLaTeX 编译入口)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 关于 `report.pdf`
|
或仓库根:`bash build.sh 科技报告`(自动跑两遍)
|
||||||
|
|
||||||
仓库内的 `report.pdf` 是成品样张,用于预览效果。封面的日期取自 `\today`,
|
## 文件
|
||||||
所以**每次编译都会变**;用不同年份的 TeX Live 编译,PDF 体积也可能略有差异,
|
|
||||||
但**页面渲染内容一致**。以 `report.tex` 源码为准。
|
```
|
||||||
|
科技报告/
|
||||||
|
├── report.tex 主文件(一般不改,只做 \input)
|
||||||
|
├── input/ 内容与设置
|
||||||
|
│ ├── info.tex ← 标题、作者等信息,改这里
|
||||||
|
│ ├── setting.tex ← 页面、水印等设置
|
||||||
|
│ ├── cover.tex 封面
|
||||||
|
│ ├── toc.tex 目录
|
||||||
|
│ ├── abstract.tex 摘要
|
||||||
|
│ └── main/ 正文各章
|
||||||
|
├── cls/ 版式模块(11 个)
|
||||||
|
├── figs/ 插图
|
||||||
|
└── logos/ 校徽等标识
|
||||||
|
```
|
||||||
|
|
||||||
|
## 改标题信息
|
||||||
|
|
||||||
|
编辑 `input/info.tex`:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\newcommand{\themaintitle}{这是一个很好用的LaTex模板} % 标题
|
||||||
|
\newcommand{\thesubtitle}{这里是副标题} % 副标题
|
||||||
|
\newcommand{\theauthor}{作者名字} % 作者
|
||||||
|
\newcommand{\thedate}{\today} % 时间
|
||||||
|
\newcommand{\theaffiliation}{中国海洋大学} % 工作单位
|
||||||
|
\newcommand{\thedept}{计算机科学与技术学院} % 部门
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `\themaintitle` | 标题 |
|
||||||
|
| `\thesubtitle` | 副标题 |
|
||||||
|
| `\theauthor` | 作者 |
|
||||||
|
| `\thedate` | 日期,可写 `\today` 或具体日期 |
|
||||||
|
| `\theaffiliation` | 工作单位 |
|
||||||
|
| `\thedept` | 部门 |
|
||||||
|
|
||||||
|
## 改正文
|
||||||
|
|
||||||
|
`input/main/` 下按章分文件,`report.tex` 里按顺序 `\input`。
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\chapter{第一章标题}
|
||||||
|
正文内容。
|
||||||
|
|
||||||
|
\section{节标题}
|
||||||
|
\subsection{小节标题}
|
||||||
|
```
|
||||||
|
|
||||||
|
标准 LaTeX 章节命令。增删章节时改 `report.tex` 里的 `\input` 列表。
|
||||||
|
|
||||||
|
## 改封面与摘要
|
||||||
|
|
||||||
|
- `input/cover.tex` — 封面版式,一般不改
|
||||||
|
- `input/abstract.tex` — 摘要内容,替换其中的文字
|
||||||
|
|
||||||
|
## 页面设置
|
||||||
|
|
||||||
|
`input/setting.tex` 里可调:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\SetWatermarkText{\theaffiliation\thedept} % 水印文字
|
||||||
|
```
|
||||||
|
|
||||||
|
水印颜色在同一文件里:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
ouwblue!4!white % 想更淡改成 3,想明显改成 8
|
||||||
|
```
|
||||||
|
|
||||||
|
## 版式模块
|
||||||
|
|
||||||
|
`cls/` 下 11 个模块各管一块,需要改版式时按名字找:
|
||||||
|
|
||||||
|
| 模块 | 管什么 |
|
||||||
|
|---|---|
|
||||||
|
| `global.cls` | 全局设置 |
|
||||||
|
| `geometry.cls` | 页面尺寸与边距 |
|
||||||
|
| `font.cls` | 字体与字号 |
|
||||||
|
| `color.cls` | 配色(海大蓝等) |
|
||||||
|
| `title.cls` | 标题页 |
|
||||||
|
| `headandfoot.cls` | 页眉页脚 |
|
||||||
|
| `boxes.cls` | 盒子环境 |
|
||||||
|
| `code.cls` | 代码块 |
|
||||||
|
| `figs.cls` | 插图设置 |
|
||||||
|
| `chinesename.cls` | 中文名称(图、表、参考文献等) |
|
||||||
|
| `hyperref.cls` | 超链接设置 |
|
||||||
|
|
||||||
|
## 插图
|
||||||
|
|
||||||
|
图片放 `figs/`,正文里:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{figs/xxx.png}
|
||||||
|
\caption{图标题}
|
||||||
|
\label{fig:xxx}
|
||||||
|
\end{figure}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 版式
|
||||||
|
|
||||||
|
```
|
||||||
|
A4,多页
|
||||||
|
封面 + 摘要 + 目录 + 正文
|
||||||
|
页眉页脚含章节名与页码
|
||||||
|
整页带极浅水印(单位名称)
|
||||||
|
正文宋体,标题黑体
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意
|
||||||
|
|
||||||
|
示例内容为占位文字,使用时全部替换。
|
||||||
+115
-349
@@ -1,374 +1,140 @@
|
|||||||
# 中国海洋大学个人简历 LaTeX 模板
|
# 简历
|
||||||
|
|
||||||
中文个人简历模板,A4 单页两栏式排版:左侧窄栏放时间与阶段,右侧宽栏放具体内容,抬头带圆形头像与联系方式图标行。
|
个人简历,A4,中文,两栏式,含圆形头像与分区条目。
|
||||||
|
|
||||||
> 本目录的版式来自一份在用的中文简历(`awesome-source-cv` 系的衍生版)。**字体、占位内容、头像三处都已重做**,详见下文「与上游的差别」。
|
|
||||||
|
|
||||||
## 特性
|
|
||||||
|
|
||||||
- **字体全部取自仓库公共字体包**:中文 OUC Serif(宋体)/ OUC Sans(黑体)/ OUC Kai(楷体)/ Zhuque Fangsong(仿宋),西文 Cochineal,图标 FontAwesome —— 没有任何一个字体来自系统或 TeX Live 安装,**换机器编译结果一致**;
|
|
||||||
- **真粗体**:标题、姓名、区块头用的都是字体自带的粗体,不是算法描边;
|
|
||||||
- **分区可拆**:`section_01` ~ `section_10` 各自一个文件,不想要哪块就把对应 `\input` 注释掉;
|
|
||||||
- **圆形头像**:`\photo{2.5cm}{photo}` 自动裁成圆形,尺寸随参数走;
|
|
||||||
- **条目化排版**:论文、专利、项目、获奖等用 `\emptySeparator` 分条,时间栏自动对齐。
|
|
||||||
|
|
||||||
## 环境要求
|
|
||||||
|
|
||||||
- TeX Live 2022 及以上,**必须 XeLaTeX** 编译;
|
|
||||||
- 不需要安装任何字体,`fonts/` 里有全套。
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
在**本目录**下编译(不要在仓库根调用,`fonts.tex` 里的 `Path=../fonts/` 是相对当前工作目录的):
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd 简历
|
cd 简历
|
||||||
xelatex 简历.tex
|
xelatex 简历.tex
|
||||||
xelatex 简历.tex # 必须跑两遍,原因有二:
|
xelatex 简历.tex % 跑两遍,目录与页码才正确
|
||||||
# ① 页码与交叉引用
|
|
||||||
# ② 概述的成果数字读自 简历.cvnum,第一遍是空的
|
|
||||||
```
|
```
|
||||||
|
|
||||||
用 `latexmk -xelatex 简历.tex` 也行,它自己会跑够遍数。
|
或仓库根:`bash build.sh 简历`(自动跑两遍)
|
||||||
|
|
||||||
编译结果:3 页,日志零 error、零 Underfull、零 Overfull。嵌入字体只有 7 个,全部来自本仓库:
|
## 文件
|
||||||
|
|
||||||
| 字体 | 用途 |
|
```
|
||||||
|
简历/
|
||||||
|
├── 简历.tex 主文件
|
||||||
|
├── awesome-source-cv.cls 文档类
|
||||||
|
├── section_XX_*.tex 各章节内容(14 个)
|
||||||
|
├── photo.jpg 头像
|
||||||
|
└── logos/ 单位标识
|
||||||
|
```
|
||||||
|
|
||||||
|
## 基本信息
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\documentclass[localFont]{awesome-source-cv}
|
||||||
|
\input{../fonts.tex}
|
||||||
|
\usepackage{xeCJK}
|
||||||
|
|
||||||
|
\name{}{张远航} % 姓名,第一参数是西文名,中文留空
|
||||||
|
\photo{2.5cm}{photo} % 头像,photo.jpg
|
||||||
|
|
||||||
|
\socialinfo{
|
||||||
|
\smartphone{(+86) 138 0000 0000}
|
||||||
|
\email{yhzhang@ouc.edu.cn}
|
||||||
|
\emailO{yhzhang@example.net}\\
|
||||||
|
\homepage{https://example.net}
|
||||||
|
\github{yourname}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 命令 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `OUCSerif-Regular` / `OUCSerif-Bold` | 中文正文与标题 |
|
| `\name{西文名}{中文名}` | 姓名,中文简历第一参数留空 |
|
||||||
| `Cochineal-Roman` / `-Bold` / `-Italic` | 西文正文、标题与斜体 |
|
| `\photo{宽度}{文件名}` | 头像,文件名不带扩展名 |
|
||||||
| `OUCKai-Regular` | 中文斜体(楷体代斜体,中文惯例) |
|
| `\socialinfo{...}` | 联系方式块 |
|
||||||
| `FontAwesome` | 联系方式行图标 |
|
| `\smartphone{号码}` | 手机 |
|
||||||
|
| `\email{地址}` | 邮箱 |
|
||||||
|
| `\emailO{地址}` | 备用邮箱 |
|
||||||
|
| `\homepage{网址}` | 个人主页 |
|
||||||
|
| `\github{用户名}` | GitHub |
|
||||||
|
| `\linkedin{用户名}` | LinkedIn |
|
||||||
|
|
||||||
## 改什么、在哪儿改
|
`\socialinfo` 内不要加结尾的 `\\`。不想要头像就删掉 `\photo` 整行。
|
||||||
|
|
||||||
| 要改的内容 | 位置 |
|
## 各章节
|
||||||
|
|
||||||
|
正文按 `\input` 顺序组织,每章一个文件:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\begin{document}
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
\input{section_01_headline}
|
||||||
|
\input{section_02_work_experience}
|
||||||
|
\input{section_03_education}
|
||||||
|
\input{section_04_publications}
|
||||||
|
\input{section_05_patents}
|
||||||
|
\input{section_06_software}
|
||||||
|
\input{section_07_project}
|
||||||
|
\input{section_08_zhuanhua}
|
||||||
|
\input{section_09_jiaoyan}
|
||||||
|
\input{section_10_awards}
|
||||||
|
\input{section_interests}
|
||||||
|
\input{section_languages}
|
||||||
|
\input{section_skills}
|
||||||
|
\input{section_references}
|
||||||
|
\end{document}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 文件 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 姓名、职称、联系方式 | `简历.tex` 的 `\name` / `\tagline` / `\socialinfo` |
|
| `section_01_headline` | 个人概述 |
|
||||||
| 头像 | 替换 `photo.jpg`(正方形,400×400 以上,会自动裁圆) |
|
| `section_02_work_experience` | 工作经历 |
|
||||||
| 各区块正文 | `section_01_headline.tex` ~ `section_10_awards.tex` |
|
| `section_03_education` | 教育经历 |
|
||||||
| 不想显示的区块 | 在 `简历.tex` 里把对应 `\input` 注释掉 |
|
| `section_04_publications` | 学术论文 |
|
||||||
| 左侧时间栏宽度 | `awesome-source-cv.cls` 的 `\setlength{\leftcolumn}{2.5cm}`,右侧栏宽会自动跟着算 |
|
| `section_05_patents` | 发明专利 |
|
||||||
| 主题色 | `awesome-source-cv.cls` 的 `accentcolor` |
|
| `section_06_software` | 软件著作权 |
|
||||||
|
| `section_07_project` | 科研项目 |
|
||||||
|
| `section_08_zhuanhua` | 成果转化 |
|
||||||
|
| `section_09_jiaoyan` | 教研工作 |
|
||||||
|
| `section_10_awards` | 获奖 |
|
||||||
|
| `section_interests` | 兴趣爱好 |
|
||||||
|
| `section_languages` | 语言能力 |
|
||||||
|
| `section_skills` | 专业技能 |
|
||||||
|
| `section_references` | 推荐人 |
|
||||||
|
|
||||||
## 与上游的差别(改动都在文件头注释里写明了原因)
|
不需要的章节把 `\input` 那行注释掉即可。
|
||||||
|
|
||||||
### 1. 字体:三层依赖全部拆掉
|
## 章节写法
|
||||||
|
|
||||||
上游那份简历的字体走三条路,每条都不能随仓库分发或不可复现:
|
|
||||||
|
|
||||||
| 上游做法 | 问题 | 本模板的处理 |
|
|
||||||
|---|---|---|
|
|
||||||
| `zh_cn-adobefonts_external.sty` 设 Adobe 宋/黑/楷/仿 | 56 MB 商业字体,无授权不可分发 | **删掉这两个文件**,改由 `../fonts.tex` 提供中文字体 |
|
|
||||||
| `awesome-source-cv.cls` 的 `localFont` 分支设 `SourceSansPro-*`(9 个 .otf) | 同上,且与仓库已有西文字体重复 | cls 里的 `\setmainfont` 整段删除,西文改走 `../fonts.tex` 提供的 Cochineal |
|
|
||||||
| `fontawesome.sty` 用字体名找系统 FontAwesome | 机器上没装就编不过 | 改成显式 `Path=../fonts/fontawesome/`,字体文件已入仓库 |
|
|
||||||
|
|
||||||
删掉的两个文件里还有个隐藏问题值得记一笔:原 `zh_cn-adobefonts_external.sty` 里
|
|
||||||
`BoldFont` / `ItalicFont` / `SmallCapsFont` **全部指向 `Regular` 那一档** ——
|
|
||||||
等于加粗不变、斜体不变,标题层次全靠字号撑。换成真粗体后版面明显立起来了。
|
|
||||||
|
|
||||||
### 2. 内容:真人信息全部换成一套完整虚构示例
|
|
||||||
|
|
||||||
模板必须能公开分发,所以原件里的真人姓名、手机、邮箱、住址、出生年月、论文题名与 DOI、
|
|
||||||
专利号、软著登记号、获奖名称**一个都没保留**。
|
|
||||||
|
|
||||||
替换方式**不是全打 `×××`**——满篇叉号的样张既看不出排版效果,也没法直接对着改,
|
|
||||||
一页纸全是 ×,读的人都不知道哪行该填什么。所以填的是**一整套自洽的虚构人物**:
|
|
||||||
|
|
||||||
| 项 | 虚构值 |
|
|
||||||
|---|---|
|
|
||||||
| 姓名 / 单位 | 张远航,中国海洋大学 信息科学与工程学部 计算机科学与技术学院 **教授、博导** |
|
|
||||||
| 出生 / 籍贯 | 1985.03,山东青岛 |
|
|
||||||
| 方向 | 海洋遥感信息处理、机器学习与海洋大数据 |
|
|
||||||
| 手机 / 邮箱 | `(+86) 138 0000 0000` / `yhzhang@ouc.edu.cn` |
|
|
||||||
| 学历 | 2002–2006 本科 → 2006–2009 硕士 → 2009–2013 博士(2011–2012 南安普顿大学联培) |
|
|
||||||
| 工作 | 2013.07 博士后 → 2016.09 副教授 → 2021.12 教授 |
|
|
||||||
|
|
||||||
正文十节(`section_01`~`section_10`)也一并填满:80 余字个人简介、3 段工作经历、
|
|
||||||
4 段学历、9 篇论文、9 项专利、5 项软著、5 个项目、3 项成果转化、4 项教研项目、16 项获奖。
|
|
||||||
|
|
||||||
**假数据都留了肉眼可辨的标记**,不会被人误当真的抄走:
|
|
||||||
|
|
||||||
- 论文 DOI 统一 `10.9999/…`(`.9999` 段是编造专用段,真实 DOI 不走这里)
|
|
||||||
- 专利号统一 `ZL20999900000N.x`,软著登记号统一 `2024SR999990N`
|
|
||||||
- 期刊名是真实的(IEEE TGRS、Remote Sensing 等),但**题名全是编的**
|
|
||||||
- 成果转化的受让单位一律带「(示例)」后缀
|
|
||||||
- 头像 `a.jpg` / `a.png`(2085×2085 的真人照)换成 PIL 生成的 400×400 中性剪影 `photo.jpg`
|
|
||||||
|
|
||||||
替换时把 `section_01`~`section_10` 整段换成自己的即可,版式不受影响;
|
|
||||||
字数变化会自动重排,不需要动 `.cls`。
|
|
||||||
|
|
||||||
### 3. 排版小修
|
|
||||||
|
|
||||||
- **项目经验不再「缩进一大截」**:这一节原来整块右移了约 3.4 cm,与其他章节的
|
|
||||||
日期列对不齐(145.1pt vs 48.5pt)。根因不是 `\hfill` 也不是竖线,而是
|
|
||||||
`\rightcolumnlength` **算早了**——`geometry` 的边距要到导言区结束才生效,
|
|
||||||
而 cls 里那句 `\setlength` 执行得更早,读到 article 默认的 345pt 文字宽,
|
|
||||||
算出 249.87pt,比应有的 417.02pt 少了 167.15pt;`longtable` 把这张窄表居中排,
|
|
||||||
于是整块右移 167.15/2 ≈ 83.6pt。修法两条:计算挪进 `\AtBeginDocument`
|
|
||||||
(并额外减去 `|` 竖线的 `\arrayrulewidth`=0.4pt);`R` 列由
|
|
||||||
`>{\hfill}m{2.5cm}`(固定宽右贴)改为 `>{\raggedright\arraybackslash}p{2.5cm}`。
|
|
||||||
改后日期左边缘 145.1 → **48.5pt**,与工作经历/教育经历/奖励与荣誉严格一致。
|
|
||||||
⚠️ 这类错误**零 error、零 warning**,只看日志发现不了,必须量 PDF 坐标。
|
|
||||||
- **左栏宽度改按版心反算**:原来 `\leftcolumn 2.5cm + \rightcolumnlength 14.8cm`
|
|
||||||
看着小于版心 18 cm,但两列共 4 个 `\tabcolsep`(≈0.85 cm)没算进去,实际 18.15 cm,
|
|
||||||
日志有 `Overfull 4.48pt`。改成由 `\textwidth` 减去左列、列间距与竖线宽度,
|
|
||||||
改页边距也不用再调数字。
|
|
||||||
- **中西文之间加断行弹性**:论文条目里「…Applications (ICIEA), 88--93. 中国青岛…」
|
|
||||||
这类「长英文名紧跟中文」的串,XeLaTeX 默认不在中英交界处断开,会把整串当
|
|
||||||
一个长单词硬冲出去(实测冲出 88.5pt,文字顶到纸边)。给 itemize 加
|
|
||||||
`\emergencystretch=3em` 解决,不动字体、不改内容、不影响其他环境。
|
|
||||||
- **抬头去掉两处空盒**:`\vspace*{0.3cm}\\` 和 `\smallskip\\` 会在换行前多产生一个
|
|
||||||
空 hbox(日志刷 `Underfull \hbox (badness 10000)`),改成 `\\[0.3cm]` /
|
|
||||||
`\\[\smallskipamount]`,间距效果不变。
|
|
||||||
- **`\socialinfo` 末尾不要留 `\\`**:`简历.tex` 里最后一行 `\address{...}` 后面加了
|
|
||||||
`\\` 同样会多一个空行。中间的 `\\` 是分行,必须保留。
|
|
||||||
|
|
||||||
### 4. 西文字体换成 Cochineal
|
|
||||||
|
|
||||||
中文用思源宋体(中等粗细),原先配的 **TeX Gyre Termes** 是 Times 的度量兼容替代,
|
|
||||||
笔画偏细偏紧,中英混排时西文那一段视觉上会「陷进去」。改用 **Cochineal**
|
|
||||||
(Michael Sharpe 据 Minion 设计,SIL OFL 1.1,920 KB 已入 `../fonts/cochineal/`)。
|
|
||||||
|
|
||||||
| 字体 | 同一句英文宽(10pt) | 相对 Termes | x 高 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| TeX Gyre Termes(原) | 229.68pt | 100.0% | 0.450 |
|
|
||||||
| **Cochineal(现)** | 225.42pt | **98.1%** | 0.433 |
|
|
||||||
| Libertinus Serif | 234.62pt | 102.2% | 0.433 |
|
|
||||||
| XCharter | 246.69pt | 107.4% | 0.481 |
|
|
||||||
| TeX Gyre Pagella | 254.40pt | 110.8% | 0.472 |
|
|
||||||
|
|
||||||
选 Cochineal 的理由是**宽度几乎不变(窄 1.9%)**,断行位置和表格列宽基本不动;
|
|
||||||
Pagella / XCharter 宽 7~11%,会把全库的断行推着变。
|
|
||||||
|
|
||||||
⚠️ 三点务必注意:
|
|
||||||
|
|
||||||
1. **只影响简历**。切换命令 `\oucUseCochineal` 定义在 `../fonts.tex`,
|
|
||||||
但**不是**全局生效,只有本模板的 cls 调用。改全库请改 `\setmainfont` 本身。
|
|
||||||
2. **必须放在 `\AtBeginDocument` 里**。cls 执行时主文件还没 `\input{../fonts.tex}`,
|
|
||||||
那个命令尚未定义,直接调用会报 `Undefined control sequence`。
|
|
||||||
3. **换西文字体后必须复查 Overfull**。字体窄 1.9% 会让断点位置整体前移,
|
|
||||||
原本「刚好挤进去」的长串就会暴露成真溢出——本次换字体就是这样才发现
|
|
||||||
ICIEA 那条论文冲出 88.5pt 的。
|
|
||||||
|
|
||||||
### 5. 左上角校徽(可选)
|
|
||||||
|
|
||||||
默认**不印**校徽,`简历.tex` 里加一行才出现:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\cvlogo{28mm} % 横式彩色校徽(默认)
|
\sectionTitle{工作经历}{\faUniversity}
|
||||||
\cvlogo{28mm}[ouc_logo_彩色] % 换圆形校徽
|
|
||||||
\cvlogo{28mm}[ouc_横式_海大红] % 换配色
|
\begin{tabular}{rl}
|
||||||
|
\textsc{2021年12月 --至今} & \textbf{教授},信息科学与工程学部,中国海洋大学\\
|
||||||
|
\textsc{2016年09月 --2021年11月} & \textbf{副教授},信息科学与工程学部,中国海洋大学
|
||||||
|
\end{tabular}
|
||||||
```
|
```
|
||||||
|
|
||||||
位置默认距**纸边**左 10mm、上 6mm(不随页边距变),导言区可微调:
|
- `\sectionTitle{标题}{图标}` — 章节标题,图标用 fontawesome
|
||||||
|
- 两列 `tabular`:左列时间(`\textsc` 小型大写),右列内容
|
||||||
|
- 时间用 `--` 排连接号,前后不加空格
|
||||||
|
|
||||||
```latex
|
常用 fontawesome 图标:
|
||||||
\setlength{\cvlogox}{12mm}
|
`\faUniversity`(学校)、`\faBriefcase`(工作)、`\faGraduationCap`(教育)、
|
||||||
\setlength{\cvlogoy}{8mm}
|
`\faBook`(论文)、`\faCogs`(软著)、`\faFlask`(项目)、
|
||||||
|
`\faTrophy`(获奖)、`\faHeart`(兴趣)、`\faGlobe`(语言)。
|
||||||
|
|
||||||
|
## 换头像
|
||||||
|
|
||||||
|
替换 `photo.jpg`,或改 `\photo{2.5cm}{新文件名}`。图片要是方形,
|
||||||
|
会裁成圆形。
|
||||||
|
|
||||||
|
## 版式
|
||||||
|
|
||||||
|
```
|
||||||
|
A4,单页或多页
|
||||||
|
中文正文 OUC Serif,西文 Cochineal
|
||||||
|
左栏较窄(时间),右栏较宽(内容)
|
||||||
|
章节标题带图标与分隔线
|
||||||
|
头像为圆形,右上角
|
||||||
```
|
```
|
||||||
|
|
||||||
`简历/logos/` 下**只放实际用到的那一个**(横式彩色,377 KB)。想换款式从
|
## 注意
|
||||||
`../科技报告/logos/` 复制过来——那边是全部官方 VI 素材:
|
|
||||||
|
|
||||||
| 文件 | 形状 | 像素 |
|
示例内容为虚构数据,使用时全部替换。
|
||||||
|---|---|---|
|
|
||||||
| `ouc_logo_{彩色,海大红,海大蓝,天蓝,专金,墨黑}.png` | 圆形 | 1200×1200 |
|
|
||||||
| `ouc_横式_{彩色,海大红,海大蓝,黑}.png` | 横式 | 2400×640 |
|
|
||||||
|
|
||||||
不预先全放进来,是因为每个 300~380 KB,用不到就是纯占体积。
|
|
||||||
|
|
||||||
⚠️ 四点务必注意:
|
|
||||||
|
|
||||||
1. **28mm 是这块空间的上限附近**。简历页边距只有 15mm,姓名墨迹顶在 17.2mm;
|
|
||||||
28mm 宽的横式 logo 高 7.06mm,放在距顶 6mm 处下沿到 13.1mm,距姓名仍有
|
|
||||||
11.6pt(4.1mm)。再大就会挤到姓名。
|
|
||||||
2. **距顶不能照搬科技报告的 20mm**。科技报告页边距 27mm,简历只有 15mm,
|
|
||||||
照抄会直接压到姓名上。同理距顶 8mm 只剩 2mm 间隙,视觉上贴着。
|
|
||||||
3. **必须用负 `\vspace*{-17pt}` 抵消**。`tikzpicture` 即使内容全是 `overlay`,
|
|
||||||
本身仍占一行高度(17pt),会把姓名整体往下推。`\smash`、`\hbox to 0pt`、
|
|
||||||
`\vbox to 0pt` 三种写法都消不掉——要断行就得有 `\par`,有 `\par` 就有行高。
|
|
||||||
这 17pt 与 logo 尺寸无关(18~30mm 五档实测一致),改 `\parskip` 或正文字号
|
|
||||||
后需重新量。
|
|
||||||
4. **位置偏小,专业印刷需上调**。距纸左 10mm 已接近 A4 裁切余量(一般
|
|
||||||
10~12mm),距顶 6mm 也偏紧。屏幕阅读和普通办公打印没问题(A4 不裁切),
|
|
||||||
若要印刷装订,把 `\cvlogoy` 改成 8mm 以上,并接受 logo 与姓名靠得近一点。
|
|
||||||
|
|
||||||
⚠️ 体积代价:PDF 从 158 KB 涨到 573 KB(内嵌 2400×605 的原图,实际只用到
|
|
||||||
28mm ≈ 660px,约 3.6 倍冗余)。保留原图是为了将来放大不糊;真要瘦身,
|
|
||||||
把 png 缩到 700px 宽即可。
|
|
||||||
|
|
||||||
## 概述里的成果数字自动统计
|
|
||||||
|
|
||||||
第一段概述通常要写「发表论文 N 篇、授权专利 M 项、转化 K 项……」。这些数字如果
|
|
||||||
手写,每增删一条论文就得回头改概述,非常容易漏改。本模板让它们**自动从正文条目
|
|
||||||
数出来**。
|
|
||||||
|
|
||||||
### 先回答一个最常问的问题:它是全自动的吗?
|
|
||||||
|
|
||||||
**分两种,取决于章节用哪种写法。**
|
|
||||||
|
|
||||||
| 写法 | 要手动做什么 | 适合什么章节 |
|
|
||||||
|---|---|---|
|
|
||||||
| **`cvlist` 环境**(全自动) | **什么都不用做**。写 `\item` 就自动算一条。 | 一条 = 一个成果的章节:软著、成果转化、教研项目 |
|
|
||||||
| **`\cvmark` 逐条标记**(半自动) | 每条末尾加一个 `\cvmark{类别}` | 一条要算进**多个类别**的章节:专利(要同时算「专利」和「第一发明人」)、科研项目(要同时算「科研项目」和「主持/负责」) |
|
|
||||||
| **`\cvtagcount`**(半自动) | 每条末尾写 `\cvtagcount{SCI}`,替代原来的 `\textbf{SCI}` | 论文(收录类型本来就要显示出来,顺手计数) |
|
|
||||||
|
|
||||||
也就是说:**三个你关心的章节(软著、成果转化、教研项目)已经是全自动的,不需要
|
|
||||||
任何标记。** 增删条目后重新编译,概述里的数字自己就变了。
|
|
||||||
|
|
||||||
### 全自动写法:`cvlist` 环境
|
|
||||||
|
|
||||||
这是最省事的方式。原来写 `\begin{itemize}`,现在改成 `\begin{cvlist}{类别}`,
|
|
||||||
其他一个字都不用动:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
% 软著章节
|
|
||||||
\sectionTitle{软件著作权}{\faTv}
|
|
||||||
\begin{cvlist}{软著} % ← 只改这一行(原来是 itemize)
|
|
||||||
\item 某某系统. 2024SR9999901. 软著登字第 9999901 号.
|
|
||||||
\item 另一个系统. 2023SR9999902. 软著登字第 9999902 号.
|
|
||||||
\end{cvlist} % ← 和这一行(原来是 \end{itemize})
|
|
||||||
|
|
||||||
% 概述里
|
|
||||||
登记软件著作权 \cvnum{软著} 项 % → 自动印出「2」
|
|
||||||
```
|
|
||||||
|
|
||||||
**就这样。** 以后加一条只是多写一个 `\item ...`,数字自动从 2 变 3;
|
|
||||||
删一条自动变 1。不需要回来改概述,也不需要在条目里加任何标记。
|
|
||||||
|
|
||||||
实测过的行为:
|
|
||||||
|
|
||||||
| 操作 | 概述里的数字 |
|
|
||||||
|---|---|
|
|
||||||
| 原始 5 条 | 5 |
|
|
||||||
| 加 1 条 | **6**(自动) |
|
|
||||||
| 删 2 条(剩 3 条) | **3**(自动) |
|
|
||||||
| 还原 | 5 |
|
|
||||||
|
|
||||||
⚠️ `cvlist` 内部就是普通 `itemize`,**版面完全不变**(已逐行比对过,行数、
|
|
||||||
位置一字不差)。
|
|
||||||
|
|
||||||
⚠️ 不要在 `cvlist` 里再嵌套 `itemize` 写子项——子项的 `\item` 也会被算进去,
|
|
||||||
数字会偏大。需要子项就用普通 `itemize` + 手写 `\cvmark`。
|
|
||||||
|
|
||||||
### 半自动写法:`\cvmark` 与 `\cvtagcount`
|
|
||||||
|
|
||||||
有些章节一条要算进**两个**类别,`cvlist` 一次只能管一个类别,这时用逐条标记。
|
|
||||||
|
|
||||||
```latex
|
|
||||||
% 专利:一条既算「专利」又可能要算「第一发明人」
|
|
||||||
\item \textbf{张远航}, 李文博, 陈思远. 某某方法. ZL209999000001.9. 2024-05-14.
|
|
||||||
\cvmark{专利}\cvmark{第一发明人} % ← 加标记(不产生可见输出)
|
|
||||||
|
|
||||||
% 论文:收录类型本来就要显示,用 \cvtagcount 一步到位
|
|
||||||
\item \textbf{张远航}, 李文博. 某某论文. IEEE TGRS, 62, 1, (2024), 1--15.
|
|
||||||
DOI: 10.9999/TGRS.2024.0000001.\cvtagcount{SCI} % ← 显示 SCI 并计数
|
|
||||||
```
|
|
||||||
|
|
||||||
`\cvtagcount{SCI}` 等价于「印出加粗的 SCI」+「SCI 计数 +1」,所以**不要**写回
|
|
||||||
`\textbf{SCI}`——那样只显示不计数,概述会少算。
|
|
||||||
|
|
||||||
⚠️ 这种写法下,增删条目时**标记要跟着走**。删掉一条论文但留下 `\cvtagcount{SCI}`,
|
|
||||||
数字就会多算一个。这是它的代价;能用 `cvlist` 的章节就别用这种。
|
|
||||||
|
|
||||||
### 现有类别一览
|
|
||||||
|
|
||||||
| 类别 | 章节 | 写法 | 概述里的用法 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `SCI` `EI` `核心` | `section_04` 论文 | `\cvtagcount{}` 每条末尾 | `\cvnum*{SCI,EI,核心}` |
|
|
||||||
| `专利` `第一发明人` | `section_05` 专利 | `\cvmark{}` 每条末尾 | `\cvnum{专利}` / `\cvnum{第一发明人}` |
|
|
||||||
| `软著` | `section_06` 软著 | **`cvlist` 全自动** | `\cvnum{软著}` |
|
|
||||||
| `科研项目` `主持` `负责` | `section_07` 项目 | `\cvmark{}` 描述块内 | `\cvnum{主持}` / `\cvnum{负责}` |
|
|
||||||
| `转化` | `section_08` 成果转化 | **`cvlist` 全自动** | `\cvnum{转化}` |
|
|
||||||
| `教研` | `section_09` 教研项目 | **`cvlist` 全自动** | `\cvnum{教研}` |
|
|
||||||
|
|
||||||
### 概述里怎么取数
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\cvnum{软著} % 单类:印出数字,没这个类别就印 0
|
|
||||||
\cvnum*{SCI,EI,核心} % 多类求和(注意是英文逗号)
|
|
||||||
```
|
|
||||||
|
|
||||||
**列几条就算几条**,不需要额外声明总数。空类别返回 `0` 而不是报错,所以可以先
|
|
||||||
写 `\cvnum{EI}`,等真有了 EI 论文再加 `\cvtagcount{EI}`,中间不会有编译问题。
|
|
||||||
|
|
||||||
### 加一个全新的类别
|
|
||||||
|
|
||||||
比如想统计「一区论文」,三步:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
% ① 条目上标记(论文类用 cvtagcount,其他用 cvmark)
|
|
||||||
\item ...论文... \cvtagcount{一区}
|
|
||||||
|
|
||||||
% ② 概述里取数(不用任何注册,直接写)
|
|
||||||
其中一区论文 \cvnum{一区} 篇
|
|
||||||
|
|
||||||
% ③ 编译两遍
|
|
||||||
```
|
|
||||||
|
|
||||||
类别名是**随用随建**的,不需要预先声明。`\cvnum*{一区,SCI}` 这种求和也可以
|
|
||||||
直接用。
|
|
||||||
|
|
||||||
⚠️ 类别名不要含英文逗号(`,` 是 `\cvnum*` 的分隔符)、不要含 `@ % # \ { }`。
|
|
||||||
中文、英文、空格都可以。
|
|
||||||
|
|
||||||
### 三条必须知道的限制
|
|
||||||
|
|
||||||
1. **必须编译两遍**(`latexmk` 会自动跑够)。第一遍概述读到的是上一遍的统计,
|
|
||||||
首次编译会显示 `0`。日志末尾有 `CVSTATS:` 一行提示。
|
|
||||||
2. **`\jobname.cvnum` 是生成文件**,每次编译重写,已加进 `.gitignore`。
|
|
||||||
不要手改、不要提交。删掉它只会让数字从 0 重算一遍,下一遍即恢复。
|
|
||||||
3. **为什么不用 LaTeX 的 aux**:实测中文键经 aux 往返后 `\ifcsname` 全部匹配不上
|
|
||||||
(xeCJK 把汉字设为活动字符,键的 token 形态与写入时不一致;ASCII 键正常、
|
|
||||||
中文键失效)。所以改用独立的 `.cvnum` 文件,键原样保留。
|
|
||||||
|
|
||||||
### 为什么项目总经费仍是手填
|
|
||||||
|
|
||||||
`\experience` 的参数里没有经费字段,无法从条目自动求和。若真要做到自动,得给
|
|
||||||
`\experience` 增加一个经费参数(`{120万}` 之类),再由 `\cvnum` 累加。改动面较大,
|
|
||||||
超出本次范围,故保留手填 `1200 余万元`。
|
|
||||||
|
|
||||||
### ⚠️ 一个必须注意的语义变化
|
|
||||||
|
|
||||||
自动统计只数**你列出来的条目**,不数你没列的。示例简历原来写「论文 40 余篇、
|
|
||||||
专利 20 余项」,但正文只列了 9 篇代表作、9 项专利——改成自动统计后会变成
|
|
||||||
「论文 9 篇、专利 9 项」。
|
|
||||||
|
|
||||||
**这不是 bug,是两种口径**:
|
|
||||||
- 简历惯例是**只列代表作**,概述写总量(40 余篇)——此时总数不能从条目数出来
|
|
||||||
- 若你的正文就是全部成果,自动统计的数字才是真实总量
|
|
||||||
|
|
||||||
用之前先想清楚自己属于哪种。要保留「40 余篇」这种总量表述,就把那处数字改回
|
|
||||||
手写,只在真正列全的章节(软著、转化、教研这类)用 `\cvnum`。
|
|
||||||
|
|
||||||
## 写的时候容易踩的三个坑
|
|
||||||
|
|
||||||
1. **`\newExperience` 的参数顺序是「结束在前、开始在后」** —— 上游定义就是先印
|
|
||||||
`#1`(结束时间)再印 `#5`(开始时间),第一次用极易写反,写反了两栏内容会错位。
|
|
||||||
2. **每条后面必须跟 `\emptySeparator`**,否则下一条会并进同一格,不换行。
|
|
||||||
3. **关键词用英文逗号 `,` 分隔**(`\foreach` 按 `,` 切分)。用中文逗号会把整串当成
|
|
||||||
一个标签,撑出一个超宽的大框。
|
|
||||||
|
|
||||||
## 字体换成 SmallCaps 时的坑(已在 `../fonts.tex` 里解决)
|
|
||||||
|
|
||||||
`\user` / `\resumetitle` / `\experience` 都用了 `\textsc`,而中文没有小型大写字形,
|
|
||||||
不处理会每页刷 6 条 `Font shape 'TU/OUCSerif(0)/m/sc' undefined`。
|
|
||||||
|
|
||||||
修的时候注意:`\setCJKmainfont` 里加 `SmallCapsFont` **与本仓库的 `ItalicFeatures`
|
|
||||||
互斥** —— 斜体那一档带跨目录 `Path`,会把小型大写的字体查找带偏,无论写
|
|
||||||
`*-Regular`、全名、还是带 `.otf` 全报
|
|
||||||
`The font "OUCSerif-Regular" cannot be found.`。
|
|
||||||
|
|
||||||
正解在 `../fonts.tex` 里用的是 LaTeX 原生的形状替换:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\DeclareFontShape{TU}{OUCSerif(0)}{m}{sc}{<->ssub * OUCSerif(0)/m/n}{}
|
|
||||||
\DeclareFontShape{TU}{OUCSerif(0)}{b}{sc}{<->ssub * OUCSerif(0)/b/n}{}
|
|
||||||
```
|
|
||||||
|
|
||||||
比 fontspec 的选项低一层,不受选项间相互作用影响,效果等价。
|
|
||||||
|
|
||||||
## 授权
|
|
||||||
|
|
||||||
`LICENSE` 沿用上游。字体授权见仓库根 `../fonts/README.md`,全部允许免费商用与再分发。
|
|
||||||
+130
-68
@@ -1,99 +1,161 @@
|
|||||||
# 试卷 —— 试卷与参考答案 LaTeX 模板
|
# 试卷
|
||||||
|
|
||||||
中国海洋大学期末考试**试卷**与**参考答案及评分标准**的 XeLaTeX 模板。
|
期末考试试卷 + 参考答案与评分标准,两套模板,A4 两栏。
|
||||||
两份模板均不含真题,题目与分值都是示意,按教学大纲替换即可。
|
|
||||||
|
|
||||||
> 样张是《数字逻辑》2025 秋的一份**完整虚构 A 卷**:16 类题型(填空 / 选择 /
|
## 编译
|
||||||
> 判断 / 化简 / 分析 / 设计 / 时序 / 计数器 / 状态机 / 存储器 / ADC-DAC /
|
|
||||||
> Verilog / 综合设计 …)+ 对应参考答案与评分标准(8 大题 / 满分 100)。
|
```bash
|
||||||
> **题目是按数字逻辑课程内容真编的、答案算过是对的**,不是「略」或「×××」——
|
cd 试卷
|
||||||
> 这样既能看清版式,也能看出各题型的排版难度(比如卡诺图、时序波形图
|
xelatex 试卷题型示例.tex
|
||||||
> 都是 TikZ 内联画的)。
|
xelatex 试卷题型示例.tex # 题号交叉引用需要两遍
|
||||||
>
|
|
||||||
> 与 [`课程教学日历/`](../课程教学日历/)、[`成绩构成说明/`](../成绩构成说明/)、
|
xelatex 参考答案与评分标准示例.tex
|
||||||
> [`试卷归档封面/`](../试卷归档封面/) 是同一门课,四份一起看是自洽的。
|
xelatex 参考答案与评分标准示例.tex
|
||||||
> 唯一**故意留空**的是命题人 / 审核人 / 各题得分栏 —— 那是要签字担责的,
|
```
|
||||||
> 编名字上去容易被误当真实署名。
|
|
||||||
|
或仓库根:`bash build.sh 试卷 试卷题型示例`(自动跑两遍)
|
||||||
|
|
||||||
## 文件
|
## 文件
|
||||||
|
|
||||||
| 文件 | 说明 |
|
| 文件 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `oucexam.sty` | 试卷版式包。纸张 195×270mm(学校专用试卷纸),含装订栏、成绩表、页脚 |
|
| `试卷题型示例.tex` | 试卷,16 种题型展示 |
|
||||||
| `ouckey.sty` | 答案与评分标准版式包。默认 A4;加 `exampaper` 选项则与试卷同纸同边距 |
|
| `参考答案与评分标准示例.tex` | 答案与评分标准 |
|
||||||
| `试卷题型示例.tex` | 试卷范例,16 类题型,6 页 |
|
| `oucexam.sty` | 试卷版式包 |
|
||||||
| `参考答案与评分标准示例.tex` | 答案范例,8 大题 / 满分 100,3 页 |
|
| `ouckey.sty` | 答案版式包 |
|
||||||
|
|
||||||
## 编译
|
## 试卷:卷头参数
|
||||||
|
|
||||||
```bash
|
|
||||||
xelatex 试卷题型示例.tex
|
|
||||||
xelatex 试卷题型示例.tex # 跑两遍,第二遍才能取到正确总页数(lastpage)
|
|
||||||
```
|
|
||||||
|
|
||||||
必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
|
|
||||||
两份 .tex 都在本目录内自包含,不依赖任何图片文件(示例配图是 TikZ 内联画的)。
|
|
||||||
|
|
||||||
## 试卷模板要点
|
|
||||||
|
|
||||||
纸张、页边距、行距、装订栏位置、页脚样式都已在 `oucexam.sty` 里按原卷实测值定好,
|
|
||||||
一般**只改 `\examsetup` 那一块**(下例是样张实际用的虚构值):
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
|
\documentclass[UTF8,fontset=none]{ctexart}
|
||||||
|
\usepackage{oucexam}
|
||||||
|
|
||||||
\examsetup{
|
\examsetup{
|
||||||
year = {2025}, % 学年(会自动印成 2025—2026)
|
year = {2025}, % 学年
|
||||||
term = {秋}, % 秋 / 春
|
term = {秋}, % 季学期
|
||||||
course = {数字逻辑},
|
course = {数字逻辑}, % 课程名称
|
||||||
college = {信息科学与工程学院},
|
college = {信息科学与工程学院},
|
||||||
type = {A}, % 卷头「试卷类型:A 卷」
|
type = {A}, % 试卷类型 A / B
|
||||||
foottype = {}, % 页脚课程名后是否再印类型字母,空=不印
|
foottype = {}, % 页脚是否再印类型字母,留空则不印
|
||||||
proposer = {}, % 命题人
|
proposer = {}, % 命题人
|
||||||
reviewer = {}, % 审核人
|
reviewer = {}, % 审题人
|
||||||
mode = {闭卷},
|
mode = {闭卷}, % 考试方式
|
||||||
allowed = {无}, % 允许携带的物品
|
allowed = {无}, % 允许携带的物品
|
||||||
nsec = {16}, % 大题数,成绩表自动按 nsec+1 栏等分
|
nsec = {16}, % 大题数量(成绩表按此栏数等分)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- `proposer` / `reviewer` 样张里**故意留空**:命题人、审核人是要签字担责的,
|
| 参数 | 说明 |
|
||||||
编一个名字上去容易被误当真实署名。留空时模板自动不印该项、不留空横线。
|
|---|---|
|
||||||
- `type` 与 `foottype` 互不影响:前者只管卷头,后者只管页脚。
|
| `year` | 学年 |
|
||||||
原卷 A 卷页脚没印字母、B 卷印了 B,这是出卷人手工差异,不是规则。
|
| `term` | 季学期 |
|
||||||
- 大题数变了必须同步改 `nsec`,否则成绩表格子会错位。
|
| `course` | 课程名称 |
|
||||||
|
| `college` | 学院 |
|
||||||
|
| `type` | 试卷类型,A / B |
|
||||||
|
| `foottype` | 页脚类型字母,留空不印 |
|
||||||
|
| `proposer` | 命题人,留空不印 |
|
||||||
|
| `reviewer` | 审题人,留空不印 |
|
||||||
|
| `mode` | 闭卷 / 开卷 |
|
||||||
|
| `allowed` | 允许携带物品 |
|
||||||
|
| `nsec` | 大题数量,决定卷头成绩表的栏数 |
|
||||||
|
|
||||||
## 答案模板要点
|
留空的项自动不印,不会留空白横线。
|
||||||
|
|
||||||
|
## 试卷:题型命令
|
||||||
|
|
||||||
|
16 种题型,按需用:
|
||||||
|
|
||||||
|
| 题型 | 命令 |
|
||||||
|
|---|---|
|
||||||
|
| 一、填空题 | `\blank[n]` 按字宽画横线,`\lblank` 通栏横线 |
|
||||||
|
| 二、判断题 | `\judge` 括号在题首 |
|
||||||
|
| 三、单项选择题 | `\choices` 一行四栏 |
|
||||||
|
| 四、多项选择题 | `\choicesII` 两行两栏 |
|
||||||
|
| 五、名词解释 | `\answerlines[n]` 答题横线 |
|
||||||
|
| 六、简答题 | 题号用 `\qiT`(Times 数字) |
|
||||||
|
| 七、判断改错题 | `\judge` + 改错横线 |
|
||||||
|
| 八、计算题 | 表格 + `\answerbox` 作答框 |
|
||||||
|
| 九、作图题 | 大方框作答 |
|
||||||
|
| 十、配伍题 | `\mtpair` 左右两栏,中间连线 |
|
||||||
|
| 十一、表格填写题 | `\datatable` + 空格 |
|
||||||
|
| 十二、术语翻译题 | 英译中 / 中译英 |
|
||||||
|
| 十三、证明题 | 逻辑推演,大作答区 |
|
||||||
|
| 十四、分析题 | 配图,用 `\examfig{宽度}{文件}` |
|
||||||
|
| 十五、实验设计题 | 方案要素 + 大作答区 |
|
||||||
|
| 十六、论述题 | 大段作答区 |
|
||||||
|
|
||||||
|
大题标题写法:
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
|
\examsection{一、填空题(每空 1 分,共 10 分)}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 答案:卷头参数
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\usepackage{ouckey}
|
||||||
|
|
||||||
\keysetup{
|
\keysetup{
|
||||||
year = {2025}, term = {秋}, course = {数字逻辑}, type = {A},
|
year = {2025}, % 学年
|
||||||
dept = {计算机科学与技术学院}, college = {信息科学与工程学院},
|
term = {秋}, % 季学期
|
||||||
|
course = {数字逻辑}, % 课程名称
|
||||||
|
type = {A}, % 试卷类型
|
||||||
|
dept = {计算机科学与技术学院},
|
||||||
|
college = {信息科学与工程学院},
|
||||||
major = {计算机科学与技术专业 \TNR{2023} 级},
|
major = {计算机科学与技术专业 \TNR{2023} 级},
|
||||||
teacher = {张远航}, examiner = {张远航},
|
teacher = {张远航}, % 任课教师
|
||||||
mode = {闭卷、笔试}, total = {100},
|
examiner = {张远航}, % 命题教师
|
||||||
|
mode = {闭卷、笔试},
|
||||||
|
total = {100}, % 满分
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
如实现在试卷同一张纸上印,把 `\usepackage{ouckey}` 改成 `\usepackage[exampaper]{ouckey}`。
|
| 参数 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `year` `term` `course` `type` | 与试卷一致 |
|
||||||
|
| `dept` | 系 |
|
||||||
|
| `college` | 学院 |
|
||||||
|
| `major` | 面向专业与年级 |
|
||||||
|
| `teacher` | 任课教师 |
|
||||||
|
| `examiner` | 命题教师 |
|
||||||
|
| `mode` | 考试方式 |
|
||||||
|
| `total` | 满分 |
|
||||||
|
|
||||||
体例四条(学校没有统一模板,按国内高校通行做法拟定):
|
## 答案:命令
|
||||||
|
|
||||||
1. 抬头信息齐全,留空的项自动不印、不留空横线
|
| 命令 | 用途 |
|
||||||
2. 客观题答案集中列(`\objkeys{C,B,A,...}`,每行 6 个自动换行),附统一给分规则
|
|---|---|
|
||||||
3. 主观题**内嵌**分步分值(`\pt{2}`),阅卷时批到哪里看到哪里
|
| `\makekeyhead` | 印抬头 |
|
||||||
4. 每个大题末尾给【评分标准】`\scoring{...}`
|
| `\keysection{标题}` | 大题的标题与答案区 |
|
||||||
|
| `\keysectionfree{标题}` | 不带答案框的标题 |
|
||||||
|
| `\keyitem{...}` | 一条答案与评分点 |
|
||||||
|
| `\keyitemstar{...}` | 带星号的答案条目 |
|
||||||
|
| `\keynote{...}` | 说明性注释 |
|
||||||
|
| `\scoring{分值}` | 标出评分点分值 |
|
||||||
|
| `\keytotal` | 末尾的分数汇总表 |
|
||||||
|
| `\keysign` | 签字栏 |
|
||||||
|
| `\objkeys{...}` | 客观题答案(判断、选择) |
|
||||||
|
| `\pt{n}` / `\ptline` | 分值标注 |
|
||||||
|
|
||||||
主观题内嵌分值是有意为之:阅卷是流水作业,分值必须和答案文字贴在一起,
|
答案与试卷的题号、分值要一一对应,改试卷时答案模板也要同步改。
|
||||||
集中写在末尾会让批卷人来回翻页。
|
|
||||||
|
|
||||||
文末 `\keytotal{20,10,12,12,12,16,8,10}` 是分值汇总表,用于阅卷前核对
|
## 版式
|
||||||
「各大题相加 = 满分」。签名栏 `\keysign` 只留命题人一处。
|
|
||||||
|
|
||||||
## 书写注意
|
```
|
||||||
|
A4 两栏,栏宽 82mm
|
||||||
|
试卷:题号与作答区按题型自动排
|
||||||
|
答案:每题带评分点标注,末尾总分汇总表
|
||||||
|
正文宋体,题号用 Times
|
||||||
|
```
|
||||||
|
|
||||||
- 题干内部换行用 `\\*`,**不要用裸 `\\`**。裸 `\\` 语义是"允许在此断页",
|
## 配图
|
||||||
题干会被切到上下两页,学生看到半句话。
|
|
||||||
- 数字、英文用 `\TNR{...}` 包起来(内部显式 `\normalfont` 收尾)。
|
分析题等需要配图时,用 TikZ 直接画,或:
|
||||||
裸用字体切换命令会让字体状态泄漏到后续段落。
|
|
||||||
- `\keyitem{题号}{分值}{答案正文}` 的参数里**不要嵌 `tabular` / `tikzpicture`**——
|
```latex
|
||||||
这些环境的 `&` 与 `\\` 会被当成参数分隔符,报 `File ended while scanning`。
|
\examfig{0.6\textwidth}{图片文件.png}
|
||||||
表格和图写在 `\keyitem` 之后。
|
```
|
||||||
|
|
||||||
|
## 注意
|
||||||
|
|
||||||
|
示例内容为虚构题目,使用时全部替换。
|
||||||
+107
-88
@@ -1,123 +1,142 @@
|
|||||||
# 试卷归档封面 —— 信息科学与工程学部试卷归档封面(理论课)
|
# 试卷归档封面
|
||||||
|
|
||||||
信息科学与工程学部**试卷归档封面**的 XeLaTeX 模板。原文件是学院/学部下发的
|
信息科学与工程学部试卷归档封面(理论课),A4 单页。
|
||||||
`.doc` 表格,本目录把它做成可直接编译的 LaTeX 版。
|
|
||||||
|
|
||||||
> **改名说明**:原文件名为「附件1:信息科学与工程学院试卷封面(理论课)」,
|
## 编译
|
||||||
> 内文标题写的是「信息科学与工程学院试卷」。按现行建制与文档实际用途,
|
|
||||||
> 已统一改为 **学部 + 归档封面**:目录名、文件名、内文标题三处同步。
|
|
||||||
|
|
||||||
> 与 [`试卷/`](../试卷/) 的区别:`试卷/` 是**试卷正文 + 参考答案**(学校专用
|
```bash
|
||||||
> 195×270mm 试卷纸、装订栏、成绩表);本目录是**随卷归档的封面单页**
|
cd 试卷归档封面
|
||||||
> (A4、11 行两列表单)。两者用途不同,不是同一份文件的两个版本。
|
xelatex 试卷归档封面.tex
|
||||||
|
```
|
||||||
|
|
||||||
|
或仓库根:`bash build.sh 试卷归档封面`
|
||||||
|
|
||||||
## 文件
|
## 文件
|
||||||
|
|
||||||
| 文件 | 说明 |
|
| 文件 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `oucksfm.sty` | 版式包。A4、表宽 170mm、11 行固定行高,所有尺寸已注明换算过程 |
|
| `试卷归档封面.tex` | 主文件,填内容改这里 |
|
||||||
| `试卷归档封面.tex` | 填写入口,【第 1 节】改课程信息即可 |
|
| `oucksfm.sty` | 版式包,一般不改 |
|
||||||
| `试卷归档封面.pdf` | 成品样张 |
|
|
||||||
|
|
||||||
## 编译
|
## 填写参数
|
||||||
|
|
||||||
```bash
|
全部在 `\begin{document}` 之前定义:
|
||||||
xelatex 试卷归档封面.tex
|
|
||||||
```
|
|
||||||
|
|
||||||
必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
|
|
||||||
本模板自包含,不依赖任何图片。
|
|
||||||
|
|
||||||
## 填表
|
|
||||||
|
|
||||||
只改 `试卷归档封面.tex` 的【第 1 节】。下面注释里的值是**样张实际用的虚构值**
|
|
||||||
(与 `课程教学日历/`、`成绩构成说明/`、`试卷/` 同为《数字逻辑》2025 秋):
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\sfmyear} {\ph{2025}年} % 学年
|
\newcommand{\sfmyear} {\ph{2025}年} % 学年
|
||||||
\newcommand{\sfmterm} {\ph{秋}季学期} % 学期
|
\newcommand{\sfmterm} {\ph{秋}季学期} % 学期
|
||||||
\newcommand{\sfmcno} {080502101231} % 课程号(纯数字,14pt)
|
\newcommand{\sfmcno} {080502101231} % 课程号
|
||||||
\newcommand{\sfmsno} {25252029} % 选课号(纯数字,14pt)
|
\newcommand{\sfmsno} {25252029} % 选课号
|
||||||
\newcommand{\sfmcourse}{\ph{数字逻辑}} % 考试课程名称
|
\newcommand{\sfmcourse}{\ph{数字逻辑}} % 考试课程名称
|
||||||
\newcommand{\sfmtype} {\ph{专业课}} % 课程类型
|
\newcommand{\sfmtype} {\ph{专业课}} % 课程类型
|
||||||
\newcommand{\sfmmajor}{...} % 面向专业(多个用、隔开)
|
\newcommand{\sfmmajor}{% % 面向专业
|
||||||
\newcommand{\sfmgrade}{\ph{2023}级} % 面向年级
|
\ph{计算机科学与技术}、\ph{软件工程}、\ph{智能科学与技术}}
|
||||||
\newcommand{\sfmcount}{\ph{86}} % 试卷份数
|
\newcommand{\sfmgrade} {\ph{2023}级} % 面向年级
|
||||||
|
\newcommand{\sfmcount} {\ph{86}} % 试卷份数
|
||||||
\newcommand{\sfmteacher}{\ph{张远航}} % 授课教师
|
\newcommand{\sfmteacher}{\ph{张远航}} % 授课教师
|
||||||
\newcommand{\sfmdate}{...} % 日期
|
\newcommand{\sfmdate} {\ph{2025}年\ph{01}月\ph{08}日星期\ph{三}} % 日期
|
||||||
```
|
```
|
||||||
|
|
||||||
⚠️ **换内容时保留 `\ph{}`**,只是把它里面的字换掉,别把宏本身删了 ——
|
| 参数 | 说明 |
|
||||||
「×」和半角数字会被 fontspec 判成 ASCII 交给西文字体,宽度与汉字不一致,
|
|---|---|
|
||||||
全表的字就会参差不齐(原因见 `.tex` 里的长注释)。
|
| `\sfmyear` | 学年,写成「2025年」这种形式 |
|
||||||
|
| `\sfmterm` | 学期,秋 / 春,或「秋季学期」 |
|
||||||
|
| `\sfmcno` | 课程号,纯数字,14pt |
|
||||||
|
| `\sfmsno` | 选课号,纯数字,14pt |
|
||||||
|
| `\sfmcourse` | 考试课程名称 |
|
||||||
|
| `\sfmtype` | 课程类型:专业课 / 公共基础课 / 通识课 |
|
||||||
|
| `\sfmmajor` | 面向专业,多个用「、」隔开 |
|
||||||
|
| `\sfmgrade` | 面向年级 |
|
||||||
|
| `\sfmcount` | 试卷份数 |
|
||||||
|
| `\sfmteacher` | 授课教师 |
|
||||||
|
| `\sfmdate` | 日期 |
|
||||||
|
|
||||||
## 版式参数
|
### `\ph` 命令
|
||||||
|
|
||||||
全部照原 `.doc` 实测值,未做主观调整:
|
`\ph{文字}` 把内容排成黑体(表示可填写的占位值)。定义在 tex 里:
|
||||||
|
|
||||||
| 项目 | 值 | 来源 |
|
|
||||||
|---|---|---|
|
|
||||||
| 纸张 | A4 210×297mm | `pgSz` |
|
|
||||||
| 页边距 | 左右 20mm、上下 25.01mm | `pgMar` 56.7 / 70.9 pt |
|
|
||||||
| 表宽 | 170mm(= 版心宽) | `tblW` 100% |
|
|
||||||
| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位)|
|
|
||||||
| 单元格内边距 | 左右 1.4993mm、上下 0 | `tblCellMar` 85 twips |
|
|
||||||
| 列宽 | 51mm + 119mm(30% : 70%) | `col_widths_pct` |
|
|
||||||
| 标题 | 黑体 18pt 加粗居中 | `w:sz=36` + `w:b` |
|
|
||||||
| 左列标签 | 黑体 18pt | `w:sz=36` |
|
|
||||||
| 右列值 | 18pt(学年/学期)/16pt(多数)/14pt(课程号、选课号) | `w:sz=36/32/28` |
|
|
||||||
| 行高 | 11 行固定高,合计 185.95mm | 各行 `trHeight` + `hRule=exact` |
|
|
||||||
|
|
||||||
实测校验(pymupdf 读 PDF):
|
|
||||||
|
|
||||||
```
|
|
||||||
表格 左=20.0mm 右=189.91mm 宽=169.9mm ← 应为 170mm ✓
|
|
||||||
行高 15.19/15.18/15.54/14.66/14.75/15.18/33.02/15.19/18.80/15.19/15.19 mm
|
|
||||||
表格总高 187.89mm ← 含线宽与取整,与 185.95+线宽 吻合
|
|
||||||
标题 宽 94.89mm,单行不折(版心 170mm,余量充足)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 三个坑(改之前先看)
|
|
||||||
|
|
||||||
### 1. `×` 占位符曾跑到 Times New Roman(已在公共字体包根治)
|
|
||||||
|
|
||||||
xeCJK 按 Unicode 区段分类,`×`(U+00D7)落在 Latin-1,会被判成**西文**,
|
|
||||||
交给 fontspec 的西文字体(Termes / Times)。`\heiti` / `\fangsong` 只切
|
|
||||||
CJK 字体族,**管不到它** —— 包一层是没用的。TNR 的 × 宽度与汉字不一致,
|
|
||||||
混排时基线也偏。
|
|
||||||
|
|
||||||
现在这行已上移到仓库公共字体包 [`../fonts.tex`](../fonts.tex),**全局生效**:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号
|
\newcommand{\ph}[1]{{\heiti #1\normalfont}}
|
||||||
\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号
|
|
||||||
\xeCJKDeclareCharClass{CJK}{"25A1} % □ 方框(勾选框)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
本模板不再需要自己声明。
|
要改占位值的字体,改这一行。纯数字(课程号、选课号)本来该用西文字体,
|
||||||
|
不用 `\ph` 包。
|
||||||
|
|
||||||
> ✅ [`年度考核登记表/`](../年度考核登记表/) 也有同样问题,**已随本次改造一并修好**
|
### 面向专业这一格
|
||||||
> (原先那条注释说能修,但实测 PDF 里 × 仍落在 TNR —— 因为注释在、声明也写了,
|
|
||||||
> 却没有真正作用到字符类)。现在已经实测确认:10 处 `×` 全部落在 OUC Sans 上。
|
|
||||||
|
|
||||||
### 2. 字体全部来自公共字体包
|
`\sfmmajor` 是全表唯一的高行(32.844mm),能容 3 行 16pt 文字。
|
||||||
|
专业名超过 3 行会自动把行撑高,整表会超出版心。届时:
|
||||||
|
|
||||||
本模板原先用 SimHei / SimSun / FangSong + `AutoFakeBold` 描边,换台机器
|
1. 精简专业名,或
|
||||||
(尤其 Linux/macOS)就编不出来,而且这些字体都不允许随仓库分发。现改为
|
2. 把 `oucksfm.sty` 里 `row{7}` 的 `ht` 改大
|
||||||
`\input{../fonts.tex}`,字体文件在 `../fonts/` 下,来源与授权见
|
|
||||||
[`../fonts/README.md`](../fonts/README.md)。
|
|
||||||
|
|
||||||
### 3. `\linespread` 会悄悄放大行高
|
## 表格结构
|
||||||
|
|
||||||
ctex 默认 `\linespread` 约为 **1.3**,它会把 `\fontsize{18}{21.6}` 里的
|
| 行 | 内容 |
|
||||||
21.6 pt 行距放大到 **28 pt 以上**,逐行累积后整张表会顶出页面。
|
|---|---|
|
||||||
|
| 1 | 学年 + 学期 |
|
||||||
|
| 2 | 课程号 + 选课号 |
|
||||||
|
| 3 | 考试课程名称 |
|
||||||
|
| 4 | 课程类型 |
|
||||||
|
| 5 | 面向专业(高行) |
|
||||||
|
| 6 | 面向年级 |
|
||||||
|
| 7 | 试卷份数 |
|
||||||
|
| 8 | 授课教师 |
|
||||||
|
| 9 | 日期 |
|
||||||
|
|
||||||
`oucksfm.sty` 的解法是在**每个** `\fontsize` 之后紧跟 `\linespread{1}\relax`,
|
## 标签文字
|
||||||
并且在 `\AtBeginDocument` 之后再设一次(ctex 会在 `\begin{document}` 时
|
|
||||||
把 `\linespread` 重新设回 1.3,只在导言区设是无效的):
|
表左侧的标签默认是:
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\AtBeginDocument{\linespread{1}\selectfont}
|
\newcommand{\sfmyearlabel} {学\quad 年}
|
||||||
|
\newcommand{\sfmtermlabel} {学\quad 期}
|
||||||
|
\newcommand{\sfmcnolabel} {课程号}
|
||||||
|
\newcommand{\sfmsnolabel} {选课号}
|
||||||
|
\newcommand{\sfmcourselabel} {考试课程名称}
|
||||||
|
\newcommand{\sfmtypelabel} {课程类型}
|
||||||
|
\newcommand{\sfmmajorlabel} {面向专业}
|
||||||
|
\newcommand{\sfmgradelabel} {面向年级}
|
||||||
|
\newcommand{\sfmcountlabel} {试卷份数}
|
||||||
|
\newcommand{\sfmteacherlabel}{授课教师}
|
||||||
|
\newcommand{\sfmdatelabel} {日\quad 期}
|
||||||
```
|
```
|
||||||
|
|
||||||
没有这一步,表高会比原卷高出一大截。
|
字号不一致的标签用 `\quad` 补空格对齐。
|
||||||
|
|
||||||
|
## 正文
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\begin{document}
|
||||||
|
\sfmtitle{信息科学与工程学部试卷归档封面}
|
||||||
|
\begin{sfmtable}
|
||||||
|
\sfmlabel{\sfmyearlabel} & \sfmvalbig{\sfmyear} \\
|
||||||
|
...
|
||||||
|
\end{sfmtable}
|
||||||
|
```
|
||||||
|
|
||||||
|
`\sfmlabel` 排标签,`\sfmval` / `\sfmvalbig` / `\sfmvalsmall` 排值(三档字号)。
|
||||||
|
|
||||||
|
### 其他命令
|
||||||
|
|
||||||
|
| 命令 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| `\sfmtitle{标题}` | 表外标题 |
|
||||||
|
| `\sfmlabel{文字}` | 左列标签 |
|
||||||
|
| `\sfmval{值}` | 中号值 |
|
||||||
|
| `\sfmvalbig{值}` | 大号值 |
|
||||||
|
| `\sfmvalsmall{值}` | 小号值 |
|
||||||
|
| `\sfmtail{文字}` | 表尾文字 |
|
||||||
|
| `\sfmrule` | 横线 |
|
||||||
|
|
||||||
|
## 版式
|
||||||
|
|
||||||
|
```
|
||||||
|
A4,单页
|
||||||
|
标签黑体,值黑体(\ph),纯数字用西文
|
||||||
|
表格行高按原表设定,第 5 行(面向专业)为高行
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意
|
||||||
|
|
||||||
|
示例内容为虚构数据,使用时全部替换成自己的课程。
|
||||||
+60
-157
@@ -1,199 +1,102 @@
|
|||||||
# 试卷归档目录 —— 信息科学与工程学部试卷归档目录(理论课)
|
# 试卷归档目录
|
||||||
|
|
||||||
信息科学与工程学部**试卷归档目录**的 XeLaTeX 模板。原文件是学院/学部下发的
|
信息科学与工程学部试卷归档目录(理论课),A4 单页,12 项核对清单。
|
||||||
`.doc` 表(12 项核对清单),本目录把它做成可直接编译的 LaTeX 版。
|
|
||||||
|
|
||||||
> **改名说明**:原文件名为「附件2:信息科学与工程学院归档目录(理论课)」,
|
## 编译
|
||||||
> 内文写的是「归档目录」、未出现单位名。按现行建制已统一为 **学部**,
|
|
||||||
> 目录名、文件名同步。内文标题保持原文「归 档 目 录」(四字间隔一个字宽)。
|
|
||||||
|
|
||||||
> 与 [`试卷归档封面/`](../试卷归档封面/) 的关系:两件是**同一套归档材料**的
|
```bash
|
||||||
> 两个附件的原件配套 —— 附件1 是封面(随卷装订、11 行表单),本目录是
|
cd 试卷归档目录
|
||||||
> 附件2(装袋前逐项核对的清单、12 项勾选表)。版式上都照原 `.doc` 1:1 还原,
|
xelatex 试卷归档目录.tex
|
||||||
> 但一个是 A4 表单、一个是 A4 居中表格,互不依赖。
|
```
|
||||||
|
|
||||||
|
或仓库根:`bash build.sh 试卷归档目录`
|
||||||
|
|
||||||
## 文件
|
## 文件
|
||||||
|
|
||||||
| 文件 | 说明 |
|
| 文件 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `oucgddir.sty` | 版式包。A4、表宽 150.64mm、13 行固定行高,每项尺寸都附换算过程 |
|
| `试卷归档目录.tex` | 主文件,清单条目改这里 |
|
||||||
| `试卷归档目录.tex` | 正文入口(12 项清单写在这里,增删改归档项只改这个文件) |
|
| `oucgddir.sty` | 版式包,一般不改 |
|
||||||
| `试卷归档目录.pdf` | 成品样张 |
|
|
||||||
|
|
||||||
## 编译
|
## 完整内容
|
||||||
|
|
||||||
```bash
|
整个模板就一个清单表,改条目直接编辑 `.tex` 正文:
|
||||||
xelatex 试卷归档目录.tex
|
|
||||||
```
|
|
||||||
|
|
||||||
必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
|
|
||||||
自包含,不依赖任何图片。实测 1 页,零警告(无 Overfull / Underfull / 缺字)。
|
|
||||||
|
|
||||||
## 用法
|
|
||||||
|
|
||||||
正文就是一张表,加行改行即可:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
|
\begin{document}
|
||||||
|
\vspace*{\gdtopskip}
|
||||||
|
|
||||||
|
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
|
||||||
|
|
||||||
|
\vspace{\gdheadskip}
|
||||||
|
|
||||||
\begin{gdtable}
|
\begin{gdtable}
|
||||||
\gdhead{序号} & \gdhead{内容} & \gdheadIII \\
|
\gdhead{序号} & \gdhead{内容} & \gdheadIII \\
|
||||||
\gdno{1} & \gditem{考试签到表} & \\
|
\gdno{1} & \gditem{考试签到表} & \\
|
||||||
\gdno{2} & \gditem{监考记录} & \\
|
\gdno{2} & \gditem{监考记录} & \\
|
||||||
% …… 照此继续
|
...
|
||||||
\end{gdtable}
|
\end{gdtable}
|
||||||
|
\end{document}
|
||||||
```
|
```
|
||||||
|
|
||||||
可用的单元格宏:
|
## 增加或删除条目
|
||||||
|
|
||||||
| 宏 | 用途 | 字号/字形 |
|
复制一行改内容即可,编号手动写:
|
||||||
|---|---|---|
|
|
||||||
| `\gdno{1}` | 序号列 | 楷体 12pt 粗 |
|
|
||||||
| `\gditem{考试签到表}` | 内容列 | 楷体 12pt |
|
|
||||||
| `\gdhead{序号}` | 表头单段格(序号、内容两列) | 楷体 18pt 粗 |
|
|
||||||
| `\gdheadIII` | 表头第三格,**自带**「标注」+ 小字两段 | 18pt 粗 + 10.45pt |
|
|
||||||
| `\gdnote{...}` | 单独排一行小字(10.45pt) | 楷体 10.45pt |
|
|
||||||
|
|
||||||
标题用 `\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}` —— **`\gdgap` 不能省**,
|
|
||||||
原因见下面第 3 条。
|
|
||||||
|
|
||||||
## 版式参数
|
|
||||||
|
|
||||||
全部照原 `.doc` 实测值,未做主观调整:
|
|
||||||
|
|
||||||
| 项目 | 值 | 来源 |
|
|
||||||
|---|---|---|
|
|
||||||
| 纸张 | A4 210×297mm | `pgSz` 11906×16838 twips |
|
|
||||||
| 页边距 | 上下 25.40mm、左右 29.599mm | `pgMar` top/bottom 1440 twips;左右经实测标定,见下 |
|
|
||||||
| 表宽 | 150.81mm | `tblGrid` 合计 8540 twips = 150.64mm,加列取整余量 |
|
|
||||||
| 列宽 | 23.072 + 77.346 + 50.218 mm | `gridCol` 1308 / 4385 / 2847 twips |
|
|
||||||
| 单元格内边距 | 左右 1.905mm、上下 0 | `tblCellMar` 108 twips |
|
|
||||||
| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位) |
|
|
||||||
| 行高 | 表头 20.549mm、中间 12 行 13.758mm、末行 14.164mm | `trHeight` 1165 / 780 / 803 twips,`hRule=exact` |
|
|
||||||
| 标题 | 楷体 24pt,首行缩进 46.55mm | `firstLine` 2640 twips |
|
|
||||||
| 表头 | 楷体 18pt 粗 | `w:sz=36` + `w:b` |
|
|
||||||
| 表头小注 | 楷体 10.45pt | `w:szCs=21`(未设 `w:sz`,Word 退回 10.5pt) |
|
|
||||||
| 序号列 | 楷体 12pt 粗 | `w:sz=24` + `w:b` |
|
|
||||||
| 内容列 | 楷体 12pt | `w:sz=24` |
|
|
||||||
|
|
||||||
## 实测校验
|
|
||||||
|
|
||||||
用 pymupdf 读两版 PDF,逐位对比(原稿由 WPS 导出):
|
|
||||||
|
|
||||||
```
|
|
||||||
表格竖线 x (mm) 原稿 29.686 / 52.758 / 130.104 / 180.322
|
|
||||||
新版 29.687 / 52.758 / 130.104 / 180.321 Δ ≤ 0.001
|
|
||||||
|
|
||||||
表格横线 y (mm) 原稿 53.001 … 239.056(14 条)
|
|
||||||
新版 53.004 … 239.050 Δ ≤ 0.006
|
|
||||||
|
|
||||||
标题四字 x0 (pt) 原稿 222.00 / 270.00 / 318.00 / 366.00
|
|
||||||
新版 221.95 / 269.93 / 317.93 / 365.93 Δ ≤ 0.07
|
|
||||||
|
|
||||||
32 行文字水平中心 最大偏差 0.11pt
|
|
||||||
32 行文字距行顶 最大偏差 0.57pt(数字与中文各自字体度量差,见下)
|
|
||||||
字号 24.00 / 18.00 / 12.00 / 10.45 …………全部精确
|
|
||||||
```
|
|
||||||
|
|
||||||
> 纵向那 0.5pt 的来源:原稿序号列用 Times New Roman、正文用方正楷体,
|
|
||||||
> Word 让**两种字体各自按自身 ascent 落基线**,同一行里数字比中文高 0.48pt
|
|
||||||
> (原稿实测 232.25 vs 231.77)。新版用 Termes + OUC Kai 复刻了同样的
|
|
||||||
> 相对关系(232.32 vs 232.32 —— 差 0,因为 Termes 与 OUC Kai 的 ascent
|
|
||||||
> 恰好一致)。这是**字体度量差**,不是排版错误,且新版同一行内更整齐。
|
|
||||||
|
|
||||||
## 五个坑(改之前先看)
|
|
||||||
|
|
||||||
### 1. `\fontsize` 必须用 `bp`,不能用默认的 `pt`
|
|
||||||
|
|
||||||
Word/PDF 里的 "pt" 是 **PostScript point**(1/72 英寸),TeX 的默认 `pt` 是
|
|
||||||
**TeX point**(1/72.27 英寸),后者大出 0.36%。写 `\fontsize{24}{28.8}`,
|
|
||||||
PDF 里实测只有 **23.91**(= 24 × 72/72.27),与原稿的 24.00 对不上。
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\fontsize{24bp}{28.8bp}\selectfont % 实测正好 24.000
|
\gdno{13} & \gditem{新增的项目名称} & \\
|
||||||
```
|
```
|
||||||
|
|
||||||
本包所有照抄 Word 数值的字号、行距、间距一律写 `bp`。
|
删条目就删整行。条目数变了不影响版式。
|
||||||
|
|
||||||
### 2. xeCJK 会吞掉连续半角空格
|
## 标题间距
|
||||||
|
|
||||||
标题原文是「归␣␣档␣␣目␣␣录」(字间各两个半角空格)。直接照抄进源码,
|
`\gdtitle` 里的四个字之间用 `\gdgap` 插空隙:
|
||||||
编译出来是紧贴的「归档目录」—— 空格全没了(实测 x0=216.09,且只有一个
|
|
||||||
span,而原稿是四个独立字、间隔恒 48pt)。
|
|
||||||
|
|
||||||
正解是不依赖空格策略,用 `\kern` 手动摆:
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\gdgap}{\kern\gdtitlegap} % \gdtitlegap = 24bp = 1 个字宽
|
|
||||||
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
|
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. 必须关掉 xeCJK 的全角标点压缩(`PunctStyle=plain`)
|
**不能直接写空格**(`归 档 目 录`)—— xeCJK 会吞掉连续半角空格,
|
||||||
|
编译出来是紧贴的「归档目录」。
|
||||||
|
|
||||||
**这条最隐蔽。** 现象:凡含全角括号的行,整行右移 4.23pt,而字宽完全正确。
|
## 常用命令
|
||||||
「试卷(项目设计报告)」原稿 x0=199.20,默认设置排出 **203.43**。
|
|
||||||
|
|
||||||
根因是 xeCJK 默认 `PunctStyle=quanjiao` 会对全角标点做字宽挤压:「(」「)」
|
| 命令 | 用途 |
|
||||||
的 advance 从 1.0em 压到 0.5em,省下的空间记在**行内盒子的起点**上,于是
|
|---|---|
|
||||||
整行墨迹相对盒子右移。两端对齐的正文里这叫"标点紧凑",但在**居中**的表格
|
| `\gdtitle{文字}` | 主标题 |
|
||||||
单元格里就是整行偏移,且偏移量随括号个数变化(1 个 4.23pt、2 个 8.46pt)。
|
| `\gdgap` | 标题字之间的固定空隙(24bp) |
|
||||||
|
| `\gdtopskip` | 标题上方留白 |
|
||||||
|
| `\gdheadskip` | 标题下方留白 |
|
||||||
|
| `gdtable` 环境 | 清单表 |
|
||||||
|
| `\gdhead{文字}` | 表头格(三列各一个变体:`\gdhead`、`\gdheadIII`) |
|
||||||
|
| `\gdheadraw{文字}` | 表头格(不自动排版) |
|
||||||
|
| `\gdno{数字}` | 序号格 |
|
||||||
|
| `\gditem{文字}` | 条目格 |
|
||||||
|
| `\gdnote{文字}` | 备注格 |
|
||||||
|
| `\gdrule` | 横线 |
|
||||||
|
|
||||||
|
### 三列表头
|
||||||
|
|
||||||
|
表头有三个命令对应三列,因为各列的对齐和宽度不同:
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\xeCJKsetup{PunctStyle=plain}
|
\gdhead{序号} & \gdhead{内容} & \gdheadIII \\
|
||||||
```
|
```
|
||||||
|
|
||||||
Word 本来就不做这个挤压,关掉反而与原件一致。
|
### 宽度常量
|
||||||
|
|
||||||
### 4. `totalwidth` / 行高 / 位移都要比理论值多留一点
|
| 常量 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `\gdwa` `\gdbw` `\gdwc` | 三列的宽度 |
|
||||||
|
|
||||||
tabularray 的**计宽**与**画宽**不是一回事,三处都要实测标定:
|
## 版式
|
||||||
|
|
||||||
- **列宽**:它把边框线宽算进列宽,故 `wd = gridCol − 2×colsep − 线宽`,
|
```
|
||||||
而不是"按竖线根数分摊"。按分摊算每列窄 0.154mm,整表窄 0.466mm。
|
A4,单页,三线表
|
||||||
- **表宽**:左竖线画在版心左边界**内侧**,整个 tblr 盒子比
|
标题黑体加宽字距,表头黑体,条目宋体
|
||||||
`Σwd + 6×colsep + 4×线宽` 又多约 0.4945pt,不补足就报
|
```
|
||||||
`Overfull \hbox (0.49452pt too wide)`。
|
|
||||||
- **行高**:`row{..}={ht=..}` 是**内容区**高度,hline 线宽不含在内,
|
|
||||||
每行实际比 ht 高整整一个 `\gdrule`(0.5pt)。13 行累计多 6.5pt,
|
|
||||||
必须逐档减掉 0.1764mm。
|
|
||||||
|
|
||||||
### 5. 单元格里想"整体下移",只有一种写法有效
|
## 注意
|
||||||
|
|
||||||
`\gdheadIII` 要让「标注」+ 小注两段整体下移 1.49pt,五种手段实测对比
|
清单条目是学校的固定要求,一般不改。示例中的 12 项即完整清单。
|
||||||
(数值为距行顶距离,末项是两段间距):
|
|
||||||
|
|
||||||
| 手段 | 标注 | 小注 | 间距 | 结论 |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| 原样 | 25.43 | 46.53 | 21.09 | 偏低 1.49 |
|
|
||||||
| 尾部 `\vspace*{-2.98pt}` | 26.92 | 48.01 | 21.10 | ✅ 正确 |
|
|
||||||
| 顶部 `\vspace*{+2.98pt}` | 23.95 | 48.01 | 24.06 | 反向且拉大间距 |
|
|
||||||
| 顶部 `\rule{0pt}{26.5pt}` | 31.25 | 52.34 | 21.09 | 位移过大 |
|
|
||||||
| `\raisebox{-1.49pt}{\vbox{..}}` | 25.43 | 46.53 | 21.09 | 完全无效 |
|
|
||||||
|
|
||||||
原理:尾部间距 s 改变盒子总高 H(H' = H + s),m 居中后
|
|
||||||
内容顶端 = 行顶 + (行高 − H')/2。所以 **s 与位移是 2:1 关系**,
|
|
||||||
但实测灵敏度是 0.778 而非 0.5(hline 也参与高度分配),故最终标定值是
|
|
||||||
`\vspace*{-2.98pt}` 而不是 −1.49×2。
|
|
||||||
|
|
||||||
顺带一个反直觉的点:**顶部间距会被首行的 ascent 吃掉** —— 3.6pt 的
|
|
||||||
`\rule` 远小于 18pt 字的 ascent,写了等于没写;必须超过 ascent 才有反应,
|
|
||||||
但那时位移已经过量。所以"顶部加高"这条路走不通。
|
|
||||||
|
|
||||||
## 字体
|
|
||||||
|
|
||||||
全部来自仓库公共字体包 [`../fonts.tex`](../fonts.tex),来源与授权见
|
|
||||||
[`../fonts/README.md`](../fonts/README.md)。
|
|
||||||
|
|
||||||
原稿中文用「方正楷体_GB2312」(商业字体,不允许随仓库分发),现换成
|
|
||||||
**OUC Kai**(霞鹜文楷 GB2312 子集,SIL OFL 1.1)—— 同为楷体、同为
|
|
||||||
GB2312 字符集,字宽逐字相同(实测「考试签到表」= 60.00pt,
|
|
||||||
「试卷(项目设计报告)」= 120.00pt,与原稿全等)。西文/数字原用
|
|
||||||
Times New Roman,现用 **TeX Gyre Termes**(度量兼容替代)。
|
|
||||||
|
|
||||||
## 一个已知的"不改动"
|
|
||||||
|
|
||||||
原表 `tblGrid` 合计 8540 twips = **150.64mm**,而原版心 210 − 2×31.75
|
|
||||||
= **146.50mm** —— 原文档里这张表本来就在版心之外各溢出 2.07mm,靠
|
|
||||||
`jc=center` 居中掩盖,看起来正常。
|
|
||||||
|
|
||||||
本模板把版心直接设成表宽(150.81mm),表格居中与纸面绝对位置与原稿一致
|
|
||||||
(见上面的实测校验),但不再"溢出版心":**视觉上无差别,且不产生
|
|
||||||
Overfull 警告**。这是唯一的主动偏离,属修正而非改版。
|
|
||||||
+82
-96
@@ -1,126 +1,112 @@
|
|||||||
# 课程大纲
|
# 课程大纲
|
||||||
|
|
||||||
中国海洋大学本科生课程大纲 LaTeX 模板。
|
中国海洋大学本科生课程大纲,A4 多页。
|
||||||
|
|
||||||
## 来源
|
|
||||||
|
|
||||||
版式取自学校下发的 `课程大纲模板-数字逻辑-2024版.docx`
|
|
||||||
(2025-01-02 修订,45 段落 + 6 表格),所有尺寸从 OOXML 量出。
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd 课程大纲
|
cd 课程大纲
|
||||||
xelatex 课程大纲.tex # 单次即可,无交叉引用
|
xelatex 课程大纲.tex
|
||||||
|
xelatex 课程大纲.tex % 跑两遍,目录与交叉引用才正确
|
||||||
```
|
```
|
||||||
|
|
||||||
或在仓库根:
|
或仓库根:`bash build.sh 课程大纲`(自动跑两遍)
|
||||||
|
|
||||||
```bash
|
|
||||||
bash build.sh 课程大纲
|
|
||||||
```
|
|
||||||
|
|
||||||
## 换课程改哪里
|
|
||||||
|
|
||||||
只有三处:
|
|
||||||
|
|
||||||
1. **文首的课程基本信息**(`\sylnamecn` 等 12 个宏)—— 对应表 0
|
|
||||||
2. **各章节正文** —— 一至八章
|
|
||||||
3. **四个表格的内容**
|
|
||||||
|
|
||||||
## 文件
|
## 文件
|
||||||
|
|
||||||
| 文件 | 作用 |
|
| 文件 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `oucSyllabus.sty` | 版式包(页面、字体、表格环境) |
|
| `课程大纲.tex` | 主文件,课程信息与正文改这里 |
|
||||||
| `课程大纲.tex` | 示例,用数字逻辑的真实内容(已脱敏) |
|
| `oucSyllabus.sty` | 版式包,一般不改 |
|
||||||
| `README.md` | 本文件 |
|
|
||||||
|
|
||||||
## 版式参数(实测)
|
## 换课程要改三处
|
||||||
|
|
||||||
```
|
1. 文首的课程基本信息(`\newcommand` 那一段)
|
||||||
页面 A4 210 × 297 mm
|
2. 各章节正文
|
||||||
边距 上下左右均 25.4 mm(正好 1 英寸)
|
3. 各表格的内容
|
||||||
正文字号 12pt
|
|
||||||
大标题 15pt 居中
|
|
||||||
表格 9~10pt
|
|
||||||
```
|
|
||||||
|
|
||||||
## 字体
|
## 课程基本信息
|
||||||
|
|
||||||
全部取自仓库 `../fonts.tex`,**无系统字体依赖**:
|
在 `\begin{document}` 之前定义:
|
||||||
|
|
||||||
| 用途 | 字体 |
|
|
||||||
|---|---|
|
|
||||||
| 中文正文 | OUC Serif(思源宋体子集) |
|
|
||||||
| 章节标题 | OUC Sans(思源黑体子集) |
|
|
||||||
| 西文数字 | 默认西文族(`\TNR{}` 可局部切换) |
|
|
||||||
|
|
||||||
⚠️ 原 docx 用了「仿宋_GB2312」和「微软雅黑」,都是商业字体,
|
|
||||||
不能随仓库分发,且换机器编不出来。这是 #17 脱敏时定下的规矩。
|
|
||||||
|
|
||||||
## 结构说明
|
|
||||||
|
|
||||||
一章一节对照:
|
|
||||||
|
|
||||||
| 章节 | 内容 | 表格 |
|
|
||||||
|---|---|---|
|
|
||||||
| 表 0 | 课程基本信息 | 6 行,不规则(见下) |
|
|
||||||
| 一 | 课程介绍 | — |
|
|
||||||
| 二 | 课程目标 | 表 1(打勾矩阵)、表 2(目标×内容) |
|
|
||||||
| 三 | 学习要求 | — |
|
|
||||||
| 四 | 教学进度 | 表 3(8×5) |
|
|
||||||
| 五 | 参考教材 | — |
|
|
||||||
| 六 | 成绩评定 | 表 4(成绩对应)、表 5(评分体系) |
|
|
||||||
| 七 | 学术诚信 | — |
|
|
||||||
| 八 | 大纲审核 | — |
|
|
||||||
|
|
||||||
### 表 0 是不规则表
|
|
||||||
|
|
||||||
四行的列跨度不同:
|
|
||||||
|
|
||||||
```
|
|
||||||
R0 课程名称 | (中文)xxx ← 值跨 5 列
|
|
||||||
R1 课程名称 | (英文)xxx ← 值跨 5 列
|
|
||||||
R2 课程代码 | 值 | 责任教师 | 值 ← 4 格
|
|
||||||
R3 课程属性 | 值 | 课程性质 | 值 ← 4 格
|
|
||||||
R4 学分 | 值 | 总课时 | 值 ← 4 格
|
|
||||||
R5 理论课时 | 值 | 实践课时 | 值 | 课外学时 | 值 ← 6 格
|
|
||||||
```
|
|
||||||
|
|
||||||
### ⚠️ tabularray 的 `\SetCell` 陷阱(重要)
|
|
||||||
|
|
||||||
**`\SetCell[c=n]{c} 内容 & 下一格` 会吞掉下一格,内容消失,且不报错。**
|
|
||||||
|
|
||||||
最小复现(6 列表):
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
A & \SetCell[c=2]{c} B & C & \SetCell[c=2]{c} D \\
|
\newcommand{\sylnamecn}{数字逻辑} % 课程名称(中文)
|
||||||
% 渲染只得 A / B / D —— C 消失了
|
\newcommand{\sylnameen}{Digital Logic} % 课程名称(英文)
|
||||||
|
\newcommand{\sylcode}{080502101231} % 课程代码
|
||||||
|
\newcommand{\sylteacher}{张远航} % 责任教师
|
||||||
|
\newcommand{\sylattr}{专业知识} % 课程属性
|
||||||
|
\newcommand{\sylnature}{必修} % 必修/选修
|
||||||
|
\newcommand{\sylcredit}{2.5} % 学分
|
||||||
|
\newcommand{\sylhours}{48} % 总学时
|
||||||
|
\newcommand{\syltheory}{32} % 理论学时
|
||||||
|
\newcommand{\sylpractice}{16} % 实践学时
|
||||||
|
\newcommand{\sylextra}{32} % 课外学时
|
||||||
```
|
```
|
||||||
|
|
||||||
正确写法:跨 n 列后用 n-1 个 `{}` 占位
|
| 参数 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `\sylnamecn` | 课程名称(中文) |
|
||||||
|
| `\sylnameen` | 课程名称(英文) |
|
||||||
|
| `\sylcode` | 课程代码 |
|
||||||
|
| `\sylteacher` | 责任教师 |
|
||||||
|
| `\sylattr` | 课程属性(专业知识 / 通识教育 …) |
|
||||||
|
| `\sylnature` | 必修 / 选修 |
|
||||||
|
| `\sylcredit` | 学分 |
|
||||||
|
| `\sylhours` | 总学时 |
|
||||||
|
| `\syltheory` | 理论学时 |
|
||||||
|
| `\sylpractice` | 实践学时 |
|
||||||
|
| `\sylextra` | 课外学时 |
|
||||||
|
|
||||||
|
## 正文写法
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
A & \SetCell[c=2]{c} B & {} & C & \SetCell[c=2]{c} D & {} \\
|
\oucsylmaintitle{中国海洋大学本科生课程大纲}
|
||||||
% 渲染得 A / B / C / D,位置正确
|
|
||||||
|
\oucsylsection{一、课程介绍}
|
||||||
|
\oucsylsubsection{1.课程描述(中英文):}
|
||||||
|
\oucsylp{数字逻辑是数字电路逻辑设计的简称……}
|
||||||
|
\oucsylp{Digital logic, short for digital logic circuit design, ...}
|
||||||
|
|
||||||
|
\oucsylsubsection{2.设计思路:}
|
||||||
|
\oucsylp{本课程主要讲授……}
|
||||||
|
|
||||||
|
\oucsylsection{二、课程目标}
|
||||||
|
\oucsylp{通过对该课程的学习,学生将达到如下课程目标:}
|
||||||
```
|
```
|
||||||
|
|
||||||
**规律:`&` 总数固定为「列数 - 1」,与是否跨列无关。**
|
| 命令 | 用途 |
|
||||||
跨列只是把内容摊到多格上,被摊掉的格要用 `{}` 顶住。
|
|---|---|
|
||||||
|
| `\oucsylmaintitle{标题}` | 主标题 |
|
||||||
|
| `\oucsylsection{标题}` | 一级节(一、二、三…) |
|
||||||
|
| `\oucsylsubsection{标题}` | 二级节(1.2.3.…) |
|
||||||
|
| `\oucsylsubsub{标题}` | 三级节 |
|
||||||
|
| `\oucsylp{正文}` | 正文段落,首行缩进 |
|
||||||
|
| `\oucsylpz{正文}` | 正文段落,不缩进 |
|
||||||
|
| `\oucsylsignature` | 签字栏 |
|
||||||
|
|
||||||
例外:`c=n` 放在行末(直接 `\\`,后面不接 `&`)也能正确渲染,
|
编号(一、二 / 1.2.)手写在参数里,模板不自动生成。
|
||||||
这种写法更易读,本模板 R0/R1 用的就是它。
|
|
||||||
|
|
||||||
## 已知偏离
|
## 表格
|
||||||
|
|
||||||
| 位置 | 原 docx | 本模板 | 原因 |
|
课程大纲有四个表:课程基本信息、课程目标与毕业要求对应关系、
|
||||||
|---|---|---|---|
|
教学内容与学时分配、考核方式与成绩构成。
|
||||||
| 「六、成绩评定」字号 | 10.5pt | 12pt | 原文件此处与其余七章不一致,是复制粘贴漏改 |
|
|
||||||
| 行距 | 由 Word 自动 | 12pt/19pt | 与原文件观感一致,未逐行卡死 |
|
|
||||||
| 表 0 的竖线 | 逐行不同 | 统一 6 等分 | tabularray 限制,见上 |
|
|
||||||
|
|
||||||
## 脱敏
|
表格用 `tblr`(tabularray)环境,合并格用 `\SetCell`。改内容时
|
||||||
|
注意**每行的段数要与列数一致**,被合并掉的格子留空。
|
||||||
|
|
||||||
责任教师等姓名一律为虚构(`张远航`),与仓库其他模板一致。
|
```latex
|
||||||
真实内容不进仓库。
|
\SetCell[c=1]{c} 课程名称 & \SetCell[c=5]{l} (中文)\sylnamecn \\
|
||||||
|
```
|
||||||
|
|
||||||
|
## 版式
|
||||||
|
|
||||||
|
```
|
||||||
|
A4,多页
|
||||||
|
正文宋体,标题黑体,表格内 9pt
|
||||||
|
表格带边框,合并单元格较多
|
||||||
|
页眉页脚含课程名称
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意
|
||||||
|
|
||||||
|
示例内容为虚构数据,使用时全部替换。
|
||||||
+76
-256
@@ -1,40 +1,33 @@
|
|||||||
# `课程执行大纲` —— 本科课程教学执行大纲、教学日历(LaTeX 模板)
|
# 课程执行大纲
|
||||||
|
|
||||||
中国海洋大学下发的《本科课程教学执行大纲》Word 模板的 XeLaTeX 复刻版。
|
中国海洋大学本科课程教学执行大纲,A4 多页(含封面、基本信息表、各节正文)。
|
||||||
内容全部**虚构**(课程名、课程代码、开课号、教师、教材、思政案例),只复刻版式。
|
|
||||||
|
|
||||||
> 样张是一份**填完整的虚构大纲**:《信号与系统基础》2026 秋、电子信息工程专业、
|
|
||||||
> 56 课时 3.0 学分(含 18 实践学时)、开课号 `99663311`、任课教师「陈立群」、
|
|
||||||
> 教材用吴大正《信号与线性系统分析》(高等教育出版社)、参考书用郑君里那本。
|
|
||||||
>
|
|
||||||
> 注意**本模板刻意不套用其他模板的「数字逻辑 / 张远航」那套设定** ——
|
|
||||||
> 这份大纲原作就是《信号与线性系统分析》的课,强行改成数字逻辑,
|
|
||||||
> 大纲里的章节体系、学时分配、思政案例就全对不上了。虚构也要虚构得自洽。
|
|
||||||
|
|
||||||
| 文件 | 说明 |
|
|
||||||
|---|---|
|
|
||||||
| `课程执行大纲.tex` | 主文件。虚构课程的一份完整示例 |
|
|
||||||
| `ouccourse.sty` | 版式宏包。尺寸全部从原 docx 的 OOXML 量出 |
|
|
||||||
| `课程执行大纲.pdf` | 编译产物,5 页(与原 docx 一致) |
|
|
||||||
|
|
||||||
## 编译
|
## 编译
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
xelatex 课程执行大纲.tex # 单次即可,无交叉引用
|
cd 课程执行大纲
|
||||||
|
xelatex 课程执行大纲.tex
|
||||||
|
xelatex 课程执行大纲.tex % 跑两遍,目录与交叉引用才正确
|
||||||
```
|
```
|
||||||
|
|
||||||
需要 `ctex` + `geometry` + `fontspec` + `xeCJK` + `tabularray`。
|
或仓库根:`bash build.sh 课程执行大纲`(自动跑两遍)
|
||||||
实测环境:TeX Live 2022 / tabularray 2022A。
|
|
||||||
|
|
||||||
## 换成一门真实的课
|
## 文件
|
||||||
|
|
||||||
**只改 `课程执行大纲.tex` 顶部的宏定义,不要动 `ouccourse.sty`。**
|
| 文件 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `课程执行大纲.tex` | 主文件,课程信息与正文改这里 |
|
||||||
|
| `ouccourse.sty` | 版式包,一般不改 |
|
||||||
|
|
||||||
|
## 课程信息
|
||||||
|
|
||||||
|
在 `\begin{document}` 之前定义:
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\cfcourse}{信号与系统基础} % 课程名
|
\newcommand{\cfcourse}{信号与系统基础} % 课程名
|
||||||
\newcommand{\cfyear}{2026} % 学年
|
\newcommand{\cfyear}{2026} % 开课年份
|
||||||
\newcommand{\cfseason}{秋} % 季学期
|
\newcommand{\cfseason}{秋} % 季
|
||||||
\newcommand{\cfmode}{考试} % 考核方式:考试/考查/论文
|
\newcommand{\cfmode}{考试} % 考核方式
|
||||||
\newcommand{\cfcode}{081203304517} % 课程代码
|
\newcommand{\cfcode}{081203304517} % 课程代码
|
||||||
\newcommand{\cfhour}{56} % 总课时
|
\newcommand{\cfhour}{56} % 总课时
|
||||||
\newcommand{\cfcredit}{3.0} % 学分
|
\newcommand{\cfcredit}{3.0} % 学分
|
||||||
@@ -45,248 +38,75 @@ xelatex 课程执行大纲.tex # 单次即可,无交叉引用
|
|||||||
\newcommand{\cfattr}{专业核心必修课} % 课程属性
|
\newcommand{\cfattr}{专业核心必修课} % 课程属性
|
||||||
```
|
```
|
||||||
|
|
||||||
正文各节直接用 `\ccsec{}`(一级标题)、`\ccp{}`(带 2 字首行缩进的正文)。
|
| 参数 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `\cfcourse` | 课程名 |
|
||||||
|
| `\cfyear` | 开课年份 |
|
||||||
|
| `\cfseason` | 季学期,春 / 秋 |
|
||||||
|
| `\cfmode` | 考核方式(考试 / 考查) |
|
||||||
|
| `\cfcode` | 课程代码 |
|
||||||
|
| `\cfhour` | 总课时 |
|
||||||
|
| `\cfcredit` | 学分 |
|
||||||
|
| `\cfprac` | 实践学时 |
|
||||||
|
| `\cfteacher` | 任课教师 |
|
||||||
|
| `\cfteachno` | 开课号 |
|
||||||
|
| `\cfmajor` | 面向专业 |
|
||||||
|
| `\cfattr` | 课程属性 |
|
||||||
|
|
||||||
### 表 0 —— 成绩综合评分体系
|
## 正文写法
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\begin{ccscoretable}
|
\ccschool
|
||||||
成绩综合评分体系 & 比例\% \\ % 表头
|
\ccsubtitle
|
||||||
1.课下作业、课堂讨论及平常表现 & 24 \\
|
\ccmaintitle{本科课程执行大纲}
|
||||||
2.实验成绩 & 20 \\
|
|
||||||
3.期末考试成绩 & 56 \\
|
\ccsec{一、课程基本信息}
|
||||||
总计 & 100 \\
|
|
||||||
\end{ccscoretable}
|
\ccfieldrow{【课程名】}{\cfcourse}{【开课时间】}{\cfyear\ 学年 \cfseason\ 季学期}
|
||||||
|
\ccfieldrow{【考核方式】}{\cfmode}{【课程代码】}{\cfcode}
|
||||||
|
\ccfieldrow{【总课时/学分】}{\cfhour/\cfcredit}{【实践学时】}{\cfprac}
|
||||||
|
\ccfieldone{【任课教师/开课号】}{\cfteacher/\cfteachno}
|
||||||
|
\ccfieldone{【面向专业/课程属性】}{\cfmajor/\cfattr}
|
||||||
|
|
||||||
|
\ccsec{二、课程内容}
|
||||||
|
\ccp{1.课程描述(中英文):}
|
||||||
|
\ccp{本课程是电子信息类专业的核心基础课……}
|
||||||
|
\ccp{This course is a core foundation subject for ...}
|
||||||
```
|
```
|
||||||
|
|
||||||
行数可以增减,行高自动(每行 7.834mm)。
|
| 命令 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| `\ccschool` | 印「中国海洋大学」校名 |
|
||||||
|
| `\ccsubtitle` | 印副标题 |
|
||||||
|
| `\ccmaintitle{标题}` | 主标题 |
|
||||||
|
| `\ccsec{标题}` | 一级节(一、二、三…) |
|
||||||
|
| `\ccp{正文}` | 正文段落 |
|
||||||
|
| `\ccpz{正文}` | 正文段落,不缩进 |
|
||||||
|
| `\ccfieldrow{标签1}{值1}{标签2}{值2}` | 一行两栏的信息行 |
|
||||||
|
| `\ccfieldone{标签}{值}` | 一行一栏的信息行 |
|
||||||
|
| `\ccblank{n}` | n 个空行位 |
|
||||||
|
| `\ccdateblank` | 日期空位 |
|
||||||
|
| `\ccsignlab{文字}` | 签字栏标签 |
|
||||||
|
| `\ccnewpage` | 强制分页 |
|
||||||
|
|
||||||
### 表 1 —— 教学日历
|
## 表格
|
||||||
|
|
||||||
```latex
|
教学安排表、考核方式表用 `tblr` 环境。表宽常量:
|
||||||
\begin{cctable}
|
|
||||||
{\ccfang\ccszxi\bfseries 周次} & ... & {\ccszix 内容} & 2 & {\ccszix ...} & {\ccszix ...} \\
|
|
||||||
\end{cctable}
|
|
||||||
```
|
|
||||||
|
|
||||||
- 6 列,顺序固定:周次 / 内容顺序 / 主题 / 计划课时 / 教学内容及教学方式 / 思政点及支撑指标点情况
|
| 常量 | 说明 |
|
||||||
- 纵向合并周次段用 `\SetCell[r=2]{c}`(跨 2 行,`r=N` 即跨 N 行)
|
|---|---|
|
||||||
- 表尾「合计」行后有两个 `\SetCell[c=6]{c}` 的整行合并(任课老师签字 / 审核意见)
|
| `\cctblw` | 表格总宽 |
|
||||||
- 表内默认 9pt;表头用 `\ccszxi`(11pt)加粗;审核意见格内部钉死 10.5pt/12.6pt
|
| `\ccAwd` … `\ccFwd` | 各列宽度 |
|
||||||
|
| `\ccscoretblw` / `\ccscoreAwd` / `\ccscoreBwd` | 成绩表的宽与列宽 |
|
||||||
|
|
||||||
## 版式数据来源(twips → mm)
|
## 版式
|
||||||
|
|
||||||
原 docx 的 `sectPr`:
|
|
||||||
|
|
||||||
| 属性 | twips | mm | 说明 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `pgSz w` | 11910 | 210.08 | WPS 存的"非标准 A4",本包用标准 210 |
|
|
||||||
| `pgSz h` | 16840 | 297.04 | 同上,用 297 |
|
|
||||||
| `pgMar top` | 1420 | 25.05 | 上边距 |
|
|
||||||
| `pgMar bottom` | 280 | **4.94** | 下边距极小,原文件为塞进 5 页压出来的 |
|
|
||||||
| `pgMar left` | 1560 | 27.52 | 左边距 |
|
|
||||||
| `pgMar right` | 1300 | 22.93 | 右边距(左右不对称,照抄) |
|
|
||||||
| `pgMar header/footer` | 720 | 12.70 | 无页眉页脚内容,仅占位 |
|
|
||||||
|
|
||||||
换算:`mm = twips / 1440 × 25.4`,`pt = twips / 20`。
|
|
||||||
|
|
||||||
### 表 0(成绩综合评分体系)
|
|
||||||
|
|
||||||
| 项目 | twips | mm |
|
|
||||||
|---|---|---|
|
|
||||||
| `gridCol` | 7479 + 1418 | 131.921 + 25.012 |
|
|
||||||
| 表宽 | 8897 | **156.93** |
|
|
||||||
| `tblCellMar left/right` | 108 | 1.905 |
|
|
||||||
| `trHeight`(exact) | 454 | 8.01(本包用 7.834,见坑 3) |
|
|
||||||
| 边框 `sz` | 4 | 0.5pt |
|
|
||||||
|
|
||||||
`tblLayout fixed`、`jc center`、`tblW 0 auto`。全表 12pt 仿宋(朱雀仿宋)。
|
|
||||||
|
|
||||||
### 表 1(教学日历)
|
|
||||||
|
|
||||||
| 项目 | twips | mm |
|
|
||||||
|---|---|---|
|
|
||||||
| `gridCol` | 846,1134,1877,850,2835,1843 | 14.922, 20.002, 33.108, 14.993, 50.006, 32.508 |
|
|
||||||
| 表宽 | 9385 | **165.54**(超版心 5.91) |
|
|
||||||
| `trHeight` R0(atLeast) | 917 | 16.17 |
|
|
||||||
| `trHeight` R14(atLeast) | 1825 | 32.19 |
|
|
||||||
| `trHeight` R15(atLeast) | 1073 | 18.93(只是下限,实际被撑到 56mm) |
|
|
||||||
|
|
||||||
**16 行**。R1~R13 无 `trHeight`,行高由内容决定。纵向合并 5 组(R1-R2、R3-R4、
|
|
||||||
R5-R6、R7-R8、R9-R10);R14/R15 是 `gridSpan=6` 的整行合并。
|
|
||||||
|
|
||||||
## 六个必须知道的坑
|
|
||||||
|
|
||||||
### 1. 表宽 > 版心时,不要缩放列宽
|
|
||||||
|
|
||||||
docx 里表 1 是 165.54mm,版心只有 159.55mm。Word 允许表格超出、居中后压进左右页边距。
|
|
||||||
|
|
||||||
**不要按 159.55/165.54 按比例缩列宽。** 缩了之后长文字会提前折行,行高、页数全变。
|
|
||||||
正确做法:列宽照抄 `gridCol`,用 `\leftskip` 把整块左移。
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\hsize=\cctblw \linewidth=\cctblw % 让表内得下,不报 Overfull
|
|
||||||
\leftskip=-\cctblshift \rightskip=0pt % 整块左移 5.29mm,落到 22.23mm
|
|
||||||
```
|
|
||||||
|
|
||||||
`\hspace*` 对 `longtblr` 生成的 `\halign` 盒子**无效**,会被吞掉,必须用 `\leftskip`。
|
|
||||||
|
|
||||||
### 2. `wd=` 是内容宽,不含竖线自身的宽度
|
|
||||||
|
|
||||||
tabularray 的 `Q[...,wd=X]` 里 X 是**内容宽**。每条 `vline` 自身还占 0.5pt = 0.17639mm。
|
|
||||||
|
|
||||||
```
|
```
|
||||||
表 1:6 列 7 条线,每列承担 7/6 条 ⇒ wd = gridCol − 2×colsep − 0.2058
|
A4,多页
|
||||||
表 0:2 列 3 条线,每列承担 1.5 条 ⇒ wd = gridCol − 2×colsep − 0.2646
|
封面 + 基本信息表 + 各节正文
|
||||||
|
正文宋体,标题黑体,表格 9pt
|
||||||
```
|
```
|
||||||
|
|
||||||
漏算的后果很隐蔽:表看起来对,但总宽每列多 0.18mm,6 列就差出 1mm。
|
## 注意
|
||||||
|
|
||||||
### 3. `ht=` 也含横线宽度预算
|
示例内容为虚构数据,使用时全部替换。签字栏留空手填。
|
||||||
|
|
||||||
`row{1-Z}={ht=8.01mm}` 画出来是 **8.19mm**(每行多一条 0.5pt 横线)。
|
|
||||||
要得到 8.01mm 的真实行高,`ht` 要给 **7.834mm**。
|
|
||||||
|
|
||||||
### 4. `presep/postsep/headsep/footsep` 是 outer 键
|
|
||||||
|
|
||||||
写进 `\begin{longtblr}[...]` 的**方括号**里;写进花括号(inner spec)不会生效,
|
|
||||||
反而会把 `0pt` 当表内容印在表格第一行 —— 表头上会出现一串
|
|
||||||
`0pt0pt0pt0pt` 的垃圾文字,而且**不报错**。
|
|
||||||
|
|
||||||
同理,表级默认字号必须写 `cells={font=\ccszix}`,单独写 `font=` 会被静默忽略。
|
|
||||||
|
|
||||||
### 5. 跨页续页提示要清两组模板
|
|
||||||
|
|
||||||
`longtblr` 跨页时默认印 `( Continued )`、表尾印 `Continued on next page`,
|
|
||||||
有 caption 时还印 `表0:`。清干净要动两组:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
% (a) 内容模板 *-text —— 不能设成 empty!会报
|
|
||||||
% "LaTeX3 Error: Erroneous variable \l__tblr_template_conthead_text_tl"
|
|
||||||
\DefTblrTemplate{conthead-text}{normal}{}
|
|
||||||
\DefTblrTemplate{contfoot-text}{normal}{}
|
|
||||||
\SetTblrTemplate{conthead-text}{normal}
|
|
||||||
\SetTblrTemplate{contfoot-text}{normal}
|
|
||||||
% (b) 模板实例
|
|
||||||
\SetTblrTemplate{caption-tag}{empty}
|
|
||||||
\SetTblrTemplate{caption-sep}{empty}
|
|
||||||
\SetTblrTemplate{caption-text}{empty}
|
|
||||||
\SetTblrTemplate{caption}{empty}
|
|
||||||
\SetTblrTemplate{conthead}{empty}
|
|
||||||
\SetTblrTemplate{contfoot}{empty}
|
|
||||||
```
|
|
||||||
|
|
||||||
只做 (b) 时第 5 页仍会出现「表0:」与「(Continued)」,因为模板实例里调的是
|
|
||||||
`\UseTblrTemplate{...}{default}`,会回退到 `normal` 内容。
|
|
||||||
|
|
||||||
### 6. `\linespread` 是乘在基准字号上的
|
|
||||||
|
|
||||||
ctex 默认 `\linespread ≈ 1.3`,会把 `\fontsize{12}{18}` 的行距放大到 23.4pt。
|
|
||||||
|
|
||||||
给字号设行距时**必须**先归 1:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\newcommand{\ccfont}[2]{\linespread{1}\relax\fontsize{#1}{#2}\selectfont}
|
|
||||||
```
|
|
||||||
|
|
||||||
反过来,在已经缩小过字号的上下文里,**不能**用 `\linespread{1.2}` 当"1.2 倍行距"
|
|
||||||
(它乘的是外层的 9pt,不是当前的 10.5pt),要直接钉 `\fontsize{10.5}{12.6}`。
|
|
||||||
|
|
||||||
## 字体
|
|
||||||
|
|
||||||
原 docx 用了 4 个字体,其中 3 个是**方正商业字体**,嵌在 docx 里但本机没装。
|
|
||||||
旧版做法是降级到 Windows 自带字体(宋体/黑体/仿宋 + `AutoFakeBold` 伪粗),
|
|
||||||
但这既依赖本机装了什么字体(换台机器就可能编不出),而且 SimSun / SimHei /
|
|
||||||
FangSong 也都不允许随仓库分发。
|
|
||||||
|
|
||||||
现在全部改用仓库公共字体包 `../fonts.tex`:
|
|
||||||
|
|
||||||
| docx 原字体 | 用在哪 | 本包替代 | 命令 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| 方正小标宋简体 | 校名、副标题、大标题、教学日历 | OUC Serif **真粗体** | `\ccbiaosong` |
|
|
||||||
| 方正仿宋_GB2312 | 正文、表 0、签字栏 | 朱雀仿宋 | `\ccfang` |
|
|
||||||
| 黑体 | 各级标题 | OUC Sans(思源黑体) | `\cchei` |
|
|
||||||
| 宋体 | 教学日历表 9pt | OUC Serif(思源宋体) | `\ccsong` |
|
|
||||||
|
|
||||||
比原来的伪粗更好:小标宋本来就是宋体的标题变体,用思源宋体自带的真粗体,
|
|
||||||
笔画不会像 `AutoFakeBold=3.2` 那样糊在一起。
|
|
||||||
|
|
||||||
> ⚠️ **朱雀仿宋只有常规一档**,`\ccfang` 下 `\bfseries` 不会真的变粗。
|
|
||||||
> 教学日历表头(`课程执行大纲.tex` 里的 `{\ccfang\ccszxi\bfseries 周次}` 等 6 处)
|
|
||||||
> 原来靠 `AutoFakeBold=2.5` 伪粗,现在给 `ccfang` 单独开了 `FakeBold=0.8`
|
|
||||||
> 保住层次(见 `ouccourse.sty` 的注释)。若要更实在的粗体,把那几处
|
|
||||||
> `\ccfang` 换成 `\cchei` —— 黑体本身就是标题用的重字面。
|
|
||||||
|
|
||||||
同时 `\xeCJKsetup{CJKecglue={}}` 关掉了西文与汉字之间的自动空隙 —— 原 docx 没有这种空隙,
|
|
||||||
不关会在中英交界处多出一个空格(原 docx 里紧挨着的「2026 学年」「56/3.0」都会松开)。
|
|
||||||
|
|
||||||
## 院名可改(原先是硬编码的 ×× 占位)
|
|
||||||
|
|
||||||
首页抬头第二行原本在 `ouccourse.sty` 里**写死**成「××学部××学院」,PDF 里
|
|
||||||
能直接看到 4 个叉号。现在拆成两个名称宏,改院名只动导言区:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\renewcommand{\ccdepartment}{海洋地球科学学院} % 默认「信息科学与工程学部」
|
|
||||||
\renewcommand{\cccollege}{地质学系} % 默认「计算机科学与技术学院」
|
|
||||||
```
|
|
||||||
|
|
||||||
默认值取自本模板的虚构设定(陈立群 / 电子信息工程 / 2025 秋),与课程教学日历、
|
|
||||||
成绩构成说明、试卷等模板保持一致。校名「中国海洋大学」是真实的,不虚构。
|
|
||||||
|
|
||||||
> ⚠️ 为什么不写成 `\ccschool[学部][学院]`:LaTeX 的 `\newcommand` 只支持
|
|
||||||
> **一个**可选参数,第二个方括号会被当成正文印出来。
|
|
||||||
|
|
||||||
## 与 docx 的已知差异
|
|
||||||
|
|
||||||
| 项目 | docx | 本模板 | 原因 |
|
|
||||||
|---|---|---|---|
|
|
||||||
| 纸张 | 210.08 × 297.04 | 210 × 297 | 标准 A4,肉眼不可辨 |
|
|
||||||
| 表格是否跨页 | 表 1 跨第 4/5 页 | 同 | 表高 334mm > 版心 267mm |
|
|
||||||
| 跨页处表头 | 不重复(无 `tblHeader`) | 不重复 | 一致 |
|
|
||||||
| 行内是否允许断开 | 允许(无 `cantSplit`) | 允许 | 一致 |
|
|
||||||
| 表 0 每行高 | 8.01 | 8.01 | 一致 |
|
|
||||||
| 表 1 表宽 | 165.54 | 165.36(−0.18) | 竖线宽度舍入 |
|
|
||||||
| 字体 | 方正小标宋/仿宋 | 思源宋体粗/朱雀仿宋 | 商业字体不可分发,已换开源替代 |
|
|
||||||
| 修订标记 | 46 处 `w:ins` | 不保留 | 已接受全部插入修订 |
|
|
||||||
| 46 处 `w:ins` 中的红字 | `color=C00000` | 黑色 | 那是修订高亮,非正式版式 |
|
|
||||||
|
|
||||||
## 校验方法
|
|
||||||
|
|
||||||
不靠肉眼,靠量。
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pdftocairo -svg -f 4 -l 4 课程执行大纲.pdf /tmp/p4.svg # 矢量线条
|
|
||||||
pdftotext -bbox 课程执行大纲.pdf /tmp/bbox.html # 字坐标
|
|
||||||
```
|
|
||||||
|
|
||||||
或用 `pymupdf` 直接读(推荐,能同时拿到线段与 span 的 bbox):
|
|
||||||
|
|
||||||
```python
|
|
||||||
import pymupdf
|
|
||||||
d = pymupdf.open('课程执行大纲.pdf')
|
|
||||||
for dr in d[3].get_drawings(): # 表格横竖线
|
|
||||||
for it in dr['items']:
|
|
||||||
if it[0] == 'l':
|
|
||||||
print(it[1], it[2]) # 两端点,单位 pt
|
|
||||||
```
|
|
||||||
|
|
||||||
**注意**:同一条竖线会被重复计入多次(每个单元格一段),做列宽计算前必须
|
|
||||||
`sorted(set(round(x,2) ...))` 去重,否则 `xs[1]-xs[0]` 算出来是 0。
|
|
||||||
|
|
||||||
### 验收结果(实测,26/26 项达标)
|
|
||||||
|
|
||||||
```
|
|
||||||
表 0 宽 156.753 目标 156.930 差 −0.177
|
|
||||||
左 27.608 目标 27.520
|
|
||||||
高 40.040 目标 40.050
|
|
||||||
列 131.830 / 24.924 目标 131.921 / 25.012
|
|
||||||
表 1 宽 165.358 目标 165.540 差 −0.182
|
|
||||||
左 22.320 目标 22.270
|
|
||||||
列 14.894 / 19.971 / 33.076 / 14.965 / 49.975 / 32.477
|
|
||||||
目标 14.922 / 20.002 / 33.108 / 14.993 / 50.006 / 32.508
|
|
||||||
R0 16.334(目标 16.170) R14 32.385(目标 32.190)
|
|
||||||
R15 56.339(atLeast 下限 18.930,被 12 段内容撑高)
|
|
||||||
页数 5(与原 docx 一致)
|
|
||||||
编译 零错误、零 Overfull、零 Underfull
|
|
||||||
各页最低点均 ≤ 292.06mm 版心下沿,无越界
|
|
||||||
```
|
|
||||||
+66
-380
@@ -1,50 +1,27 @@
|
|||||||
# 课程教学日历 —— 中国海洋大学课程教学日历(理论课程)
|
# 课程教学日历
|
||||||
|
|
||||||
学校下发的**通用空白表**「附件3:中国海洋大学课程教学日历(理论课程)」的
|
中国海洋大学课程教学日历(理论课程),A4 单页,16 周日历表。
|
||||||
XeLaTeX 模板。原文件是学校统一的 `.doc` 表(7 列 × 18 行的 16 周教学日历 +
|
|
||||||
课程考核说明 + 签字栏),本目录把它做成可直接编译的 LaTeX 版。
|
|
||||||
|
|
||||||
> **本模板不含任何真实课程数据。** 原 `.doc` 是一份**填过的实例**,本模板只复刻
|
## 编译
|
||||||
> 它的版式,一个字段都没带过来 —— 见下面「真实数据零泄漏」。
|
|
||||||
>
|
|
||||||
> 但样张**不是满篇叉号**:为了能看出排版效果,填了一份**完整的虚构课程**——
|
|
||||||
> 《数字逻辑》2025 秋学期、计算机科学与技术学院、任课教师「张远航」、
|
|
||||||
> 86 人、4 学分 64 学时、开课号 `080502101231`,16 周周次与章节内容全部写满
|
|
||||||
> (含每章作业编号)。这套设定与 [`成绩构成说明/`](../成绩构成说明/)、
|
|
||||||
> [`试卷归档封面/`](../试卷归档封面/)、[`试卷/`](../试卷/) 是**同一门课**,
|
|
||||||
> 四份文档放在一起看是自洽的。
|
|
||||||
|
|
||||||
> 与 [`试卷归档封面/`](../试卷归档封面/)、[`试卷归档目录/`](../试卷归档目录/)
|
```bash
|
||||||
> 的关系:三件同属教务处下发的表格套件(附件1 封面、附件2 归档目录、
|
cd 课程教学日历
|
||||||
> 附件3 教学日历),版式上都照原 `.doc` 1:1 还原,做法同一套
|
xelatex 课程教学日历.tex
|
||||||
> (版心设成表格可见范围 + `caloutside` 环境放回表格外的段落),互不依赖。
|
xelatex 课程教学日历.tex % 跑两遍
|
||||||
|
```
|
||||||
|
|
||||||
|
或仓库根:`bash build.sh 课程教学日历`(自动跑两遍)
|
||||||
|
|
||||||
## 文件
|
## 文件
|
||||||
|
|
||||||
| 文件 | 说明 |
|
| 文件 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `oucal.sty` | 版式包。A4、表宽 174.625mm、7 列、18 行显式行高,每项尺寸都附换算过程 |
|
| `课程教学日历.tex` | 主文件,课程信息与 16 周内容改这里 |
|
||||||
| `课程教学日历.tex` | 正文入口(课程信息与 16 周内容写在这里) |
|
| `oucal.sty` | 版式包,一般不改 |
|
||||||
| `课程教学日历.pdf` | 成品样张 |
|
|
||||||
|
|
||||||
## 编译
|
## 课程信息
|
||||||
|
|
||||||
```bash
|
在 `\begin{document}` 之前定义:
|
||||||
xelatex 课程教学日历.tex
|
|
||||||
```
|
|
||||||
|
|
||||||
必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
|
|
||||||
自包含,不依赖任何图片。实测 **3 页**、零警告(无 Overfull / Underfull / 缺字)。
|
|
||||||
|
|
||||||
> ⚠️ 页数与原件不同:原件 2 页,本模板 3 页。原因见「原件的不一致之处」第 1 条 ——
|
|
||||||
> 原件第一周那一行的行距缺省(15.6pt),本模板统一按 23pt 排,多出 22pt,
|
|
||||||
> 正好把表格顶到第 3 页。这是**有意取舍**,不是 bug。
|
|
||||||
|
|
||||||
## 用法
|
|
||||||
|
|
||||||
### 课程信息
|
|
||||||
|
|
||||||
改 `.tex` 开头的宏(下面注释里的值是**样张实际用的虚构值**,不是占位符):
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\newcommand{\calcno}{附件3} % 附件编号
|
\newcommand{\calcno}{附件3} % 附件编号
|
||||||
@@ -60,369 +37,78 @@ xelatex 课程教学日历.tex
|
|||||||
\newcommand{\calassess}{闭卷考试} % 考核方式
|
\newcommand{\calassess}{闭卷考试} % 考核方式
|
||||||
```
|
```
|
||||||
|
|
||||||
> ⚠️ 改课程名 / 教师名时注意**字数**:表头标题、日期列宽都是按 4 字课程名、
|
| 参数 | 说明 |
|
||||||
> 3 字教师名标定的。课程名超过 6 字可能让「中国海洋大学 ○○ 课程教学日历」
|
|
||||||
> 那行折行,教师名超过 4 字会挤压签字栏。改完翻到 PDF 看一眼再走。
|
|
||||||
|
|
||||||
签字栏的「年 月 日」**没有对应的宏**,因为那是手写填写的空位,
|
|
||||||
模板中保持印刷好的「年」「月」「日」三个字,中间留白给老师签日期。
|
|
||||||
|
|
||||||
### 教学日历表
|
|
||||||
|
|
||||||
每行格式:
|
|
||||||
|
|
||||||
```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 | 355.08 | 355.09 | +0.01 |
|
|
||||||
| 签字栏「月」x | 376.08 | 376.09 | +0.01 |
|
|
||||||
| 签字栏「日」x | 397.08 | 397.10 | +0.02 |
|
|
||||||
|
|
||||||
### 行高(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) |
|
| `\calcno` | 左上角附件编号 |
|
||||||
| `\rule[-4.35pt]{0pt}{23pt}` 段首段尾各一 | 表头 150pt ✗(`\lineskip` 介入,每行多 1pt,首行基线跑到框外) |
|
| `\calcname` | 课程名称 |
|
||||||
| `\vrule height 18.65pt depth 4.35pt` | 与 `\rule` 同 |
|
| `\calyear` | 学年 |
|
||||||
|
| `\calseason` | 季学期,春 / 秋 |
|
||||||
|
| `\caldept` | 开课单位 |
|
||||||
|
| `\calcodenum` | 开课号,12 位数字 |
|
||||||
|
| `\calteacher` | 任课教师 |
|
||||||
|
| `\calcredit` | 课程学分 |
|
||||||
|
| `\calhour` | 总学时 |
|
||||||
|
| `\calstudent` | 学生人数 |
|
||||||
|
| `\calassess` | 考核方式 |
|
||||||
|
|
||||||
原因是 **xeCJK 的 `\CJKglue` 与 `\lineskip`** 会介入自动折行,行间距不是
|
## 16 周日历表
|
||||||
线性的,没法用单一 padding 同时满足 1/2/4/5 行。
|
|
||||||
|
|
||||||
**最终用的**:直接给 `row{n}={ht=...}`,把「行高」这件事从盒模型手里拿走。
|
每行一周,7 个栏目用 `&` 分隔:
|
||||||
`ht` 是最小值,配上内容刚好 = 目标值,结果确定、可复现。
|
|
||||||
|
|
||||||
### 3. `\linespread` 必须在 `\fontsize` **之后**调用
|
|
||||||
|
|
||||||
`\fontsize` 会重设 `\baselineskip`,把先前设的系数覆盖掉;反之
|
|
||||||
`\linespread` 改的是系数,对已生成的 `\baselineskip` 立即生效。
|
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\linespread{0.67826}\calfontC % ❌ 无效,行距还是 23pt
|
\begin{caltable}
|
||||||
\calfontC\linespread{0.67826}\selectfont % ✅ 15.6pt
|
\calctr{周次} & \calctr{日期} & \calctr{学时} & \calctr{教学内容} &
|
||||||
|
\calctr{教学方式} & \calctr{课堂讨论内容及其它教学环节} &
|
||||||
|
\calctr{课下作业及课后必读教材或参考书章节} \\
|
||||||
|
|
||||||
|
\calweek{第1周} & \caldate{9/1} & \calhourn{4} & 绪论 & 讲授 & —
|
||||||
|
& 教材第 1 章 \\
|
||||||
|
...
|
||||||
|
\end{caltable}
|
||||||
```
|
```
|
||||||
|
|
||||||
(本包最终没用这条 —— 见「原件的不一致之处」第 1 条。但改行距时会踩。)
|
| 命令 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| `\calctr{文字}` | 表头格(居中) |
|
||||||
|
| `\calcell{文字}` | 表体格(左对齐) |
|
||||||
|
| `\calweek{文字}` | 周次格 |
|
||||||
|
| `\caldate{文字}` | 日期格 |
|
||||||
|
| `\calhourn{数字}` | 学时格 |
|
||||||
|
|
||||||
### 4. `\SetCell[c=7]{c}` 里的 `c` 是自然宽度,不折行
|
增加周次直接复制一行改内容。删周次删整行。
|
||||||
|
|
||||||
跨列的格必须显式给宽,否则整句不折行、直接冲出表外报 Overfull:
|
## 版面微调
|
||||||
|
|
||||||
|
`\calskip{距离}` 控制各区块的垂直间距:
|
||||||
|
|
||||||
```latex
|
```latex
|
||||||
\SetCell[c=7]{c} % ❌ Overfull 197.8pt too wide
|
\calskip{-4.330mm} % 顶端补偿
|
||||||
\SetCell[c=7]{m,wd=170.638mm} % ✅
|
\calskip{2.894mm} % 附件编号到标题
|
||||||
|
\calskip{1.243mm} % 标题到学年行
|
||||||
|
\calskip{6.493mm} % 学年行到课程信息
|
||||||
```
|
```
|
||||||
|
|
||||||
`wd = 表宽 − 2×colsep − 取整余量 = 174.625 − 3.810 − 0.177 = 170.638mm`。
|
各数值是按版面标定的。改学校名或课程名后如有偏移,按其差值调整对应
|
||||||
|
的 `\calskip`,响应是线性的,一轮就能对准。
|
||||||
|
|
||||||
### 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
|
```latex
|
||||||
【开课单位】…\newline
|
\calfontA % 标题(附件编号、课程名、学年行)
|
||||||
【课程学分】…\par
|
\calfontB % 学年行
|
||||||
|
\calfontC % 课程信息行
|
||||||
```
|
```
|
||||||
|
|
||||||
注意 `\newline` 之后的行是"段中行",**不吃 `\parindent`**,只认 `\leftskip`,
|
定义在 `oucal.sty`,改字号或字体在那里改。
|
||||||
所以要在段落开头把 `\leftskip` 整体前移。
|
|
||||||
|
|
||||||
## 原件的不一致之处
|
## 版式
|
||||||
|
|
||||||
### 1. 第一周(第 2 行)的行距是 15.6pt,其余 17 行是 23pt
|
```
|
||||||
|
A4,单页
|
||||||
原 `.doc` 里只有这一行的段落没写 `w:spacing`,随 `docGrid`
|
标题黑体,表格 7 列 × 17 行(1 表头 + 16 周)
|
||||||
(`linePitch=312` twips = 15.6pt)排。于是该行高 47.3pt,而同为 3 行的
|
表格行高 23pt,行距统一
|
||||||
第五周(第 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`,**没有 `<w:b/>`**。
|
|
||||||
本模板照抄,不加粗。`\calhead` 保留了 `\bfseries` 的能力,想加粗自己去打开。
|
|
||||||
|
|
||||||
### 5. 签字栏的「年 月 日」是手写填空位,不要填年份
|
|
||||||
|
|
||||||
原件第 2 页底部两段:
|
|
||||||
|
|
||||||
| 段落 | 定位方式 | 起点 x |
|
|
||||||
|---|---|---|
|
|
||||||
| 「院(系)负责人签字:」 | `w:ind firstLine=4515`(79.64mm) | 321.00 |
|
|
||||||
| 「×××× 年 月 日」 | **无** `ind`,靠空格顶位 | 331.44 |
|
|
||||||
|
|
||||||
原件是被填过的实例,年份位印着 4 个半角数字(x=331.44~352.50)。
|
|
||||||
**本模板不写年份** —— 空白模板应该留白给老师手写。所以直接从「年」开始排:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\hspace*{93.517mm}\calfontC 年\hspace*{10.55pt}月\hspace*{10.55pt}日\par
|
|
||||||
```
|
```
|
||||||
|
|
||||||
三个字的实测锚点(10.45pt 宋体),本模板与原件逐字对齐:
|
## 注意
|
||||||
|
|
||||||
| 字 | 原件 x | 本模板 x | Δ |
|
示例内容是虚构的教学安排,使用时全部替换。
|
||||||
|---|---|---|---|
|
|
||||||
| 年 | 355.08 | 355.09 | +0.01 |
|
|
||||||
| 月 | 376.08 | 376.09 | +0.01 |
|
|
||||||
| 日 | 397.08 | 397.10 | +0.02 |
|
|
||||||
|
|
||||||
`\hspace*{93.517mm}` 的来历:目标 x = 355.09pt = 125.23mm,
|
|
||||||
`caloutside` 环境的 `\leftskip` 是 15.963mm,geometry 左边距 15.787mm,
|
|
||||||
两者叠加后排版起点在 31.75mm 处,故
|
|
||||||
`125.23 − 31.75 = 93.48mm`。取 93.48mm 实测落在 354.98(偏左 0.10pt),
|
|
||||||
加 0.037mm 微调到 **93.517mm**,实测 355.09(偏右 0.01pt)。
|
|
||||||
|
|
||||||
⚠️ 三字之间的空档是 **10.55pt**,不是 21pt。因为中文字形本身占 10.5pt,
|
|
||||||
「年」起点到「月」起点 = 字形宽 10.5 + 空档 10.55 ≈ 21.0pt。
|
|
||||||
|
|
||||||
#### ❌ 曾经踩的坑:用负 `\hspace` 塞年份占位符 → 三字重叠
|
|
||||||
|
|
||||||
第一版模板里有 `\calgrade`(`20××`)占位,写法是:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\hspace*{92.604mm}\calfontC \calgrade~年\hspace{-8.35mm}月\hspace{3.34mm}日
|
|
||||||
```
|
|
||||||
|
|
||||||
实测:「月」落在 376.08,但 `20×× 年` 一直延伸到 x=399.74,
|
|
||||||
「月」正好压在「年」上 —— **三个字叠成一个墨团**。
|
|
||||||
|
|
||||||
原因:**负 `\hspace` 只能压缩它后面盒子之间的间距,不能把已经排出去的
|
|
||||||
字符收回来**。减少间距减到负数 = 重叠,而不是"往回挪"。
|
|
||||||
|
|
||||||
最终解法不是修排版技巧,而是**去掉年份占位符** —— 那本来就不该有。
|
|
||||||
现在这一行只有三个中文字,不存在宽度变化,位置永远稳定。
|
|
||||||
|
|
||||||
### 6. `\calgrade` 已删除
|
|
||||||
|
|
||||||
曾经有过 `\newcommand{\calgrade}{20××}`,后因「签字栏不该印年份」而删除。
|
|
||||||
如果你需要**预填**年份(比如批量生成带年份的表),自己加回来:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\hspace*{81.52mm}{\calfontC\makebox[34.0pt][r]{2026}年}%
|
|
||||||
\hspace*{10.55pt}\calfontC 月\hspace*{10.55pt}日\par
|
|
||||||
```
|
|
||||||
|
|
||||||
要点:年份必须放进**定宽 `\makebox`**,让盒宽吸收内容长度变化,
|
|
||||||
否则换 `2026` 与 `20××` 时「月」「日」会跟着漂移。
|
|
||||||
|
|
||||||
实测该写法落到:年 354.95 / 月 375.96 / 日 396.97(目标 355.08 / 376.08 / 397.08)。
|
|
||||||
|
|
||||||
## 真实数据零泄漏
|
|
||||||
|
|
||||||
原 `.doc` 是一份**填过的实例**(真实课程名、开课号、教师姓名、人数、
|
|
||||||
年份、16 周真实日期与章节名)。本模板把这些字段**全部换掉**了:
|
|
||||||
换成一组同样完整、但纯属编造的课程数据(见开头那段),字段一个没留。
|
|
||||||
|
|
||||||
已逐类 grep 确认以下**类别**在 `oucal.sty` 与 `课程教学日历.tex` 中零命中:
|
|
||||||
原件课程名、原件开课号、原件教师姓名、原件年份、原件周次日期、
|
|
||||||
原件章节名、原件学部名、原件考核方式。
|
|
||||||
|
|
||||||
> ⚠️ 为什么是「换掉」而不是「打叉」:这张表**16 行格子、每行 3~4 个字段**,
|
|
||||||
> 全打叉的话整张表是灰的,既看不出周次排布,也判断不出某行内容多了会不会
|
|
||||||
> 撑高行高(本表的行高是写死的 `ht=` 最小高,内容超了会顶出去)。
|
|
||||||
> 填满一遍才发现「有的周章节名写两行,有的写一行」正是原件的真实形态。
|
|
||||||
|
|
||||||
**替换成你自己课程的内容时,注意不要把原件的真实信息再写回模板提交。**
|
|
||||||
`git diff` 里出现真实课程名 / 教师名就等于泄了。
|
|
||||||
|
|
||||||
## 字体
|
|
||||||
|
|
||||||
全部取自仓库根目录的 [`fonts/`](../fonts/),通过 [`fonts.tex`](../fonts.tex) 声明:
|
|
||||||
|
|
||||||
| 用途 | 字体 | 授权 |
|
|
||||||
|---|---|---|
|
|
||||||
| 正文宋体 | OUC Serif(思源宋体 SC 子集) | OFL 1.1 |
|
|
||||||
| 西文/数字 | TeX Gyre Termes(Times 度量兼容) | GUST Font License |
|
|
||||||
|
|
||||||
原件用的是「宋体 + Times New Roman」。换开源等价字体后**字宽逐字相同**,
|
|
||||||
所以列宽、折行数、行高都不受影响 —— 这一点已由上面的行高实测表验证。
|
|
||||||
Reference in New Issue
Block a user