教材模板:从 sre 教材抽取版式骨架 #25

Closed
opened 2026-10-31 23:57:35 +00:00 by laoyang · 1 comment
Owner

新增《教材》LaTeX 模板(从 sre 教材抽取版式骨架)

用户诉求

原话:「D:\Yongquan\code\sre,这里面是一本教材,抽取出来,形成一个模板,
就叫教材吧。注意字体的共用性。」

关键约束:字体的共用性 —— 模板不能依赖商业字体,必须与其他模板共用
仓库的 fonts.tex。

源文件

D:\Yongquan\code\sre = 《软件需求工程导论》完整教材
(13 章 + 5 附录,正文约 78 万字节,已编译出 2.2MB PDF)

  • 文档类:elegantbook(51851 字节,随仓库自带)
  • 主文件:Introduction_to_Software_Requirements_Engineering.tex
    \documentclass[lang=cn,newtx,10pt,black]{elegantbook}
    \title{软件需求工程导论}
    \author{杨永全 \quad 温琦 \quad 洪博为}
    \institute{中国海洋大学}
    \extrainfo{清华大学出版社}
    \cover{cover.jpg}
    \setcounter{secnumdepth}{3}
    
  • 参考文献:reference.bib(41KB)+ biblatex
  • 图像:image/、case-library/

核心问题:字体不通用

elegantbook 的 chinesefont 选项只有三种,全都不可跨机器用:

选项 实际字体 问题
founder(默认) FZShuSong-Z01 / FZHei-B01 / FZKai-Z03 / FZFangSong-Z02 方正商业字体,不能分发
ctexfont 系统字体(Windows 是 SimSun/SimHei) 换机器就变,Linux/macOS 没有
nofont 不设,靠用户自己配 不配置就报错

elegantbook.cls 第 196~206 行的方正分支:

\setCJKmainfont[BoldFont={FZHei-B01},ItalicFont={FZKai-Z03}]{FZShuSong-Z01}
\setCJKsansfont[BoldFont={FZHei-B01}]{FZKai-Z03}
\setCJKmonofont[BoldFont={FZHei-B01}]{FZFangSong-Z02}

解决方案

用 chinesefont=nofont 选项,再 \input{../fonts.tex} 接入仓库公共字体。

⚠️ 但 nofont 分支里 elegantbook 会执行 \xeCJKsetup{AutoFakeBold=true},
而 fonts.tex 已提供真粗体,这个自动描边必须关掉,否则粗体糊。

要抽取的版式要素

1. 文档类骨架

  • elegantbook + 自定义选项
  • 封面、标题页、版权页、前言、目录、正文、附录、参考文献的顺序
  • \frontmatter / \mainmatter / \appendix 的分节

2. 标题层级(主文件自定义)

\setcounter{secnumdepth}{3}   % 编号最多到 1.1.1.1
% 第 5 级段落改用「(1)(2)(3)」形式,避免 3.1.1.1.1
\newcounter{paranum}[subsubsection]
\renewcommand\paragraph[1]{...(\arabic{paranum})#1...}

⚠️ 这段逻辑很实用,必须保留。

3. 封面色彩

\definecolor{customcolor}{RGB}{32,178,170}   % 青绿色
\colorlet{coverlinecolor}{customcolor}

4. 章节结构模式

每章:\chapter{标题} → 导语(3~5 段,概述本章内容)
→ \section 正文 → \section{本章小结} → \section{习题}

5. 必需宏包

\usepackage{array}      % \makecell
\usepackage{cprotect}
\usepackage{graphicx}
\usepackage{float}      % [H]
\usepackage{longtable}
\usetikzlibrary{shapes.geometric,shapes.misc,arrows.meta,arrows,
  decorations.pathreplacing,decorations.markings,positioning,calc,fit,backgrounds}
\setlength{\emergencystretch}{2em}   % 消 Overfull

6. 参考文献

biblatex + \addbibresource[location=local]{reference.bib}
\printbibliography[heading=bibintoc, title=\ebibname]

实现方案

目录 教材/:

  • ouctextbook.sty —— 版式包(封装 elegantbook 配置 + 公共字体接入)
  • 教材.tex —— 示例(1 章骨架 + 附录 + 参考文献,正文为占位内容)
  • README.md —— 用法 + 字体说明

字体接入方式(关键)

\documentclass[lang=cn,newtx,10pt,black,chinesefont=nofont]{elegantbook}
\input{../fonts.tex}     % ← 必须在 documentclass 之后、begin{document} 之前
\xeCJKsetup{AutoFakeBold=false}   % 关掉 elegantbook 的自动描边

⚠️ 要实测 \input{../fonts.tex} 与 elegantbook 的加载顺序是否冲突。
fonts.tex 里有 \RequirePackage{fontspec} 和 \RequirePackage{xeCJK},
elegantbook 也加载了这两个,需要确认不重复报错(fontspec/xeCJK 本身
可重复加载,但要验证)。

不抽取的内容

  • 13 章正文(78 万字节)—— 只要骨架
  • case-library/、image/、cover.jpg —— 示例图用占位
  • reference.bib —— 示例给 2~3 条假条目

验收标准

  1. xelatex 编译通过,error 0
  2. 不依赖任何商业字体和系统字体(用 fc-list 或日志确认实际加载的是
    ../fonts/ouc-serif/ 等目录下的字体)
  3. 双端一致(WSL TeX Live 2025 / Windows TeX Live 2022)
  4. 加入 verify_all.sh TARGETS,全库 15 → 16 项
  5. 版式与原教材一致:封面色带、标题层级、页眉页脚、章节样式
  6. 字号 10pt(原文件如此,比仓库其他模板的 12pt 小)
  7. 页面 A4,边距与原教材一致

不做

  • 不搬原书内容
  • 不改原 sre 仓库
  • 不引入方正/微软字体
新增《教材》LaTeX 模板(从 sre 教材抽取版式骨架) ## 用户诉求 原话:「D:\Yongquan\code\sre,这里面是一本教材,抽取出来,形成一个模板, 就叫教材吧。注意字体的共用性。」 关键约束:**字体的共用性** —— 模板不能依赖商业字体,必须与其他模板共用 仓库的 fonts.tex。 ## 源文件 `D:\Yongquan\code\sre` = 《软件需求工程导论》完整教材 (13 章 + 5 附录,正文约 78 万字节,已编译出 2.2MB PDF) - 文档类:`elegantbook`(51851 字节,随仓库自带) - 主文件:`Introduction_to_Software_Requirements_Engineering.tex` ```latex \documentclass[lang=cn,newtx,10pt,black]{elegantbook} \title{软件需求工程导论} \author{杨永全 \quad 温琦 \quad 洪博为} \institute{中国海洋大学} \extrainfo{清华大学出版社} \cover{cover.jpg} \setcounter{secnumdepth}{3} ``` - 参考文献:`reference.bib`(41KB)+ biblatex - 图像:`image/`、`case-library/` ## 核心问题:字体不通用 elegantbook 的 `chinesefont` 选项只有三种,**全都不可跨机器用**: | 选项 | 实际字体 | 问题 | |---|---|---| | `founder`(默认) | FZShuSong-Z01 / FZHei-B01 / FZKai-Z03 / FZFangSong-Z02 | **方正商业字体**,不能分发 | | `ctexfont` | 系统字体(Windows 是 SimSun/SimHei) | 换机器就变,Linux/macOS 没有 | | `nofont` | 不设,靠用户自己配 | 不配置就报错 | elegantbook.cls 第 196~206 行的方正分支: ```latex \setCJKmainfont[BoldFont={FZHei-B01},ItalicFont={FZKai-Z03}]{FZShuSong-Z01} \setCJKsansfont[BoldFont={FZHei-B01}]{FZKai-Z03} \setCJKmonofont[BoldFont={FZHei-B01}]{FZFangSong-Z02} ``` ### 解决方案 用 `chinesefont=nofont` 选项,再 `\input{../fonts.tex}` 接入仓库公共字体。 ⚠️ 但 `nofont` 分支里 elegantbook 会执行 `\xeCJKsetup{AutoFakeBold=true}`, 而 fonts.tex 已提供真粗体,这个自动描边必须关掉,否则粗体糊。 ## 要抽取的版式要素 ### 1. 文档类骨架 - elegantbook + 自定义选项 - 封面、标题页、版权页、前言、目录、正文、附录、参考文献的顺序 - `\frontmatter` / `\mainmatter` / `\appendix` 的分节 ### 2. 标题层级(主文件自定义) ```latex \setcounter{secnumdepth}{3} % 编号最多到 1.1.1.1 % 第 5 级段落改用「(1)(2)(3)」形式,避免 3.1.1.1.1 \newcounter{paranum}[subsubsection] \renewcommand\paragraph[1]{...(\arabic{paranum})#1...} ``` ⚠️ 这段逻辑很实用,必须保留。 ### 3. 封面色彩 ```latex \definecolor{customcolor}{RGB}{32,178,170} % 青绿色 \colorlet{coverlinecolor}{customcolor} ``` ### 4. 章节结构模式 每章:`\chapter{标题}` → 导语(3~5 段,概述本章内容) → `\section` 正文 → `\section{本章小结}` → `\section{习题}` ### 5. 必需宏包 ```latex \usepackage{array} % \makecell \usepackage{cprotect} \usepackage{graphicx} \usepackage{float} % [H] \usepackage{longtable} \usetikzlibrary{shapes.geometric,shapes.misc,arrows.meta,arrows, decorations.pathreplacing,decorations.markings,positioning,calc,fit,backgrounds} \setlength{\emergencystretch}{2em} % 消 Overfull ``` ### 6. 参考文献 biblatex + `\addbibresource[location=local]{reference.bib}` `\printbibliography[heading=bibintoc, title=\ebibname]` ## 实现方案 目录 `教材/`: - `ouctextbook.sty` —— 版式包(封装 elegantbook 配置 + 公共字体接入) - `教材.tex` —— 示例(1 章骨架 + 附录 + 参考文献,正文为占位内容) - `README.md` —— 用法 + 字体说明 ### 字体接入方式(关键) ```latex \documentclass[lang=cn,newtx,10pt,black,chinesefont=nofont]{elegantbook} \input{../fonts.tex} % ← 必须在 documentclass 之后、begin{document} 之前 \xeCJKsetup{AutoFakeBold=false} % 关掉 elegantbook 的自动描边 ``` ⚠️ 要实测 `\input{../fonts.tex}` 与 elegantbook 的加载顺序是否冲突。 fonts.tex 里有 `\RequirePackage{fontspec}` 和 `\RequirePackage{xeCJK}`, elegantbook 也加载了这两个,需要确认不重复报错(fontspec/xeCJK 本身 可重复加载,但要验证)。 ### 不抽取的内容 - 13 章正文(78 万字节)—— 只要骨架 - `case-library/`、`image/`、`cover.jpg` —— 示例图用占位 - `reference.bib` —— 示例给 2~3 条假条目 ## 验收标准 1. `xelatex` 编译通过,error 0 2. **不依赖任何商业字体和系统字体**(用 fc-list 或日志确认实际加载的是 ../fonts/ouc-serif/ 等目录下的字体) 3. 双端一致(WSL TeX Live 2025 / Windows TeX Live 2022) 4. 加入 verify_all.sh TARGETS,全库 15 → 16 项 5. 版式与原教材一致:封面色带、标题层级、页眉页脚、章节样式 6. 字号 10pt(原文件如此,比仓库其他模板的 12pt 小) 7. 页面 A4,边距与原教材一致 ## 不做 - 不搬原书内容 - 不改原 sre 仓库 - 不引入方正/微软字体
Author
Owner

已完成,提交 a4bfcac

源文件

D:\Yongquan\code\sre = 《软件需求工程导论》完整教材
(13 章 + 5 附录,78 万字节,265 页 PDF,elegantbook 文档类)

新增 教材/

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

关于「字体的共用性」

原教材用 chinesefont=founder,加载方正四大字体
(FZShuSong-Z01 / FZHei-B01 / FZKai-Z03 / FZFangSong-Z02)。
商业字体,不能随仓库分发(#17 的规矩),这是必须解决的问题。

elegantbook 三档中文字体全都不通用:

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

但只写 nofont 还不够 —— 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。

三个坑

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

cls 里 \else \includegraphics[width=\linewidth]{example-image},
是 mwe 宏包的灰底占位图。首页顶着「Image」两个大字。已换成空盒子。

② 占位盒宽度不能是 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\textwidth
  • 改 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。

③ 封面色带改不动

cls 第 345 行 \colorlet{coverlinecolor}{second} 在类加载末尾执行,
把颜色绑到 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 上编出来的。

版式参数

页面    A4 210 × 297 mm
边距    上下 25.4mm,左右 20mm
字号    10pt(比仓库其他模板的 12pt 小,原教材如此)
行距    1.2 倍
编号    章1 → 节1.1 → 小节1.1.1 → 小小节1.1.1.1
        第 5 级改用(1)(2)(3),避免 3.1.1.1.1 这种过长编号

第 5 级的特殊处理和「本章小结 / 习题」的固定收尾都做成了命令
(\oucsummary、\oucexercises),避免各章写法不一致。

## 已完成,提交 `a4bfcac` ### 源文件 `D:\Yongquan\code\sre` = 《软件需求工程导论》完整教材 (13 章 + 5 附录,78 万字节,265 页 PDF,elegantbook 文档类) ### 新增 `教材/` ``` 教材/ouctextbook.sty 版式配置 教材/elegantbook.cls 本地化过的文档类 教材/教材.tex 示例正文(1 章 + 附录 + 参考文献) 教材/reference.bib 参考文献库(虚构条目) 教材/README.md 用法 + 踩坑记录 ``` ### 关于「字体的共用性」 原教材用 `chinesefont=founder`,加载方正四大字体 (FZShuSong-Z01 / FZHei-B01 / FZKai-Z03 / FZFangSong-Z02)。 **商业字体,不能随仓库分发**(#17 的规矩),这是必须解决的问题。 elegantbook 三档中文字体全都不通用: | 选项 | 字体 | 问题 | |---|---|---| | `founder` | 方正四大字体 | 商业字体,换机器就废 | | `ctexfont` | 系统字体(Win=SimSun,macOS=PingFang) | 三平台三种样子 | | `nofont` | 不设 | 不配置就报错 | **但只写 `nofont` 还不够** —— cls 自身第 176/184 行还硬编码了 ```latex \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。 ### 三个坑 **① 封面不写 `\cover{}` 会插一张 "Image" 占位图** cls 里 `\else \includegraphics[width=\linewidth]{example-image}`, 是 mwe 宏包的灰底占位图。首页顶着「Image」两个大字。已换成空盒子。 **② 占位盒宽度不能是 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\textwidth` - 改 tabular 列间距 `@{}l@{}` - 改 `\colorbox` 的 `\makebox[\hsize]` 根因:0 宽空盒让 `\linewidth` 在 titlepage 里与 `\textwidth` 差 5pt, 后续并排的 `\parbox{0.8\textwidth}` + 两个 minipage 整体超宽。 ✅ 正解是给占位盒满宽: ```latex \newcommand{\ouc@coverblank}{% \rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}} ``` 实测 0 Overfull。 **③ 封面色带改不动** cls 第 345 行 `\colorlet{coverlinecolor}{second}` 在类加载末尾执行, 把颜色绑到 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 上编出来的。 ### 版式参数 ``` 页面 A4 210 × 297 mm 边距 上下 25.4mm,左右 20mm 字号 10pt(比仓库其他模板的 12pt 小,原教材如此) 行距 1.2 倍 编号 章1 → 节1.1 → 小节1.1.1 → 小小节1.1.1.1 第 5 级改用(1)(2)(3),避免 3.1.1.1.1 这种过长编号 ``` 第 5 级的特殊处理和「本章小结 / 习题」的固定收尾都做成了命令 (`\oucsummary`、`\oucexercises`),避免各章写法不一致。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/ouc_latex_template#25