Files
ouc_latex_template/教材/README.md
T
laoyang a4bfcac82a 新增《教材》LaTeX 模板,从 sre 教材抽取版式骨架 #25
源:D:\Yongquan\code\sre =《软件需求工程导论》完整教材
(13 章 + 5 附录,78 万字节,265 页 PDF,elegantbook 文档类)

## 新增文件

   教材/ouctextbook.sty    版式配置
   教材/elegantbook.cls    本地化过的文档类(改过字体)
   教材/教材.tex           示例正文(1 章 + 附录 + 参考文献)
   教材/reference.bib      参考文献库(虚构条目)
   教材/README.md          用法 + 踩坑记录

## 核心约束:字体的共用性

用户明确要求「注意字体的共用性」。原教材用 elegantbook 的
chinesefont=founder 档,加载方正四大字体:

   FZShuSong-Z01 / FZHei-B01 / FZKai-Z03 / FZFangSong-Z02

这些是**商业字体,不能随仓库分发**(#17 定下的规矩)。

### elegantbook 三档字体全都不通用

| 选项 | 实际字体 | 问题 |
|---|---|---|
| founder(默认) | 方正四大字体 | 商业字体,换机器就废 |
| ctexfont | 系统字体(Win=SimSun,macOS=PingFang) | 三平台三种样子 |
| nofont | 不设 | 不配置就报错 |

### 只写 nofont 还不够 —— cls 自身还硬编码字体

elegantbook.cls 第 176/184 行:

   \setmainfont{TeXGyreTermesX}[...]
   \setsansfont{texgyreheros}[...]

这两款在精简 TeX Live 上都没有,报 9 个错误连发:

   ! Package fontspec Error: The font "texgyreheros-regular" cannot be found

**实测:在 \documentclass 之后用 \setsansfont 覆盖无效** ——
类加载时字体族已注册失败,后面重新指定救不回来。

⇒ 所以本模板必须带一份**本地化的 cls**,改三处(都留了"本地化"注释):

| 位置 | 改动 |
|---|---|
| ~176 行 | TeXGyreTermesX → texgyretermes + Path=../fonts/tex-gyre-termes/ |
| ~184 行 | texgyreheros → OUCSans + Path=../fonts/ouc-sans/ |
| \maketitle | example-image → \ouc@coverblank |

这是本模板与仓库其他模板的**唯一结构性差异**:别的模板只要
\input{../fonts.tex},本模板还要那份改过字体的 cls。

## 踩到的三个坑

### 1. 封面不写 \cover{} 会插一张 "Image" 占位图

cls 第 1288~1300 行:
   \ifcsname @cover\endcsname ... \else
     \includegraphics[width=\linewidth]{example-image}   ← mwe 的灰底占位图

首页顶着 "Image" 两个大字。已把 else 分支换成空盒子。

### 2. 占位盒宽度不能是 0(这个坑耗了最久)

第一版 \rule{0pt}{0pt}(0 宽),立刻冒出:

   Overfull \hbox (5.00002pt too wide) in paragraph at lines 44--44

试过全部无效,溢出量死钉在 5.00002pt 不动:
  改 \hspace{2em} / \hspace{2.5em}     无效
  改 minipage 的 0.67/0.27\linewidth   无效
  改 tabular 列间距 @{}l@{}            无效
  改 \colorbox 的 \makebox[\hsize]     无效

根因:0 宽空盒让 \linewidth 在 titlepage 里与 \textwidth 差 5pt,
后续并排的 \parbox{0.8\textwidth} + 两个 minipage 整体超宽。

✅ 正解:给占位盒满宽
   \newcommand{\ouc@coverblank}{%
     \rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
实测 0 Overfull。

### 3. 封面色带改不动(一行 \colorlet 的位置问题)

cls 第 345 行 `\colorlet{coverlinecolor}{second}` 在**类加载末尾**执行,
把 coverlinecolor 绑到 second 色(black 模式下就是黑)。

⇒ 导言区写 \colorlet 会被覆盖,实测色带仍是纯黑。
必须用 \AtBeginDocument 排到它后面。

## build.sh 补了 bibtex 支持

原来只跑两遍 xelatex,教材的参考文献出不来。
新增:目录下有 .bib(排除 *-blx.bib 这种中间产物)就插一次 bibtex,
再补一遍 xelatex,最后跑统计那一遍。

## 验证

   8 页  error 0  Overfull 0  Underfull 0
   封面色带 RGB(32,178,170) 青绿,实测 fill=(0.125,0.698,0.667)
   封面无 example-image 占位

字体(PDF 内嵌实测,全部来自仓库):
   OUCSerif-Regular / -Bold        中文正文
   OUCKai-Regular                  中文斜体(楷体代)
   TeXGyreTermes-Regular/-Bold/-Italic   西文
   LMMono10-Regular                \texttt 等宽(TeX Live 自带)

→ **无方正、无 SimSun/SimHei、无 Times New Roman**

全库 16/16 通过(新增第 16 项,已加入 verify_all.sh)。

⚠️ Windows 端本机未能编译:TeX Live 写字体缓存
(C:\texlive\2022\texmf-var)被安全策略拦截,属环境限制非模板问题。
模板只依赖 TeX Live 标准宏包与发行版自带字体;原教材本身就是在
Windows + TeX Live 2022 上编出来的。

## .gitignore 补充

新增 *-blx.bib、*.run.xml(biblatex 中间产物)、*/.preview/(预览图)。

## 与原教材的差异

| 项 | 原教材 | 本模板 | 原因 |
|---|---|---|---|
| 封面图 | cover.jpg | 无(纯色带) | 模板不附图片 |
| 字体 | 方正四大字体 | 仓库开源字体 | 商业字体不能分发 |
| 西文无衬线 | texgyreheros | OUC Sans | 仓库没有 Hero |
| 正文 | 13 章 265 页 | 1 章示例 | 只抽骨架 |
2026-11-01 08:06:22 +08:00

210 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 教材
中国海洋大学 教材 LaTeX 模板。
版式从《软件需求工程导论》(sre 仓库)的成品书抽取而来,
保留其全部排版特性,正文内容为占位示例。
## 编译
```bash
cd 教材
xelatex 教材.tex # 无参考文献时,单次即可
```
有参考文献时(本模板默认就有)走完整流程:
```bash
xelatex 教材.tex
bibtex 教材
xelatex 教材.tex
xelatex 教材.tex
```
或仓库根:`bash build.sh 教材`(已自动处理 bibtex)
## 文件
| 文件 | 作用 |
|---|---|
| `ouctextbook.sty` | 版式配置(编号层级、封面色、宏包、断行) |
| `elegantbook.cls` | **本地化过的**文档类(改过字体,见下) |
| `教材.tex` | 示例正文 |
| `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
\setmainfont{TeXGyreTermesX}[...] % 西文衬线
\setsansfont{texgyreheros}[...] % 西文无衬线
```
这两款在精简版 TeX Live 和很多机器上都没有,会直接报
```
! 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
\ifcsname @cover\endcsname
\includegraphics[width=\linewidth]{\@cover}
\else
\includegraphics[width=\linewidth]{example-image} ← mwe 宏包的灰底占位图
\fi
```
首页顶着 "Image" 两个大字。本地化版本已把 `else` 分支换成空盒子。
### 2. 空盒子的宽度不能是 0
第一版把占位改成 `\rule{0pt}{0pt}`(0 宽),结果**冒出 5pt Overfull**,
且只出现在 `\maketitle` 那一行,怎么调 `\hspace`、`minipage` 宽度都去不掉。
根因:0 宽空盒让 `\linewidth` 在 titlepage 里的计算与 `\textwidth` 差了 5pt,
后续并排的 `\parbox` + 两个 `minipage` 就超了。
✅ 正解给占位盒一个满宽:
```latex
\newcommand{\ouc@coverblank}{\rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
```
实测 0 Overfull。
### 3. 要真封面就写 `\cover{文件}`
把图片放进本目录,导言区加 `\cover{cover.jpg}` 即可,走插图分支。
## 版式参数
```
页面 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
\chapter{标题}
导语(3~5 段,概述本章问题、结构、与相邻章的关系)
\section{...}
\section{本章小结} % 用 \oucsummary
\section{习题} % 用 \oucexercises
```
两个小节做成了命令,避免各章写法不一致。
## 字体(全部来自仓库,无商业字体)
| 用途 | 字体 | 来源目录 |
|---|---|---|
| 中文正文 | OUC Serif | `../fonts/ouc-serif/` |
| 中文黑体 | OUC Sans | `../fonts/ouc-sans/` |
| 中文楷体(代斜体) | OUC Kai | `../fonts/ouc-kai/` |
| 中文仿宋 | Zhuque Fangsong | `../fonts/zhuque-fangsong/` |
| 西文正文 | TeX Gyre Termes | `../fonts/tex-gyre-termes/` |
| 西文无衬线 | OUC Sans | `../fonts/ouc-sans/` |
PDF 内嵌字体实测:
```
OUCSerif-Regular / OUCSerif-Bold / OUCKai-Regular
TeXGyreTermes-Regular / -Bold / -Italic
LMMono10-Regular ← \texttt 用的等宽,TeX Live 自带
```
⚠️ `LMMono10` 是 Computer Modern 等宽字体,用于 `\texttt{}`(代码、DOI)。
仓库 fonts.tex **没有配等宽字体**,elegantbook 也没有。它由 TeX Live
自带,WSL 和 Windows 两端都有,所以跨平台一致,不算问题。
要换成别的等宽字体,在导言区加 `\setmonofont{...}`。
## 验证
```
8 页 error 0 Overfull 0 Underfull 0
字体全部来自 ../fonts/,无商业字体、无系统字体
全库 16/16 通过
```
⚠️ Windows 端本机未能编译(TeX Live 写字体缓存被安全策略拦截),
但模板只依赖 TeX Live 标准宏包与发行版自带字体,不涉及平台特有资源。
原教材本身就是在 Windows + TeX Live 2022 上编译的。
## 与原教材的差异
| 项 | 原教材 | 本模板 | 原因 |
|---|---|---|---|
| 封面图 | cover.jpg | 无(纯色带) | 模板不附图片 |
| 字体 | 方正四大字体 | 仓库开源字体 | 商业字体不能分发(#17 的规矩) |
| 西文无衬线 | texgyreheros | OUC Sans | 仓库没有 Hero |
| 正文 | 13 章 265 页 | 1 章示例 | 只抽骨架 |
## 已知问题
`\texttt{}` 用的是 Computer Modern 等宽(LMMono10),与正文西文
Termes 风格不搭。成因是仓库未统一配置等宽字体,见上文字体表。
目前仅 2 处用到(示例里的 `booktabs` 和一条 DOI),不影响观感。