新增《教材》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 章示例 | 只抽骨架 |
This commit is contained in:
2026-11-01 08:06:22 +08:00
parent c4e686de11
commit a4bfcac82a
9 changed files with 2198 additions and 1 deletions
+210
View File
@@ -0,0 +1,210 @@
# 教材
中国海洋大学 教材 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),不影响观感。
+1489
View File
File diff suppressed because it is too large Load Diff
+225
View File
@@ -0,0 +1,225 @@
%======================================================================
% ouctextbook.sty —— 中国海洋大学 教材 版式包
%
% 从《软件需求工程导论》(sre 仓库) 的版式抽取而来,
% 底层是 elegantbook 文档类,保留其全部排版特性。
%
% 编译: xelatex 教材.tex (单次即可;有参考文献时 xelatex→bibtex→xelatex×2)
%
% ------------------------------------------------------------------
% ⚠️⚠️ 本模板与其他模板最大的不同:它是**文档类**不是宏包
%
% elegantbook 是 \documentclass 级别的类,不能 \usepackage。
% 所以本文件只提供**配置命令**,正文首行必须自己写
% \documentclass[...]{elegantbook},再 \usepackage{ouctextbook}。
%
% 顺序不能反:\documentclass 必须第一行。
% ------------------------------------------------------------------
%======================================================================
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{ouctextbook}[2026/11/01 v1.0 OUC textbook style]
%======================================================================
% 一、公共字体(本模板的核心约束)
%
% ⚠️⚠️ 为什么必须在 \documentclass 里写 chinesefont=nofont
%
% elegantbook 的 chinesefont 只有三档,全都不通用:
%
% founder(默认) 方正四大字体 FZShuSong-Z01 / FZHei-B01 /
% FZKai-Z03 / FZFangSong-Z02
% ⇒ **商业字体,不能随仓库分发**,换机器就废
% ctexfont ctex 按**系统**字体配(Windows=SimSun/SimHei,
% macOS=PingFang,Linux 视装了什么而定)
% ⇒ 同一份源码在三个平台排出三种样子
% nofont 不设字体,完全交给用户
% ⇒ 不额外配置就直接报错
%
% ⇒ 本模板用 nofont,然后在正文 \input{../fonts.tex} 接入仓库字体。
%
% ⚠️⚠️ 但只写 nofont 还不够 —— elegantbook.cls 自身还硬编码了两处字体:
%
% \setmainfont{TeXGyreTermesX}[...] % 西文衬线
% \setsansfont{texgyreheros}[...] % 西文无衬线
%
% 这两款在精简版 TeX Live 和很多机器上**都没有**,会直接报
% ! Package fontspec Error: The font "texgyreheros-regular"
% cannot be found
% 而且是 9 个错误连发,因为在类的每个字体档位上都会失败。
%
% 实测:在 \documentclass 之后用 \setsansfont 覆盖**无效** ——
% 类加载时该字体族已经注册失败,后面的重新指定救不回来。
%
% ⇒ 唯一可靠的做法是**本地化 cls 本身**:模板目录里带一份
% elegantbook.cls 副本,把那两处改成仓库字体:
% \setmainfont{texgyretermes}[Path=../fonts/tex-gyre-termes/]
% \setsansfont{OUCSans}[Path=../fonts/ouc-sans/]
% 改动处有 "本地化" 注释,便于将来对比上游版本。
%
% ⇒ 这也是本模板与仓库其他模板的**唯一结构性差异**:
% 别的模板只需要 \input{../fonts.tex},
% 本模板还需要那份改过字体的 cls 副本。
%
% ⚠️ fonts.tex 已用 \def 定义 \songti / \heiti / \kaiti / \fangsong,
% elegantbook 内部依赖 \heiti(用于 \cbfseries、章节标题),
% 所以这层依赖是通的。若哪天 fonts.tex 改了这几个命令的名字,
% 本模板的章节标题会立刻失去中文字体。
%======================================================================
\RequirePackage{etoolbox}
% 检查是否已加载 elegantbook 且用了 nofont。
% 若用户忘了写 nofont,给出明确提示而不是让方正字体报一堆乱码错误。
\AtBeginDocument{%
\ifcsname ELEGANT@chinesefont\endcsname
\ifdefstring{\ELEGANT@chinesefont}{nofont}{}{%
\PackageWarning{ouctextbook}{%
检测到 chinesefont 不是 nofont。请把文档类选项改为
\string\documentclass[lang=cn,newtx,10pt,black,chinesefont=nofont]{elegantbook}%
\MessageBreak
否则会加载方正商业字体或系统字体,失去跨平台一致性}%
}%
\fi
}
%======================================================================
% 二、标题编号层级
%
% 原教材主文件里的自定义,很有用,保留:
% 编号最多到第 4 级 章(1) → 节(1.1) → 小节(1.1.1) → 小小节(1.1.1.1)
% 第 5 级(\paragraph)不再进编号体系,改用「(1)(2)(3)」形式,
% 避免出现 3.1.1.1.1 这种过长编号。
%
% ⚠️ 这段必须在 \begin{document} 之前执行,用 \AtBeginDocument 会太晚
% (编号层级在导言区就被读取)。
%======================================================================
\setcounter{secnumdepth}{3}
\setcounter{tocdepth}{3}
\makeatletter
\newcounter{paranum}[subsubsection] % 随小小节自动重置
\renewcommand\paragraph[1]{%
\par\addvspace{0.9ex}%
\stepcounter{paranum}%
\noindent{\bfseries (\arabic{paranum})\,#1}%
\par\nobreak\addvspace{0.1ex}%
\@afterindentfalse\@afterheading}
\makeatother
%======================================================================
% 三、封面色带
%
% 原教材用青绿色 RGB(32,178,170),比 elegantbook 默认的蓝色沉稳,
% 与清华社的封面观感接近。保留。
%
% ⚠️⚠️ 必须在 \begin{document} 之后才能改 coverlinecolor
%
% elegantbook.cls 第 345 行有
% \colorlet{coverlinecolor}{second}
% 这行在**类加载末尾**执行,把 coverlinecolor 绑到 "second" 色上
% (color=black 选项下 second 就是黑色)。
%
% ⇒ 在导言区写 \colorlet{coverlinecolor}{...} 会被它覆盖,
% 实测封面色带仍是纯黑,改了半天没反应。
% 必须用 \AtBeginDocument 排到它后面。
%======================================================================
\definecolor{ouccoverlinecolor}{RGB}{32,178,170}
\AtBeginDocument{%
\colorlet{coverlinecolor}{ouccoverlinecolor}%
}
% 需要临时换别的色时,在正文里调这个(不调则用上面的青绿)
\newcommand{\oucSetCoverColor}[1]{%
\colorlet{coverlinecolor}{#1}%
}
%======================================================================
% 四、图形与表格
%
% 原教材用到的宏包,逐个说明为什么需要:
% array \makecell(表格内换行)
% cprotect \verb 等脆弱命令进表格/标题
% graphicx 插图
% float [H] 强制定位(教材排版要求图跟文字,不能漂走)
% longtable 跨页表格
%======================================================================
\RequirePackage{array}
\RequirePackage{cprotect}
\RequirePackage{graphicx}
\RequirePackage{float}
\RequirePackage{longtable}
% TikZ 绘图库(原教材的流程图/关系图用这些)
\RequirePackage{tikz}
\usetikzlibrary{
shapes.geometric, shapes.misc,
arrows.meta, arrows,
decorations.pathreplacing, decorations.markings,
positioning, calc, fit, backgrounds
}
%======================================================================
% 五、断行宽容度
%
% ⚠️ 教材正文长、中文多、行内夹英文术语和公式,默认 \tolerance
% 会产生大量 Overfull(原教材明确加过这一条)。
% 2em 是原教材实测的值,既消掉大部分告警,又不会排出稀疏的行。
%======================================================================
\setlength{\emergencystretch}{2em}
%======================================================================
% 六、常用排版命令
%======================================================================
% 表格里的色块占位(原教材 \ccr 的用途:图例色块)
\newcommand{\ouccolorcell}[1]{%
\makecell{{\color{#1}\rule{1cm}{1cm}}}}
%======================================================================
% 七、章节末的标准小节
%
% 原教材每章固定以「本章小结」+「习题」收尾。
% 做成命令,避免各章写法不一致。
%======================================================================
\newcommand{\oucsummary}{\section{本章小结}}
\newcommand{\oucexercises}{\section{习题}}
%======================================================================
% 八、封面:无封面图时不插 example-image
%
% ⚠️⚠️ elegantbook 在没写 \cover{} 时会插入 mwe 宏包的 example-image,
% 也就是**一张印着 "Image" 字样的灰底占位图**,铺满首页。
% 源码(cls 第 1288~1300 行):
% \ifcsname @cover\endcsname
% \includegraphics[width=\linewidth]{\@cover}
% \else
% \includegraphics[width=\linewidth]{example-image} ← 就是这个
% \fi
% 交付给别人的模板首页顶着 "Image" 两个大字,不合适。
%
% ⇒ 解法在 cls 里,不在本文件:本地化版本的 elegantbook.cls 已把
% 那两处 example-image 换成了 \ouc@coverblank(一个占位盒子)。
% 这样不写 \cover{} 时封面只有色带和文字,没有占位图。
%
% ⚠️⚠️ 占位盒的宽度**不能是 0**。
%
% 第一版写成 \rule{0pt}{0pt}(0 宽),立刻冒出
% Overfull \hbox (5.00002pt too wide) in paragraph at lines 44--44
% 而且它只出现在 \maketitle 那一行,改 \hspace{2em}、\hspace{2.5em}、
% minipage 的 0.67/0.27\linewidth、tabular 的列间距,**全部无效**,
% 溢出量死钉在 5.00002pt 不动。
%
% 根因:0 宽空盒让 \linewidth 在 titlepage 里的计算与 \textwidth
% 差了 5pt,后续并排的 \parbox{0.8\textwidth} + 两个 minipage
% 就整体超宽。
%
% ✅ 正解:给占位盒一个满宽
% \newcommand{\ouc@coverblank}{%
% \rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
% 实测 0 Overfull。
%
% ⚠️ 不要试图在本文件里用 \ifcsname 覆盖 \@cover 来绕开 —— 实测
% \@cover 即使定义成空串也会走 \includegraphics{} 分支报错。
% 改 cls 是唯一干净的办法。
%======================================================================
\endinput
+24
View File
@@ -0,0 +1,24 @@
% 教材模板示例参考文献
% ⚠️ 这两条是**虚构条目**,只用于展示 biblatex 的排版格式。
% 实际使用时整份文件替换为真实文献库。
@book{example2020,
author = {作者甲 and 作者乙},
title = {软件工程导论},
publisher = {示例出版社},
address = {北京},
year = {2020},
edition = {第 3 版},
language = {chinese},
}
@article{example2021,
author = {Author, Alpha and Author, Beta},
title = {A Sample Article for Bibliography Formatting},
journal = {Journal of Examples},
volume = {12},
number = {3},
pages = {45--67},
year = {2021},
doi = {10.0000/example.2021.001},
}
BIN
View File
Binary file not shown.
+225
View File
@@ -0,0 +1,225 @@
%======================================================================
% 中国海洋大学 教材 模板(示例)
%
% 从《软件需求工程导论》(sre 仓库) 的版式抽取而来。
% 正文内容为占位示例,只用来展示版式,不含原书内容。
%
% 编译: xelatex 教材.tex
% 有参考文献时:xelatex → bibtex → xelatex → xelatex
%
% ------------------------------------------------------------------
% ⚠️⚠️ 前两行不能动、不能换序
%
% 第 1 行 \documentclass 必须含 chinesefont=nofont
% 第 2 行 \input{../fonts.tex} 接入仓库公共字体
%
% 写错任一处都会退回商业字体或系统字体,详见 ouctextbook.sty 第一节。
% ------------------------------------------------------------------
%======================================================================
\documentclass[lang=cn,newtx,10pt,black,chinesefont=nofont]{elegantbook}
\input{../fonts.tex}
\usepackage{ouctextbook}
% ---- 书名信息 ----
\title{教材模板示例}
\subtitle{副标题写在这里}
\author{作者甲 \quad 作者乙 \quad 作者丙}
\institute{中国海洋大学}
\date{2026/11/1}
\version{第一版}
\extrainfo{出版社}
% ---- 封面图 ----
% ⚠️ 不写 \cover{} 就不出封面图,只出纯色带封面,不会报错。
% 要加封面就把图片放进本目录,写 \cover{cover.jpg}。
% 示例不放图,保持模板轻量。
% \cover{cover.jpg}
% ---- 参考文献库(必须在 \begin{document} 之前)----
\addbibresource[location=local]{reference.bib}
\begin{document}
% ---- 标题页(elegantbook 自动生成,含书名/作者/机构/版本/日期)----
\maketitle
% ---- 前置部分:页码用罗马数字 ----
\frontmatter
\tableofcontents
%======================================================================
% 前言
%
% ⚠️ 前言用 \chapter*(不进编号、不进目录),
% 与正文章节的 \chapter 区分。原教材如此。
%======================================================================
\chapter*{前言}
\markboth{前言}{前言}
这里写前言。教材前言通常包括:本书的写作背景与目的、读者对象、
全书结构安排、各章内容简介、使用建议(可作为哪些课程的教材、
需要哪些先修知识)、致谢、以及勘误联系方式。
\vspace{1.5em}
\hfill 编\quad 者\\
\hfill 2026 年 11 月
% ---- 正文部分:页码用阿拉伯数字,章从 1 开始 ----
\mainmatter
%======================================================================
% 正文示例章
%
% ⚠️ 章的标准结构(原教材 13 章全部如此):
% \chapter{标题}
% → 导语(3~5 段,概述本章要点与结构)
% → \section 正文各节
% → \section{本章小结}
% → \section{习题}
%======================================================================
\chapter{章节标题示例}
本章导语。教材每章开篇先有一段到几段导语,说明本章要解决什么问题、
分几部分展开、与其他章的关系。这段文字通常在 3~5 段、200~400 字之间,
让读者在进入细节前建立整体框架。
导语的第二段继续交代本章的组织逻辑。例如「首先……接着……随后……
最后……」这样的行文,既是给读者的路线图,也是作者自查结构是否清晰的
工具。
\section{节标题}
正文段落。教材正文 10pt,行距由 elegantbook 设定为 1.2 倍。
行内可以用 \textbf{黑体强调}、\emph{楷体强调},以及英文术语
Requirements Engineering 和缩写 SRE。
\subsection{小节标题}
更细一层的展开。
\subsubsection{小小节标题}
最细一层。注意编号最多到这里(1.1.1.1)。
\paragraph{第五级标题}
这一级不再进编号,改用「(1)(2)(3)」形式,避免编号过长。
新的一段从段首开始。
\paragraph{再一个第五级标题}
编号自动递增为(2)。
\section{列表与表格示例}
无序列表:
\begin{itemize}
\item \textbf{项目软件。}由甲方委托开发,需求主要来自甲方。
\item \textbf{产品软件。}面向普通用户,需求来自产品经理。
\end{itemize}
有序列表:
\begin{enumerate}
\item \textbf{系统化方法:}使用可重复的过程与标准工具。
\item \textbf{工程原则:}模块化、抽象、分而治之。
\item \textbf{质量保证:}通过测试、审查与验证确保质量。
\end{enumerate}
表格示例(教材表格通常用三线表,见 \texttt{booktabs};
这里演示最简的带框表格,与原教材一致):
\begin{table}[htbp]
\centering
\caption{表格标题示例}
\label{tab:example}
\begin{tabular}{|l|l|}
\hline
\textbf{列标题一} & \textbf{列标题二} \\ \hline
内容 A & 15.9\% \\ \hline
内容 B & 13.9\% \\ \hline
\end{tabular}
\end{table}
见表~\ref{tab:example} 可见表题在表上方。
\section{插图示例}
\begin{figure}[H]
\centering
% 有图时:\includegraphics[width=0.8\textwidth]{image/xxx.png}
\fbox{\parbox[c][3cm][c]{0.6\textwidth}{\centering 图占位}}
\caption{图标题示例}
\label{fig:example}
\end{figure}
见图~\ref{fig:example}。图题在图下方,与表题相反,这是通行惯例。
\section{TikZ 绘图示例}
教材里的关系图、流程图多用 TikZ 直接画,好处是矢量、可改、不用外部图片:
\begin{figure}[H]
\centering
\begin{tikzpicture}[
box/.style={draw, rounded corners, align=center,
fill=blue!6, minimum width=3.2cm, minimum height=1.0cm},
font=\small]
\node[box] (a) at (0,1.6) {甲方\\(提目标)};
\node[box] (b) at (0,-1.6) {用户\\(提需求)};
\node[box] (c) at (5,0) {开发团队};
\draw[->, thick] (a) -- node[right]{业务需求} (c);
\draw[->, thick] (b) -- node[above]{用户需求} (c);
\end{tikzpicture}
\caption{TikZ 绘图示例}
\end{figure}
% ---- 章节收尾(原教材每章固定这两节)----
\oucsummary
本章小结正文。原教材的小结通常是 1~2 段密集回顾,把本章的核心结论、
关键数据、与其他章的衔接一次交代清楚,不重复正文细节。
\oucexercises
\begin{enumerate}
\item 习题一示例。
\item 习题二示例。
\end{enumerate}
%======================================================================
% 附录
%
% ⚠️ \appendix 之后章号自动变 A、B、C……
% elegantbook 默认已是字母编号,但为保险显式重设一次
% (原教材主文件也这么写)。
%======================================================================
\appendix
\renewcommand{\thechapter}{\Alph{chapter}}
\chapter{附录标题示例}
附录正文。常见附录内容:术语表、缩略语表、工具清单、
实验数据、参考规范全文等。
\chapter{另一个附录}
附录二正文。
%======================================================================
% 参考文献
%
% ⚠️ 用 biblatex(elegantbook 已配好 biblatex + biber/bibtex 后端)
% \addbibresource 在导言区、\printbibliography 在正文末尾。
%
% 本示例的 reference.bib 只有 2 条假条目,仅供演示格式。
% 实际使用时替换为真实文献。
%
% ⚠️ \nocite{*} 表示"引用文献库里全部条目",模板演示用。
% 正式写作应删掉它,只列实际引用的文献。
%======================================================================
\nocite{*}
\printbibliography[heading=bibintoc, title=\ebibname]
\end{document}