新增《教材》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:
@@ -16,6 +16,15 @@
|
||||
*.snm
|
||||
*.vrb
|
||||
|
||||
# biblatex 的中间产物(教材/ 会生成)
|
||||
# *-blx.bib biblatex 自动写的"引用收集"文件,每次编译重写,不是输入
|
||||
# *.run.xml biblatex 运行时状态
|
||||
*-blx.bib
|
||||
*.run.xml
|
||||
|
||||
# 各模板的预览图(截图导出,不入库)
|
||||
*/.preview/
|
||||
|
||||
# 简历成果统计的自动生成文件(每次编译重写,不要提交)
|
||||
# 见 简历/awesome-source-cv.cls 的「成果统计」一节
|
||||
*.cvnum
|
||||
|
||||
@@ -56,7 +56,21 @@ build_one() {
|
||||
# 第一遍:产出 .aux/.toc,允许非致命错误(TOC 还没生成时会警告)
|
||||
( cd "$ROOT/$dir" && $TEXBIN -interaction=nonstopmode "$name.tex" ) > "$log1" 2>&1
|
||||
local rc1=$?
|
||||
# 第二遍:交叉引用稳定后的最终结果,统计以这一遍为准
|
||||
|
||||
# 有参考文献库时插入 bibtex(教材/ 等模板需要)。
|
||||
# ⚠️ 判定依据是目录下存在 **任意 .bib** 且不是 biblatex 自动生成的
|
||||
# "*-blx.bib"(那是 biblatex 的中间产物,不能当输入跑 bibtex)。
|
||||
# biblatex 的 bcf 后端用 biber,但本库统一用 bibtex 后端(elegantbook
|
||||
# 的默认),且仓库里的模板都用 bibtex,故这里只调 bibtex。
|
||||
# bibtex 失败不中断构建 —— 下一遍 xelatex 会用旧的 .bbl,
|
||||
# 参考文献可能不全,但正文和版式照常验证。
|
||||
if ( cd "$ROOT/$dir" && ls *.bib 2>/dev/null | grep -qv -- '-blx\.bib$' ); then
|
||||
( cd "$ROOT/$dir" && bibtex "$name" ) > "/tmp/oucbibtex.$$.log" 2>&1 || true
|
||||
# bibtex 之后必须再跑一遍让引用编号落位
|
||||
( cd "$ROOT/$dir" && $TEXBIN -interaction=nonstopmode "$name.tex" ) > "$log1" 2>&1
|
||||
fi
|
||||
|
||||
# 最后一编:交叉引用稳定后的最终结果,统计以这一遍为准
|
||||
( cd "$ROOT/$dir" && $TEXBIN -interaction=nonstopmode "$name.tex" ) > "$log" 2>&1
|
||||
local rc2=$?
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ TARGETS=(
|
||||
"课程教学日历|课程教学日历.tex"
|
||||
"课程大纲|课程大纲.tex"
|
||||
"会议预算表|会议预算表.tex"
|
||||
"教材|教材.tex"
|
||||
)
|
||||
|
||||
filter="${1:-}"
|
||||
|
||||
+210
@@ -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),不影响观感。
|
||||
Executable
+1489
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
@@ -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},
|
||||
}
|
||||
@@ -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}
|
||||
Reference in New Issue
Block a user