Compare commits

..
33 Commits
Author SHA1 Message Date
laoyang 9c959c0a2f 点名册:课程信息六项改为定宽三栏对齐 #26
原来用 \hfill 均分,各栏起点随内容长短漂移,两行对不齐:
第 2 栏差 42pt、第 3 栏差 55pt。

改为定宽三栏:版心 269mm 三等分,每栏 89.67mm,
标签占 18mm,值占 63.67mm。上下两行冒号位置严格重合。

值超长自动折行,不会压到下一栏。

验证:两行冒号位置 90.7 / 344.9 / 599.1 完全一致,差值 0.0。
全库 17/17 通过,点名册 error 0、Overfull 0。
2026-11-03 22:09:02 +08:00
laoyang b3df669850 新增《点名册》模板:A4 横向,18 周考勤表 #26
- 20 列表格:序号 / 学号 / 姓名 / 第 1~17 周
- A4 横向 297x210mm,单页 30 行
- 课程信息区:课程名称、课程号、选课号、学分、任课教师、学年学期
- 字体来自 ../fonts.tex,与其他模板一致
- 已加入 verify_all.sh

全库 17/17 编译通过,点名册 1 页、error 0、Overfull 0。
2026-11-03 21:38:34 +08:00
laoyang 687aa0a5b4 教材:更新 PDF,包含封面图
之前提交源码时用 git checkout 还原了 PDF,导致仓库里的成品
还是无封面图的旧版。本次提交重新编译的版本。
2026-11-01 12:39:07 +08:00
laoyang 203e490197 教材:补上封面图
教材/cover.jpg(1281x1024,229K),教材.tex 启用 \cover{cover.jpg}。
封面图铺满页面上方 210x167.9mm,下方接青绿色带,与成书封面结构一致。

README 文件清单补上 cover.jpg。
2026-11-01 12:03:59 +08:00
laoyang 3906bb49a4 清理代码库中的开发过程内容
- 删除 WORKFLOW.md(开发流程文档,已移入记忆库)
- build.sh 去掉 WSL 相关说明
- 33 个源文件的注释:去掉踩坑记录、实测推导、原文件对比、工单号引用
- 保留技术参数、约束说明、命令含义

净删 399 行。全库 16/16 编译通过。
2026-11-01 09:29:00 +08:00
laoyang f87d763602 重写全部 README,只保留使用说明
17 个 README 统一改成使用说明书,去掉来源、踩坑、需求过程等内容。

只保留:
- 怎么编译、跑几遍
- 文件结构
- 要改哪些参数(逐项列出宏名与含义)
- 用到的命令(表格)
- 版式参数

删除:
- 原文件来源、抽取过程
- 踩坑记录、最小复现、实测数据
- 用户需求、工单号、历史沿革
- 改造前后对比

行数 4185 → 2261。

全库 16/16 编译通过。
2026-11-01 08:52:54 +08:00
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
laoyang c4e686de11 清理:不提交预览图 #24 2026-10-30 23:37:16 +08:00
laoyang 333e2a7789 会议预算表:修掉多出的一列,签字盖章间距拉开 #24
用户反馈两点:
  ① 所在单位负责人意见下面,签字和盖章距离太近
  ② 表格右侧整体多出一列

## ② 多出一列的根因

实测竖线 **9 条 = 8 列**,而 colspec 只定义了 7 列。
多出来那列宽 2.18mm,横贯全部 28 行。

定位过程:
  删掉 R27/R28(意见+签字两行)→ 变 8 条竖线(7 列,正确)
  加回去 → 又变 9 条
  ⇒ 问题就在这两行。

四种组合全试过,全部失败:

| 内容段数 | cell 声明 | 结果 |
|---|---|---|
| 8 段(7 个 &) | cell{27}{4}={c=4} | 9 条竖线,多一列 ❌ |
| 7 段(6 个 &) | cell{27}{4}={c=4} | 9 条竖线,多一列 ❌ |
| 2 段(1 个 &) | cell{27}{4}={c=4} | 列数对,但第 2 段被合并盖住,内容消失 ❌ |
| 2 段 | cell{27}{2}={c=6} | 网格散架(3 页、横线全无)❌ |
| 7 段 | 无 cell 声明 | 同样散架 ❌ |

根因:tabularray 2022A 对「跨整行的大合并」处理不稳定,要求
「内容段数 / cell 起始列 / 跨度」三者严格自洽;在固定列宽 + colsep
1.0mm 的组合下,这三者无法同时满足。

### 解法:物理隔离

主表只到 R26「合计」(26 行),R27/R28 用独立的 oucmeetsign 环境
紧贴在下方。视觉上是同一张表,排版上互不干扰。

签字表列宽**不能自己估**,必须按主表实际竖线位置反推:
   主表竖线 79.65~514.31 = 153.34mm
   3:4 分界 231.89 -> 距左 53.71mm
   第1列 wd = 53.71 - 2 = 51.71mm
   第2列 wd = 153.34 - 53.71 - 2 = 97.63mm
(减 2 = 两侧 colsep 各 1mm)

⚠️ 第一版估的 47.18/93.80 总宽只有 144.98mm,比主表窄 10.5mm,
边框对不上,两格在 pymupdf 里连成一串,看着像只有一格。

## ① 签字盖章间距

3em(27bp=9.5mm) → 5em(45bp=15.8mm)。
实测「(签字)」右端 274.2,「(盖章)」左端 319.0,间距 44.8bp = 15.8mm。

⚠️ 第 1 格的「(签字)」不能用 \hfill 推到右边:第 1 格宽 51.71mm=146bp,
「(签字)」36bp,\hfill 推到格尾后文字**溢出单元格右边界**
(tabularray 不裁剪格内容),实测跑到 199~265 跨过分界线 232,
和第二个「(签字)」连成一串。
⇒ 直接顶格左排,前面补 1mm 抵消全角括号的字形左空白
(「(」的 ink 起点比盒起点靠左 2.5bp,不加会超出左界 79.40)。

## 验证

   主表竖线 8 条 -> **7 列**(多出的列已消除)
   内容核查 49 项,**缺失 0**
   校级领导意见 0 次
   其他费用竖排 y 531.3~586.4,上下留白各 13.4bp
   1 页  err 0  Overfull 0  Underfull 0
   最左 79.40(界79.40)  最右 521.58(界521.57)  最下 711.80(界742.65)

全库 15/15 通过。双端一致:
   WSL TeX Live 2025      1 页 err=0 over=0 under=0
   Windows TeX Live 2022  1 页 err=0 over=0 under=0
2026-10-30 23:37:12 +08:00
laoyang 2e79b00d50 会议预算表:其他费用字距收回,不再贴格线 #24
用户指出:「其他费用,五个字,不能跟那个格子一样高啊,这样字和表格的
线都连在一起了。」

## 问题

上一版为了让四字"填满 5 行",把 \\ 的行距拉到 \\[17bp],
结果文字块高 94bp,而合并格只有 81.9bp —— **文字块比格还高**,
头尾字距格线只剩 2.5bp,视觉上字和表格横线糊成一片。

## 修正

字距改 \\[4bp]。实测对比(9pt 字,合并格高 81.9bp):

   \\[17bp]  文字块 94bp   上下留白 2.5bp    ❌ 贴线
   \\[8bp]   文字块 67bp   上下留白 7.4bp    ⚠️ 偏挤
   \\[4bp]   文字块 56bp   上下留白 13.4bp   ✅ 采用
   不加参数  文字块 43bp   上下留白 19bp     ⚠️ 挤成一团,看不出竖排

## 验证(坐标实测)

   四字 y: 531.3~540.2 / 546.9~555.8 / 562.1~571.0 / 577.4~586.4
   合并格 y: 517.9 ~ 599.8   高 81.9 bp
   距上格线 13.4 bp   距下格线 13.4 bp   ← 完全对称居中

   1 页  error 0  Overfull 0  Underfull 0
   最右 521.58(版心限 521.57)  最下 710.30(版心底 742.65)
   表格宽 155.52 mm(版心 155.99 mm)

全库 15/15 通过。双端一致:
   WSL TeX Live 2025      1 页 err=0 over=0 under=0
   Windows TeX Live 2022  1 页 err=0 over=0 under=0

## 顺便记录

README 里加了字距对照表,说明为什么必须卡在 4bp,避免以后又调回大值。
2026-10-30 20:17:03 +08:00
laoyang f42e6e398a 会议预算表:修正四处排版问题 #24
用户反馈四点,逐条修。

## ① 会议时间与会议地点位置错乱

**现象**:两个字挤在一起,中间没有留填写区。

**根因**:tabularray 的 cell{} 合并位置决定标签落在哪一格,
不是"第几个字"。R2 的合并是 2+2+2+1,即
   格1(列1-2)=会议时间   格3(列3-4)=空值
   格5(列5-6)=会议地点   格7(列7)=空值
「会议地点」必须写在第 5 段,我原先写在第 3 段。

**顺带查清 tabularray 的一个静默失败**(最小复现):
写 7 段 `甲 & & 乙 & & 丙 & & 丁` → 四个字全对
写 4 段 `甲 & 乙 & 丙 & 丁`         → **乙、丁 被吞掉,不报错**
⇒ 段数必须等于列数,被合并的格留空。

**修正**:`会议时间 & & & & 会议地点 & & \\`
实测:会议时间 x=118.6(列1-2),会议地点 x=324.1(列5-6),
中间 193~289 是填写区。

## ② 其他费用应为竖排,不是旋转 90°

**根因**:`\rotatebox{90}` 只是把横排整句转个角度,
不是"上下排列"。用户要的是逐字竖着叠。

**修正**:改 `\shortstack{其\\[17bp]他\\[17bp]费\\[17bp]用}`,
并用 `cell{21}{1}={r=5}{c}` 做纵向合并 5 行。

实测:格高 82bp(y 517.9~611.7),四字 y=517.7/546.4/574.6/602.9,
字距 28.7bp,基本填满。

⚠️ 拉字距**不能**用局部 `\baselineskip` —— `\shortstack` 内部会重置它,
实测设 19bp 完全无效(字距仍是 11.6bp)。必须在 `\\` 上给可选参数。
⚠️ 也**不能**用 `\parbox{}{其\\他\\费\\用}` —— 会变成 4 个独立行盒子,
tabularray 排版错乱,四个字跑到不同段落(实测)。

⚠️ 之前认为「纵向合并和横向合并不能共存」,那是因为写在内容里用
`\SetCell[r=n]`;改用 cell{} 矩阵语法后**可以共存**,本条即证据。
第 2 节的说法已相应更正。

## ③ 校级领导意见是多余的

**先核实**:源 .doc 的 R26 第二格里**确实有两个段落**——
「所在单位负责人意见:」和「校级领导意见:」。
用 LibreOffice 直接转 txt 核过,原文件就有,不是转换时多出来的。

**但用户确认这份表不需要校级领导,故删除。**

代码里注明了原文件有两个段落,要恢复时加回来且必须单独一行。

## 顺带

去掉 `\RequirePackage{graphicx}` —— 不再用 \rotatebox,减少一个依赖。

## 验证

   1 页   error 0   Overfull 0   Underfull 0
   表格 155.52mm / 版心 155.99mm  界内
   最右 521.58(版心止 521.57)  最下 722.27(版心底 742.65)
   校级领导意见 出现 0 次
   会议时间/会议地点 相距 205bp 中间留空

全库 15/15 通过。双端一致:
   WSL TeX Live 2025     1 页 err=0 over=0 under=0
   Windows TeX Live 2022  1 页 err=0 over=0 under=0
2026-10-30 20:11:50 +08:00
laoyang 1c67b7ded1 新增《会议预算表》LaTeX 模板 #24
源文件:微信收到的 会议预算表.doc(51712 字节,**OLE2 老式 .doc**,
D0CF11E0 签名)。python-docx 读不了,处理链路:
.doc --(LibreOffice headless)--> .docx --(python-docx)--> 结构

## 新增文件

   会议预算表/oucmeeting.sty   版式包(含全部 28 行合并规则)
   会议预算表/会议预算表.tex   空表正文(只有内容,无 \SetCell)
   会议预算表/README.md        用法 + 踩坑记录

## 版式(实测)

   页面    A4 210×297mm
   边距    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 行塞进一页压出来的。照抄不"优化"。

⚠️ 原表宽 169.12mm(tblGrid 9588 twips),**比分宽出版心 13.12mm**,
原 docx 靠 fixed 布局硬撑、实际压进页边距。本模板等比缩到版心内。

## 三个踩了很久的坑(全部写进代码注释 + README)

### 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}**,完全看不出是哪个格。
最小复现(已验证):
   \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}{对齐},被合并格留空。

这个坑吃掉最多时间 —— 因为报错行号指向 \end{tblr},
试过 \shortstack、\rotatebox、\newline 各种改,全都不对,
最后靠「同一合并规则换成 cell{} 语法就 0 错」的最小复现才定位到。

### 2. \SetCell[r=n] 与 \SetCell[c=m] 不能同现

纵向合并和横向合并放同一行,报同样那串错。
本表完全不用纵向合并 —— 「其他费用」改成 \rotatebox{90} 竖排,
第 1 列下面 4 行留空,视觉等价。

### 3. colspec / hline / vline / ht 参数不能用宏

tabularray 用自带展开器解析这些选项,遇到用户宏直接
`! Undefined control sequence.`。全部写字面值。

## 页高预算(关键,别乱改行高)

   28 × 5.6mm = 156.8mm
   标题区(附件1 + 22pt 标题 + 日期行)≈ 30mm
   说明 3 条(第 2 条占两行)≈ 35mm
   合计 ≈ 222mm  ≤ 223.98mm  ✅ 刚好一页

⚠️ 行高 5.6mm 已在下限附近。改回 6.0mm 会让 28 行多出 11.2mm,
第 3 条说明立刻被挤到第 2 页(实测过)。

## 验证

   1 页   error 0   Overfull 0   Underfull 0
   表格 155.52mm / 版心 155.99mm  → 界内
   内容 50 项逐项核对,全部存在
   (唯一"缺失"项是「不得坐支现金」因跨行被 \n 断开,
     去空白后匹配通过 —— 不是真缺失)

全库 bash build.sh all → **15/15 通过**(新增第 15 项,已加入 verify_all.sh)

双端一致:
   WSL TeX Live 2025     1 页 err=0 over=0 under=0
   Windows TeX Live 2022  1 页 err=0 over=0 under=0

## 说明

空表,金额/卡号/日期/人名一律留空。不含任何真实数据。
2026-10-30 16:50:32 +08:00
laoyang dc5e9337e8 新增《本科生课程大纲》LaTeX 模板 #23
源文件:SynologyDrive\授课\数字逻辑\教学大纲\课程大纲模板-数字逻辑-2024版.docx
(2025-01-02 修订,是同目录 17 个文件里最新的一个)。所有尺寸从 OOXML 量出。

## 新增文件

   课程大纲/oucSyllabus.sty   版式包
   课程大纲/课程大纲.tex      示例(数字逻辑,已脱敏)
   课程大纲/README.md         用法

## 版式参数(实测)

   页面    A4 210×297mm
   边距    上下左右均 25.4mm(正好 1 英寸)
   正文    12pt      大标题 15pt 居中      表格 9~10pt
   原 docx 字体:Times/宋体/黑体/仿宋_GB2312/微软雅黑

字体全部取自 ../fonts.tex(OUC Serif + OUC Sans),无系统字体依赖。
仿宋_GB2312 与微软雅黑是商业字体,不能随仓库分发(#17 的规矩)。

## 还原的 6 个表格

   表0  课程基本信息   6 行,不规则(各行列跨度不同)
   表1  课程目标×指标点  6×6 打勾矩阵
   表2  目标×教学内容    6×3
   表3  教学进度         8×5(主要大表)
   表4  成绩与能力对应   6×4
   表5  成绩评分体系     5×2

## 踩坑记录(都写进代码注释了)

### 1. tabularray 的 \SetCell 会吞掉下一格,且不报错

`\SetCell[c=2]{c} 内容 & 下一格` → **下一格连同内容一起消失**。

最小复现(6 列表):
    A & \SetCell[c=2]{c} B & C & \SetCell[c=2]{c} D \\
渲染只得 A / B / D,C 没了。**没有报错,没有任何警告。**

✅ 正确写法:跨 n 列后用 n-1 个 `{}` 占位
    A & \SetCell[c=2]{c} B & {} & C & \SetCell[c=2]{c} D & {} \\

⇒ 规律:`&` 总数固定为「列数-1」,与是否跨列无关。
   跨列只是把内容摊到多格上,被摊掉的格要用 `{}` 顶住。

这个坑让「责任教师」「课程性质」「总课时」三个标签凭空消失了三轮,
每次都要靠 pymupdf 逐行数文字才发现。README 里也记了。

### 2. xeCJK 带缩进的段落会多排一个字,但也不报 Overfull

A4、左右 25.4mm、\linewidth=452.97pt、版心右界 523.28bp 下实测:

    无缩进的纯中文段落     右缘 523.28  ✅
    带 2em 缩进(三种写法) 右缘 530.53  ❌ 超 7.25bp

三种失败的写法:
    ① \par\noindent\hspace*{2em}#1\par
    ② \par\setlength{\parindent}{2em}\indent #1\par
    ③ \parbox{\linewidth}{\setlength{\parindent}{2em}\indent #1}

根因:xeCJK 算断行点时仍按「整行可用宽度」,比应停的位置多放一个字。

✅ 正解:把 \hsize 也减掉缩进量
    \setlength{\hsize}{\dimexpr\linewidth-2em\relax}
    \setlength{\parindent}{2em}
实测右缘 502.28bp,落在版心内。

⚠️ 同样**不报 Overfull** —— TeX 认为这行"刚好"。

### 3. 表 0 列宽不能用固定值

课程代码「080502101231」12 位数字,10.5pt 下宽约 22mm + 内边距 3.81mm。
标签列 26.5mm → Overfull 10.26pt;24mm → 3.14pt;22mm → 0。
22mm 是下限(再窄「课程名称」自己折行)。

## 验证

全库 14/14 通过(新增第 14 项,已加入 verify_all.sh TARGETS):

   课程大纲  6 页  err=0 over=0

逐页越界检查:6 页最右 499.37~514.48bp,全部在版心 523.3bp 内。
内容核查:标题、12 项基本信息、八章标题、7 个关键段落、签字栏,
共 17 项全部命中。

双端一致:
   WSL TeX Live 2025    6 页 err=0 over=0
   Windows TeX Live 2022 6 页 err=0 over=0

## 偏离原文件的地方(README 有表)

1. 「六、成绩评定」原 docx 是 10.5pt,与其余七章 12pt 不一致
   (复制粘贴漏改),本模板统一 12pt。
2. 表 0 的竖线按 6 等分统一,原 docx 逐行不同(tabularray 限制)。

## 脱敏

责任教师等真实姓名换成虚构的「张远航」,与仓库其他模板一致。
2026-10-30 13:45:19 +08:00
laoyang 42c1394aec 答案卷抬头改为一行一项,修复长学院名重叠 #22
## 用户诉求

「评分标准最开始不是有个表格吗,里面有开课学院什么的,如果学院名字太长,
就和后面课程名称重合在一起了。看看怎么解决。我建议一行一个信息,
因为这个又不怕长,如果太长,一行都放不下,就直接换行。」

## 现象(已复现并量化)

`dept` 填超长值后,pymupdf 读出:

    开课学院:(70.87~123.37)  值:(123.37~406.87)

而第二格「课程名称」本该从 216.0 开始 ⇒ **重叠 190.87bp**,
把「课程名称 / 试卷类型」整个压住。

⚠️ **编译完全不报错,也没有 Overfull**(rc=0 over=0)。
`\makebox` 内容溢出盒外时 TeX 不认为是坏行。这类 bug 只能靠
量 span 坐标发现,看日志发现不了。

## 根因

`\ouckey@inforow` 用三个 `\makebox[0.3333\linewidth][l]` 并排。
`\makebox` 是**不可断盒子**:
- 内容比盒宽短 → 左对齐(正常)
- 内容比盒宽长 → **直接溢出盒外,压到右边一格**(就是 bug)
- 盒内中文**不能换行**(LR 模式,不做段落断行)

⇒ 三格布局对短字段友好,对长字段必然重叠。

## 改动一:一行一项

    \newcommand{\ouckey@inforow}[2]{%
      \ouckey@ifempty{#2}{}{%
        {\fontsize{10.5bp}{15bp}\selectfont
         \par\noindent\textbf{#1:}#2\par}}}

调用点从「三参数一组」改成「两参数一行」,共 9 项:
课程名称 / 开课学院 / 学生学院 / 年级专业 / 试卷类型 / 考试方式 /
任课教师 / 命题人 / 满分。顺序按"读者关心程度"排。

行距收紧到 15bp(`\Fivhao` 基线距是 16bp)—— 抬头是查阅信息,
不需要正文行距;9 行省约 52bp,将近 3 行正文。

## 改动二:附带修掉一个旧版就有的判空 bug

**旧实现**:
    \newcommand{\ouckey@ifempty}[1]{%
      \if\relax\detokenize{#1}\relax ... }
调用 `\ouckey@ifempty{\ouckey@dept}{空}{非空}`。
`\detokenize` **不展开参数**,看到的是字符串 `\ouckey@dept`(宏名),
永远非空 ⇒ 判空永远失败。

后果:`dept = {}` 时抬头印出孤立的「开课学院:」,后面没有值。
这是旧版就有的 bug(三格布局下不明显),改成一行一项后暴露。

**修法**:在 `\define@key` 里就规范化空值,新增
    \newcommand{\ouckey@setkey}[2]{%
      \if\relax\detokenize{#2}\relax \def#1{}\else \def#1{#2}\fi}
13 个 key 全改走它。

⚠️ 试过「先 `\edef` 展开再 `\detokenize`」的写法,报
   `! Incomplete \iffalse` —— `\if...\else...\fi` 被 `\expandafter`
   链打散,TeX 匹配 `\fi` 时错位。这类宏层展开的修补太脆,放弃。
⚠️ `\ouckey@setkey` 必须定义在 `\define@key` **之前**,否则 undefined。

## 验证

### 三个场景

| 场景 | 结果 |
|---|---|
| 正常(学院名 12 字) | 9 项齐全,无重叠,无越界 |
| 长(含括号说明,约 40 字) | 单行排到 x=406.90,无重叠(下面没有格子可压) |
| 极长(约 70 字) | **自动换行成两行**,第二行缩进对齐,右缘正好 524.40 |
| 留空(dept/college/major 全空) | 三项**整项不印**,不留空行 |

### 编译

    试卷题型示例        6 页  err=0 over=0
    参考答案与评分标准  4 页  err=0 over=0

全库 `bash build.sh all` → **13/13 通过,0 失败**。

### 页数变化

答案卷 3 页 → 4 页。抬头从 3 行变 9 行,是「一行一项」的必然代价。
**已向用户确认,接受 4 页**(第 4 页只有说明文字末尾 2 行 + 签字行)。

## 示例文件未改

`参考答案与评分标准示例.tex` 测试后已还原,`git diff` 为空。
只改 `ouckey.sty` 一个文件。
2026-10-29 22:58:34 +08:00
laoyang 6819d78f29 工作流全部迁到 WSL:新增 WORKFLOW.md,build.sh 改为 WSL 原生 #21
用户要求「全部在 wsl 完成」,原因是 Windows 上工作太多太乱,
WSL 像虚拟环境、坏了能重置、不影响系统。

## 之前为什么乱

分工是「Windows 改代码 + 两端都编」:Windows 侧一份仓库副本装满了
.aux/.log/.toc/.pdf,WSL 侧另一份,靠 scp/git pull 同步维持。
同一项目两份工作副本,漏同步就分叉。

## 实测确认的技术前提

1. **UNC 路径双向读写** —— `\\wsl$\Ubuntu-26.04\home\yongquan\...`
   Read/Write/Edit 三个工具都能直接作用于该路径,读写均落到 WSL 磁盘。
   延迟 6~63ms。⇒ 不需要「本地编辑 → scp」这套中间环节。
   ⚠️ 发行版名是 Ubuntu-26.04,不是常见的 Ubuntu 或 Ubuntu-22.04。

2. **WSL 内 TeX 可完整编译全库** —— `bash build.sh all` 13/13 通过。

3. **WSL 内 git 可推送** —— credential.helper=store 已指向含 token 的
   ~/.git-credentials,fetch 实测通过。

4. **gi.py 可迁** —— 纯标准库,无第三方依赖,复制即用。

5. **Python 依赖** —— 建 ~/.venv-latex,装 pymupdf 2.0 + fonttools 4.68.0,
   不污染系统 Python。

## 本 commit 的改动

### 新增 WORKFLOW.md
写清:为什么在 WSL、目录位置(含 UNC 路径)、日常命令、编辑方式、
PDF 不进版本库的原因、已知排版告警清单、环境重建步骤。

### build.sh 重写为 WSL 原生
原版是「Windows 通过 ssh 远程调 WSL 编译再 scp 取回」,在 WSL 内跑没意义。

新版改动:
- 去掉全部 ssh/scp,直接本地编译
- 两遍编译(目录/页码/LastPage 跨引用第二遍才稳定)
- 自动 cd 到模板目录(.sty 的 ../fonts/ 相对编译目录解析)
- 目录→主文件映射保留:幻灯片/slides、科技报告/report、
  试卷有两个主文件必须显式指定、简历不能拿 ls 第一个 .tex
- `all` 转给 verify_all.sh(那边有完整 TARGETS 清单)
- 新增 SILENT=1 输出紧凑表格,便于脚本消费
- 单目录模式找不到时列出可选目录/主文件,不用去翻源码

### WSL 侧环境(不入库,属个人配置)
- ~/.config/ouc-latex/env.sh 固定 OUC_PY / GI / WB_GITEA_CONFIG / OUC_REPO,
  提供 gi / ouccd / texbuild 别名
- ~/.bashrc 末尾 source
- ~/.local/bin/gi.py + ~/.config/ouc-latex/gitea.json(chmod 600)

## 验证

WSL 内全库编译:

    总数 13 | 通过 13 | 失败 0

逐项:劳务发放说明表 1 / 年度考核登记表 2 / 幻灯片 30(UF1) /
成绩构成说明 1 / 特殊事项说明表 1 / 科技报告 10(UF4) / 简历 3 /
试卷题型示例 6 / 参考答案 3 / 试卷归档封面 1 / 试卷归档目录 1 /
课程执行大纲 5(OF1) / 课程教学日历 2

页数与 Windows 侧历史记录逐个一致。3 处告警均为既有问题,非回归。

WSL 内工单工具:`gi whoami` → token 有效、仓库识别为 ouc_latex_template。
本工单 #21 即由 WSL 内的 gi 创建,工具链已实证可用。

## Windows 侧

备份 D:\Yongquan\backup\ouc_latex_template-win-backup-20261029.tar.gz
(49MB / 244 项 / 不含 .git)。删除前确认两端 HEAD 同为 fb7c76b、
无未推送提交、无 stash。备份保留,不删。

涉及文件:WORKFLOW.md(新增)、build.sh(重写)
2026-10-29 21:50:34 +08:00
laoyang fb7c76b944 装订线虚线方向修正:横杠改回竖杠 #20
用户反馈:「这个装订线不行,得改,需要跟之前的模板保持一致。」

## 问题:整条装订线成了「梯子」

#20 把连字符虚线改成几何线画时,方向画反了。逐像素对比基线与修改后:

  基线(18bp 连字符 rotate 90°):x 51.10~52.10(宽 1.10)、y 跨 4.30
  改后(我画的水平线)    :x 49.40~53.70(宽 4.30)、y 跨 1.00

即基线的每一笔是**竖着的短杠**,我画成了**横着的短杠**。一排横杠叠在
竖线位置上,视觉上就是一把梯子,与原卷完全不同。

## 根因:量数据时没分辨长宽各自对应哪个轴

上一轮 720dpi 扫描得到「长 4.40bp、粗 1.10bp、x 中心 51.60bp」,
三个数都对,但**装配时把「长」放到了 x 轴、「粗」放到了线宽**。
连字符经 rotate=90 后,字面长度落到**纵轴**、线粗落到**横轴**:

  竖:y 跨 4.30bp(连字符的字面长度)
  横:x 跨 1.10bp(连字符的笔画粗细)
  中心 x = 51.60bp

## 修法

  - \draw[line width=1.10bp] (49.40, -y) -- (53.70, -y);     ← 水平线(错)
  + \draw[line width=1.10bp] (51.60, -y) -- (51.60, -y-4.30); ← 竖直线(对)

x 恒定在 51.60,y 跨 4.30bp。单笔画长度用 4.30(720dpi 实测的墨迹边界),
不是之前写的 4.40(那是含抗锯齿溢出的粗估值)。

## 验证:与基线逐像素同值

装订线区域(x 48~56, y 55~690)在 300dpi 下的墨迹像素数:

  基线  7553 像素(8.40%)
  新版  7553 像素(8.40%)  ← 完全相同

逐段比对(720dpi 逐行扫描,过滤掉「装订线」三个汉字的干扰):

  段  笔数   顶端 y    末笔底 y   单笔长   笔距
   1   24    62.20     204.90     4.30    6.00
   2   24   216.50     358.60     4.30    6.00
   3    3   364.80     379.50     4.30    6.00
   4   13   393.40     469.60     4.30    6.00
   5   16   475.80     568.30     4.30    6.00
   6   16   582.10     676.30     4.30    6.00

新版逐段同值,单笔长 4.20 vs 4.30 的 0.1bp 差异是抗锯齿边缘取整。
x 位置 51.00~52.00 vs 51.10~52.10 同样差 0.1bp(亚像素取整),肉眼不可见。

## 编译验证

  Windows / TeX Live 2022   试卷 rc=0 err=0 over=0 6页
                            答案卷 rc=0 err=0 over=0 3页
  WSL / TeX Live 2025       试卷 rc=0 err=0 over=0 6页
                            答案卷 rc=0 err=0 over=0 3页

答案卷不走装订线(\oucexam 的 shipout 钩子只属于试卷),未受影响。

涉及文件:试卷/oucexam.sty(仅 \ouc@dashseg 一个宏 + 注释)
2026-10-29 21:35:57 +08:00
laoyang 93b03c8a78 试卷字体统一为思源宋体 #20
用户要求:「试卷的字体,需要改一下,全部都用思源宋体就可以了。」

pymupdf 提取两份成品 PDF 定位到四类需要统一的字体:

  试卷题型示例(6 页)            参考答案与评分标准示例(3 页)
  OUCSerif-Regular 203 中文        OUCSerif-Regular 333 中文
  TeXGyreTermes-Regular 133 西文   TeXGyreTermes-Regular 197 西文
  TeXGyreTermes-Bold 85 题号分值   OUCSans-Regular 37 黑体小标题
  OUCSerif-Bold 81 中文加粗         CMR10/CMMI10/CMSY10 49 数学公式
  OUCKai-Regular 25 卷头与成绩表    TeXGyreTermes-Bold 21 数字

一、西文与数字:Termes → 思源宋体(oucexam.sty / ouckey.sty)

先在包里用 \newfontfamily 登记 \OUCLatinSerif / \OUCLatinSerifBold
(四个档位全给,斜体指回 Regular —— 思源宋体没有真斜体),再把
\tnr / \tnrb / \sunfont 都 \let 过去。

⚠️ 只做这一步**不够**,这点踩了一轮:模板里大量文字根本没走 \tnr,
而是走 \setmainfont(默认西文族)——\textbf{learning outcome} 的裸西文、
页脚的页码与总页数、任何 \selectfont 之后的裸 ASCII。
第一轮只 \let 时,PDF 里仍残留 22 个 TeXGyreTermes span:
页脚 6 个页码 + 6 个总页数 + 第 4 页的 A./B./C./D. 与 learning outcome 等。
⇒ 必须连 \setmainfont / \setsansfont 一起指到 OUCSerif。

二、卷头与成绩表题号:霞鹜文楷 → 思源宋体(oucexam.sty)

\kh 与 \scoretable 用 \kaiti。包里 \let\kaiti\songti 一次性收口,
不动 ../fonts.tex 的 \def\kaiti —— 别的模板还要用楷体。

三、答案卷黑体小标题:思源黑体 → 思源宋体(ouckey.sty)

\heiti 共 37 处(卷头大标题与各节小标题)。同样 \let\heiti\songti。

四、数学公式:保持不动

$x$ / $\dfrac{1}{45}\sum f_i x_i$ 等 49 处仍走 Computer Modern。
思源宋体没有 MATH 表(实测只有 GSUB/GPOS),不能作数学字体;
强行塞进正文字体会破坏斜体变量、正体数字、运算符间距。用户已确认。

五、装订线虚线:连字符排字 → 用线画(oucexam.sty)

原卷那 6 段竖虚线是 18bp Times 连字符排出来的。换成思源宋体后连字符
每个宽 0.346 em(Termes 0.333),每串会长 4~7bp,破坏"复刻原卷长度"。
⇒ 改为几何画的短横线段,长度锁死。实测原卷(720dpi 逐笔画测量):
  单个连字符笔画 长 4.40bp、粗 1.10bp、x 中心 51.60bp
  相邻笔画步距 6.00bp
新增 \ouc@dashseg{起点y}{笔画数},六段坐标与笔画数逐段照抄原卷
(含原卷被白底遮断成 13+3 两截的那一段)。
⚠️ \newcommand 必须定义在 \ouc@dobindstrip 外面,否则每次 shipout
重新定义,第二页起报 already defined。
⚠️ y 坐标不能写 \dimexpr#1bp+\i*6bp —— TikZ 坐标解析器不认小数 +
\dimexpr 组合,报 Illegal unit of measure。要先 \pgfmathsetmacro。

六、直引号归入 CJK(ouckey.sty)

答案卷正文用 ASCII 直引号 "" 表示中文引号(32 处)。U+0022 在
Basic Latin,xeCJK 判为西文 ⇒ 引号走 \setmainfont,与两侧汉字不同字体,
并挤压出 Overfull(第 88 行 +8.07pt)。
\xeCJKDeclareCharClass{CJK}{"0022} 归位后解决。
⚠️ 不在 fonts.tex 里改:那里全库共用,会让正文真正的英文引号(代码
   片段 "hello world")也变全角。

七、Overfull 的修法:改源码断行,不调参数(ouckey.sty 留有完整记录)

换字体后 \keyitem{3}{4} 那段 Overfull 2.61pt,实际压出版心
(最右 527.01bp,版心止于 524.41)。试过并确认**全部无效**的五种:
  · \emergencystretch 1.5em —— 本行没有弹性胶可拉,无从施展
  · \tolerance 3000 —— 不是不满意断点,是没有更早的合法断点
  · PunctStyle=kaiming —— 能消 Overfull,但标点悬挂探出版心 6.5bp
  · PunctStyle=quanjiao —— 同样探出 8bp
    (xeCJK 这几个 PunctStyle 做的是"标点悬挂"不是"标点压缩",
      指望它消 Overfull 必翻车)
  · \rightskip 0pt plus 6bp(含 \AtBeginDocument 版)—— 6bp 远小于
    需要的 150bp,TeX 仍选"撑破"这个解
正解:第 124 行句号「。」后加 \\。分项给分的答案本来就该一句一行,
读者靠句号扫分点 —— 既解决排版,又让内容结构更清楚。

验证(两套环境各跑,逐项同数)

  WSL / TeX Live 2025    试卷 rc=0 err=0 over=0 6页
                         答案卷 rc=0 err=0 over=0 3页
  Windows / TeX Live 2022 试卷 rc=0 err=0 over=0 6页
                         答案卷 rc=0 err=0 over=0 3页

pymupdf 提取字体分布:

  试卷题型示例      OUCSerif-Regular 291 + OUCSerif-Bold 70
                    → 非宋体文字字体:无
  参考答案示例      OUCSerif-Regular 235 + OUCSerif-Bold 53
                    + CMR10/CMMI10/CMSY10/CMMI7/CMEX10(数学,保留)
                    → 非宋体文字字体:无

几何核对(逐 span 比对,均与基线一致或更优):
  · 成绩表 17 栏逐字符坐标与基线**完全相同**(硬编码坐标,不受字体影响)
  · 装订线 96 笔全部绘出:x 49.40~53.60(宽 4.40bp)、步距 6.00bp,
    六段位置与原卷实测一致
  · 三页最右墨迹均为 524.41bp,与版心严丝合缝,无越界
  · 试卷 6 页最右最大 523.33bp(第 4 页 \mtpair 的 44% 栏宽设计,
    基线同位置同样数值,非本次引入)

涉及文件:
  试卷/oucexam.sty                 默认族、西文字族、\kaiti、装订线虚线
  试卷/ouckey.sty                  默认族、西文字族、\heiti、直引号、踩坑记录
  试卷/参考答案与评分标准示例.tex  第 124 行句号后加断行
2026-10-29 21:29:15 +08:00
laoyang 5d59aa1853 科技报告字体调整:西文改 Cochineal、标题统一鸿蒙、代码换等宽 #19
用户反馈「标题一会儿黑体一会儿什么体的」。pymupdf 提取旧 PDF 定位到
三处字体分裂,逐条修掉。

一、西文从鸿蒙换成 Cochineal(cls/font.cls)

旧版 \setmainfont / \setsansfont / \setmonofont 三处全是鸿蒙。中文换成
思源宋体之后,正文就成了「中文衬线 + 西文无衬线」:同一行里英文数字比
汉字细、像陷进去,读起来割裂。

Cochineal 是 Minion 风格的衬线体(OFL 1.1,fonts/cochineal/ 已在库内),
与思源宋体灰度接近;度量与 Termes 只差 1.9%,不推着断行变。

\setsansfont 保持鸿蒙 —— 标题靠 \hm 切到 OUCHM 族,西文 sans 位仍是鸿蒙,
标题的中西文因此都是鸿蒙,与正文区分得开。

二、\hm 重定义为中西文一起切(cls/font.cls,本次核心)

这是「字体一会儿一个样」的真正来源。fonts.tex 里的 \hm 是
    \def\hm{\CJKfamily{OUCHM}}
纯 xeCJK 中文字族切换,管不到阿拉伯数字和拉丁字母。而标题、封面主标题、
摘要标题都用 \hm 表示「这是鸿蒙」,于是凡是标题里夹了西文就还是西文字体:

  · 章节编号 "1." "3.1" → 走 \setmainfont → 旧版是鸿蒙粗,改 Cochineal 后
    变成衬线粗,与中文鸿蒙粗并排
  · "这是一个很好用的 LaTex 模板" 里的 LaTex → 走 \setmainfont
  · 目录条目编号是数字、标题是中文 → 同一条目录两种字体

修法:本模板内把 \hm 重定义为 \hmlatin\CJKfamily{OUCHM},中西文一起切。
一次在源头解决,不在每个调用点补 \hmlatin —— 后者必然漏(封面、摘要、
目录标题、页眉、文本框标题各漏一次,本次实测漏了 4 处)。

不改 ../fonts.tex 的 \hm:幻灯片和简历也在用,它们没有这个问题,全局改
会外溢。

三、目录条目与页码归零(cls/title.cls)

\cftsecfont 等三条只管条目文字,页码走 \cft*pagefont,不显式清掉的话
目录里页码比标题还粗、最抢眼。两组共 6 条一起设 \normalfont。
不塞 \bfseries:加粗与否是各条目录自己的事,硬加会让二三级也变粗。

四、代码等宽位换 Latin Modern Mono(cls/font.cls)

旧版 \setmonofont 也是鸿蒙 —— 它不是等宽字体,代码里 i/l/1、m/w 宽度
不一,竖向对不齐、缩进看着是歪的。lmmono 是 TeX Live 自带,无需额外
字体文件。

⚠️ 这里不能用 Extension + UprightFont=*-regular:lm 系列文件名本身是
"lmmono10-regular.otf" 已带 -regular,再拼会变成 lmmono10-regular-regular
然后报 cannot be found。给完整文件名、不给 Extension。粗体用
lmmonolt10-bold(同族等宽,换粗体不错位),没有 lmmonobq 这个变体。

五、内容块保留 3 个 Underfull(cls/boxes.cls,只加注释不改代码)

第 208/214/220 行的 \verb|Illuminate\Foundation\Http\Kernel| 是 35 字符
不可断串,在内容块 371pt 内宽里塞不下。试过无效的:\emergencystretch
2em/10em(不是额度不够,是这行没有足够可拉伸 glue)、\sloppy(badness
从 1231 升到 3590,更差)。有效但不采用:\seqsplit(归零但任意字符处
断行,代码路径被切两段)、窄体 lmmonoltcond(归零但压缩可读性)。

结论:保留这 3 个,badness 1231 属轻微(10000 才是严重),渲染只是行末
留白略多。日志里看到它们属预期,不是回归。

六、report.tex 字体说明同步

第 52/58 行原文说「英文字体默认使用鸿蒙」,改后已不准确,重写为
Cochineal + Latin Modern Mono 的实际状况,并说明标题编号统一的原因。

验证(两套环境各跑两遍,逐字同数)

  WSL / TeX Live 2025:rc=0,error 0,Overfull 0,Underfull 4,10 页
  Windows / TeX Live 2022:rc=0,error 0,Overfull 0,Underfull 4,10 页

pymupdf 提取字体分布,两侧完全一致:
  Cochineal-Roman 782   OUCSerif-Regular 143   LMMono10-Regular 98
  OUCKai-Regular 33     HarmonyOS_Sans_SC_Bold 22   HarmonyOS_Sans_Bold 14
  OUCSerif-Bold 8       FontAwesome 5   HarmonyOS_Sans_SC 3
  ZhuqueFangsong 2      OUCSans-Regular 2   CMSY10 1   CMEX10 1
  HarmonyOS_Sans 1

标题逐页核对(中西文双档均属鸿蒙):
  p1 封面   HarmonyOS_Sans_SC_Bold「这是一个很好用的」+ HarmonyOS_Sans_Bold「LaTex」
  p2 目录   HarmonyOS_Sans_SC_Bold「目录」
  p5 摘要   HarmonyOS_Sans_SC_Bold + HarmonyOS_Sans_Bold「LaTex」
  p6 正文   HarmonyOS_Sans_Bold「1.」+ HarmonyOS_Sans_SC_Bold「准备工作」
  p10 正文  HarmonyOS_Sans_Bold「8.」+ HarmonyOS_Sans_SC_Bold「图标」

OUCSans-Regular 2 / ZhuqueFangsong-Regular 2 / HarmonyOS_Sans 1 三处少量
命中已逐个查清,都不是回归:
  · p6「黑体」「仿宋」—— 正文故意演示 \fzzdx / \fzfs 的示例文字
  · p8 每页同 bbox、45° 旋转、29.8pt —— 全页水印,设计如此
  · p10「HTTP/Console」—— 文本框标题走 fonttitle=\hm,改后已是
    HarmonyOS_Sans + HarmonyOS_Sans_SC,中西文都属鸿蒙

涉及文件:
  科技报告/cls/font.cls    默认族、\hm 重定义、等宽位
  科技报告/cls/title.cls   目录条目与页码归零
  科技报告/cls/boxes.cls   仅补 Underfull 记录注释,代码未改
  科技报告/report.tex      字体说明文字同步
2026-10-29 15:47:33 +08:00
laoyang 8660860495 build.sh 两处输出打磨 #18
1) 页码那行改为原样输出。原先用正则截断到 "page",把结尾的括号吃掉了,
   打出来是 "1 page" 而不是 "(1 page).",看着像少字符。

2) 临时文件改用 ./.build_out.$$ + trap 清理,不再用 mktemp。mktemp 在
   Windows 的 Git Bash 里返回 /tmp/... 形式,随后的 rm 会触发安全检查
   (SAFE_DELETE_INVALID_PATH: embedded drive prefix is not allowed),
   无害但会往输出里插一行噪音。

3) 取回成功后打印的路径转成 Windows 形式(D:/...),不再显示 Git Bash
   的挂载路径(/d/...)。
2026-10-29 12:03:02 +08:00
laoyang ef1bc72603 加入 WSL 编译取回脚本与换行符策略 #18
build.sh      在 WSL 内编译(默认 xelatex),成功后用 scp 把 PDF 取回
              Windows 侧同路径。支持单模板与 all 全库。路径全部走环境
              变量覆盖,默认值可用,不硬编码某个人的目录。

verify_all.sh 批量编译验证全库主文件,打印 error / Overfull / Underfull
              与页数。每个模板都在自己目录下编译 —— 模板的 .sty 与
              ../fonts/ 是相对编译工作目录解析的,从仓库根调用找不到字体。

.gitattributes 把所有 .sh 钉成 eol=lf。Windows 侧 core.autocrlf=true 会把
              脚本存成 CRLF,到 Linux 上执行就报
                  /bin/bash^M: bad interpreter: No such file or directory
              这个错误容易误判成"没装 bash",所以在仓库层面固定规则,
              不依赖各人本机的 autocrlf 设置。.tex/.sty/.cls 同样钉 lf,
              避免中文注释行尾残留 CR 被 XeTeX 当字符排出来。

关于脚本为什么要写成「编译-取回」而不是纯编译:
WSL2 会按空闲把整个虚拟机 poweroff,届时 xelatex 连同 PID 1 一起消失,
/tmp 也一并清空(后台日志丢失)。脚本的 ssh 会话在编译期间保持不断,
顺带起了保活作用,所以不要把它改成后台运行。
2026-10-29 12:01:06 +08:00
laoyang 1c27041c71 简历:babel 选项 frenchb 改为 french,兼容 TeX Live 2025 #18
frenchb 是 babel 早期的法语方言名,TeX Live 2025 已把它从「已知语言」
列表里移除,写旧名会报 Unknown option 'frenchb',压住后还会进一步炸在
\begin{document} 处的 \bbl@main@language。改成 french 在旧版本上同样可用,
是向前兼容的写法。

本模板正文是中文,babel 这里只影响西文连字与断词细节,中文断行由 xeCJK
负责,因此改动不影响排版结果。

顺带记录:本次在 WSL(Ubuntu 26.04 + TeX Live 2025)内首次跑通全库 13 个
主文件的编译验证,页数与 Windows 端(TeX Live 2022)一致。另有两处
Linux 侧环境差异不属于模板问题,已在工单 #18 里说明处理方式:
FontAwesome.otf 不随 Debian 的 texlive 分发(用 fontconfig 注册仓库内字体解决)、
简历另需 texlive-lang-french。
2026-10-29 11:59:43 +08:00
laoyang 7cd542a11f 克隆地址改回真实 code 地址 #17
上一轮脱敏时把 clone 地址一并换成了 example.org 占位,属过度处理。
code.yangyq.net/laoyang/ouc_latex_template.git 是当前项目的真实地址,
是「用户从哪 clone」的功能信息,不是隐私,改回。

真名「杨永全」与个人账号「dryangyq」的清除不回退。

slides.tex 脚注里的 URL 需转义下划线(ouc\_latex\_template),否则
报 Missing $ inserted;README 是 markdown 不用转义。

验证:slides 重编 0 error / 30 页,PDF 脚注为真实地址、无 example.org 残留。
2026-10-29 08:35:25 +08:00
laoyang e70339fcf6 全库脱敏:清除真实姓名、个人账号与私有域名 #17
开源前排查,发现三处真实个人信息残留,全部清除:

1. 真名「杨永全」→ 中性署名「中国海洋大学 LaTeX 模板库」
   幻灯片/ 下 6 个 sty 文件头的「%% 作者:杨永全」。

2. 个人账号 dryangyq → 占位地址
   幻灯片/slides.tex 第 66 行脚注里的 github/gitee/gitlab 三个
   dryangyq 仓库地址,改为 example.org 占位并注明开源后替换。

3. 个人域名 yangyq.net + 私有 Gitea 账号 laoyang → 占位地址
   幻灯片/README.md 与科技报告/README.md 的 clone 地址
   code.yangyq.net/laoyang/... 改为 example.org 占位。

另重编幻灯片/slides.pdf:旧 PDF 的脚注里还印着 dryangyq 与
yangyq.net 的 URL(源码改了但成品没重编),逐字提取确认后覆盖。

验证:
- 全库源码(.tex/.sty/.cls/.md)grep 杨永全 / dryangyq / yangyq /
  yongquan / 永全 全部零命中
- 全库 PDF 成品用 pymupdf 提取渲染文本,上述关键词零命中
- 幻灯片重编 30 页、0 error

未处理(遗留,需另决策):git 历史 27 个 commit 的作者签名是
「laoyang <i@yangyq.net>」,含个人域名邮箱。若推到公开平台需
git filter-repo 重写历史(改全部 SHA + force push),属破坏性操作,
本单不做。
2026-10-29 08:17:08 +08:00
laoyang 1abb3cf5ef 特殊事项说明表示例文案换为浮标维护场景 #16
原 \sxdesc 示例是「去菏泽做项目研讨与系统演示、自驾」,用户要求换掉。
改为「渤海湾生态环境监测浮标例行维护,前往昌邑近岸观测站更换传感器
并回收监测数据,该站位于滩涂养殖区公共交通无法抵达,需随车携带
备件箱、采样冷藏箱与工具,故自驾前往」。

选这段的理由:保持原示例「为什么必须自驾」的两条必要性(公共交通不便 +
携带专用设备),只把事由换成本课题范畴内的真实场景,示范作用不变。

影响面:仅 \sxdesc 一个宏,未动任何排版代码。

验证:
- xelatex 0 error / 0 Overfull / 0 Underfull / 1 页
- 四条横线 y = 172.99 / 457.49 / 516.34 / 573.64,与原件逐点一致
- 描述仍为 2 行(227.81 / 241.49),签名区、备注区、页码坐标全部未变
  说明 \vfil 正确吸收了文案长度变化,这正是本模板相对原 docx
  「8 个手写空段」的核心改进
2026-10-28 19:50:37 +08:00
laoyang 0fd6021b03 新增特殊事项说明表 LaTeX 模板 #16
把报销用的《中国海洋大学特殊事项说明表》Word 版复刻为 LaTeX 模板,
新增 特殊事项说明表/ 目录,与库内其余模板同一套约定。

三处关键设计:

1. 版心取「表格宽度」而非 docx 版心。原表 169.54mm 比 docx 版心宽
   13.54mm,靠 tblInd 负值顶出去;照搬 docx 版心必然 Overfull。
   改把 geometry 的版心直接设成表格宽度,零 Overfull 且位置逐点相同,
   代价是标题/备注需额外偏移补回 docx 版心的中心。

2. 行距不用 \baselineskip。本表行距逐行不同(10.5pt 与 12pt 混排),
   而 \baselineskip 只在同一段落内管行距 —— 每行 \par 自成一段后它
   根本没被读到(实测所有行距被压成 13.51,整表矮 2.25bp)。
   改成逐行插 \kern:基线距 = 上盒深度 + \kern + 本盒高度,
   与字体度量彻底解耦。

3. R0 改成「上下两半 + \vfil」,删掉原件那 8 个手写空段。
   描述写长写短都不再影响签名区位置,比原件更稳。

顺带记录六个实测踩出来的坑(块首行胶被丢弃、负 \kern 不能挡、
多行段 \ht 参照末行基线、\prevgen 必须在 \par 之后且在盒内取、
\vbox to N 的深度另计等),详见 sty 内注释与 README。

验证:
- xelatex 0 error / 0 Overfull / 0 Underfull / 1 页
- 与 Word 导出 PDF 逐项对齐:33 个文字元素 dY 全部 0.00bp,
  dX ≤ 0.04bp;四条横线与页码 0.00bp
- 像素差分 3.03%,全部落在字形轮廓上,无整体错位
- 全库 12 个模板回归通过,既有 11 个 PDF 零字节变化

与原件仅 3 处有意差异:字体换本库 OUC Serif(可分发)、
标题小标宋换真粗体(商业字体不可分发)、第 3 条备注编号统一对齐
(原件是手打漏配编号,偏 0.36bp)。
2026-10-28 19:09:12 +08:00
laoyang 389ddf51f0 README 引号统一为中文引号 #15 2026-10-27 15:05:33 +08:00
laoyang ecfbcb8c67 简历软著/转化/教研改为全自动统计,README 补使用说明 #15
新增 cvlist 环境:进入环境后每个 \item 自动 +1,条目里一个标记都不用写。
三节各只改两行(itemize → cvlist{类别}),删掉全部 15 处 \cvmark。

  \begin{cvlist}{软著}
    \item 某某系统. 2024SR9999901. ...
  \end{cvlist}
  概述:登记软件著作权 \cvnum{软著} 项

实测:加 1 条 → 概述自动 5→6;删 2 条 → 自动 5→3;还原 → 回 5。
版面与基线逐行完全一致(66/75/34 行)——cvlist 内部就是普通 itemize。
普通 itemize 不受影响(实测 3 条子项未被误计)。

专利、科研项目仍用逐条 \cvmark:它们一条要算两个类别
(专利+第一发明人、科研项目+主持/负责),cvlist 一次只能管一类。

README 新增「先回答一个最常问的问题:它是全自动的吗?」用表格直接回答
三种写法的差别,并补「全自动写法」「半自动写法」「加一个全新的类别」
三个小节,含可直接抄的代码。

踩坑:\cvmark 内部用 \detokenize 处理类别名,传参前必须 \expandafter
展开 \cv@listcat,否则写进 .cvnum 的是字面串 "\cv@listcat"。

验证:0 error / 0 Overfull / 0 Underfull,3 页;全库回归与基线一致。
2026-10-27 15:04:48 +08:00
laoyang eb3b53946c 简历概述的成果数字改为自动统计(列几条算几条) #14
概述原来手写「论文 40 余篇、专利 20 余项」,每次增删条目都要回头改。
改为正文标记、概述取数:

  \item ...论文... \cvtagcount{SCI}     % 显示 SCI 并计数
  \item ...软著... \cvmark{软著}        % 只计数
  概述:论文 \cvnum*{SCI,EI,核心} 篇(SCI \cvnum{SCI} 篇)

共注册 11 类:SCI/EI/核心/专利/第一发明人/软著/科研项目/主持/负责/转化/教研。

关键技术:不用 aux,改独立数据文件 \jobname.cvnum。
中文键经 aux 往返后 \ifcsname 全部失效(xeCJK 把汉字设为活动字符,
键的 token 形态不一致;ASCII 键正常);独立文件里中文键完全正常。
累加与显示分离(cvacc@ 每遍从 0 起 / cvnum@ 读自上一遍),
否则概述在正文之前会让上一遍的值被本遍叠加,数字翻倍。

踩坑:\cvmark 不能放 \experience 的关键词参数(会被 \foreach 拆开,
报 Misplaced \omit),必须放描述参数内;也不能放 longtable 单元格之外。

验证:0 error / 0 Overfull / 0 Underfull,3 页;加标记后版面与基线
逐行一致;连续 5 次编译数字稳定;增删条目后数字自动跟随。

⚠️ 口径变化:自动统计只数列出来的条目。示例原来写「40 余篇」但正文
只列 9 篇代表作,改成自动后变「9 篇」。README 已写明这两种口径的区别。
项目总经费仍手填(\experience 无经费字段)。
2026-10-27 14:56:34 +08:00
laoyang 8e3017f359 简历左上角加中国海洋大学校徽(可选,默认不印) #13
新增 \cvlogo[<文件名>]{<宽度>},默认不调用、不出现,不影响现有版面。

- cls:导言区只登记参数,真正画图挪到 \makecvheader 开头的 \@makecvlogo,
  否则导言区产生内容报 Missing \begin{document}
- 定位用 tikzpicture[remember picture, overlay] + current page.north west,
  距纸左 10mm / 距纸顶 6mm(相对纸边,不随页边距变)
- 距顶不照搬科技报告的 20mm:简历页边距 15mm、姓名墨迹顶 17.2mm,会压到姓名
- tikzpicture 即使全 overlay 仍占一行 17pt,用 \vspace*{-17pt} 抵消;
  \smash / \hbox to 0pt / \vbox to 0pt 三种写法实测都消不掉
- 尺寸定 28mm(横式 2400:605 ⇒ 高 7.06mm),是 15mm 边距下的上限附近

实测:logo 28.00×7.06mm,x=10.07mm、y=6.07mm,下沿 13.1mm;
姓名 y 保持 48.8pt 未位移;3 页 0 error / 0 Overfull / 0 Underfull / 0 个 ×。
体积 158KB → 573KB(内嵌 2400px 原图,实际只用 28mm≈660px)。
2026-10-27 14:25:27 +08:00
laoyang 69da5b41a6 简历排版修正:项目经验整块右移、西文换 Cochineal、课程执行大纲漏网 × #12
一、项目经验整块右移(简历/awesome-source-cv.cls)
  \rightcolumnlength 算早了:geometry 的 1.5cm 边距要到导言区结束才生效,
  cls 里那句 \setlength 读到 article 默认 \textwidth=345pt,算出 249.87pt,
  比应有的 417.02pt 少 167.15pt。longtable 把窄表居中排,整块右移 83.6pt。
  修法:计算挪进 \AtBeginDocument 并减去 | 竖线的 \arrayrulewidth;
  R 列由 >{\hfill}m{2.5cm} 改为 >{\raggedright\arraybackslash}p{2.5cm}。
  日期左边缘 145.1 -> 48.5pt,与其余章节严格对齐。
  这类错误零 error 零 warning,只能量 PDF 坐标才能发现。

二、西文换 Cochineal(fonts/cochineal/ + fonts.tex + 简历 cls)
  中文思源宋体配 Termes 时西文笔画偏细,中英混排会「陷进去」。
  Cochineal 宽 225.42pt vs Termes 229.68pt,只窄 1.9%,断行位置基本不动;
  Pagella/XCharter 宽 7~11%,会把全库断行推着变,故不选。
  字体 920KB 入 fonts/cochineal/(SIL OFL 1.1,附 OFL.txt),
  fonts.tex 新增 \oucUseCochineal 开关,只简历调用,其余 10 个模板不受影响。

三、换字体后暴露的真实缺陷
  西文窄 1.9% 让断点整体前移,ICIEA 那条论文冲出 88.49pt(文字顶到纸边)。
  根因是中文紧跟英文的位置不是断开点,整串被当长单词。
  加 \emergencystretch=3em 解决。

四、课程执行大纲漏网占位符(ouccourse.sty)
  ××学部××学院 硬编码在 \ccschool 里,#11 只扫了 .tex 没扫 .sty 所以漏了。
  拆成 \ccdepartment / \cccollege 两个名称宏,默认「信息科学与工程学部 /
  计算机科学与技术学院」。重编后全文 × 归零。

「代码库 PDF 没更新」经核实不成立:本地/远程 HEAD 均为 8984b93,
从服务器下载 8 个 PDF 逐字节比对全部一致,简历.pdf 3 页 0 个 ×。

验证:简历 3 页 0 error/0 Overfull/0 Underfull;全库 12 项编译回归与基线一致。
2026-10-27 13:13:54 +08:00
laoyang 8984b93ee7 模板内容填充:全库 × 占位换成完整虚构示例,README 表述同步 #11
把 11 个模板里满篇的 × 换成一套连贯的虚构数据,让样张能看出排版效果。

虚构设定(跨模板统一):
- 数字逻辑 / 2025 秋 / 张远航 / 计算机科学与技术学院,教学日历、成绩构成
  说明、试卷归档封面、试卷四份互相对得上
- 简历:张远航,1985.03,教授博导,论文/专利/项目/获奖全套虚构
- 年度考核:同一人的 2025 年度考核表,年度总结四段写满
- 执行大纲:刻意不套用上面那套(原件就是《信号与线性系统分析》的课,
  强行改课程名会让章节体系、学时分配、思政案例全对不上)

假数据都留肉眼可辨标记:DOI 统一 10.9999/、专利号 ZL209999…、
软著 2024SR99999…、手机 138 0000 0000、邮箱 example.net。
签字/日期/评语栏仍然留空——编了就分不清该改哪儿。

修掉一个既有 bug(填充时才暴露):
年度考核登记表「出生年月」的值从来不显示,连字符都不在 PDF 里。
根因是 tabularray 的 cell{r}{c}={c=n} 里那个 c 是数据行的单元序号、
不是视觉列号,表头三处 c=2 要求该行吃 15 个视觉列而表只有 11 列,
超出部分静默丢弃。迷惑点:写 12 格丢值,写 9 格反而正常。
正解是表头不写 cell{},改用行内 \SetCell[c=n]{c},每行照常写满 11 格。
同时 R0 行原件本就装不下(前六字段 115.76mm,剩 42.20mm 要放
19.68mm 标签 + 17.22mm 值,但列宽被切成 15.31/1.38/25.51),
把标签折两行「出生/年月」解决,列宽一个没改。

README 同步:根 README 与 8 个模板 README 里「一律用 × 占位」的说法
已不成立,统一改为「示例内容全部虚构」,并说明哪些位置仍必须留空。

验证:12 个模板零 error,4 处基线警告未新增;干净副本重编页数一致;
PDF 正文 × 清零;真实信息零泄漏。
2026-10-27 12:50:02 +08:00
laoyang cc0dfb7257 新增个人简历模板(简历/),字体全部换成仓库自带的 #10
从个人目录的中文简历迁移为第 11 个模板,三处字体重做:

1) 字体三层依赖全部拆掉
   - 删 zh_cn-adobefonts_external/internal.sty(Adobe 宋/黑/楷/仿,56 MB,
     商业授权不可分发),中文字体改由 ../fonts.tex 提供
   - awesome-source-cv.cls 的 localFont 分支(SourceSansPro 9 个 .otf)
     整段删除,西文改走 ../fonts.tex 的 TeX Gyre Termes
   - fontawesome.sty 原按字体名找系统 FontAwesome,改成显式
     Path=../fonts/fontawesome/,并把 FontAwesome.otf 收进仓库

   顺带修掉一个设计缺陷:原 adobefonts 里 BoldFont/ItalicFont/SmallCapsFont
   全部指向 Regular,等于加粗不变、斜体不变。现用字体自带的真粗体。

2) 占位化:真实姓名/手机/邮箱/住址/出生年月/论文题名与 DOI/专利号/
   软著号/33 条获奖全部改为 ××× / 20××;真人照 a.jpg/a.png 换成
   PIL 生成的 400×400 中性剪影 photo.jpg

3) 排版修正
   - 左栏宽度改为 \dimexpr\linewidth-\leftcolumn-4\tabcolsep\relax 自适应,
     修掉长表格 Overfull 4.48pt(原来没把 4 个 \tabcolsep 算进去)
   - 抬头两处 \vspace*{...}\\、\smallskip\\ 改为 \\[...],
     修掉 Underfull \hbox (badness 10000)
   - \socialinfo 末尾多余的 \\ 去掉

fonts.tex 的改动(全库共享):\textsc 用的 sc 档改用
\DeclareFontShape{TU}{OUCSerif(0)}{m}{sc}{<->ssub * OUCSerif(0)/m/n}{}
做形状替换,而不是 SmallCapsFont 选项 —— 后者与本文件 ItalicFeatures 的
跨目录 Path 互斥,任何写法都报 The font "OUCSerif-Regular" cannot be found.

回归:11 个模板全部零 error 编译通过;科技报告/试卷/课程执行大纲
文本与改动前逐字一致,4 个既有 boxwarn 为改动前基线,未新增。

编译:cd 简历 && xelatex 简历.tex 跑两遍,3 页,零 error/Underfull/Overfull。
嵌入字体仅 OUCSerif-{Regular,Bold}、TeXGyreTermes-{Regular,Bold}、FontAwesome。
2026-10-27 11:17:24 +08:00
laoyang 95afc9caa6 成绩构成说明:表格格线全画 + 签字栏去掉年份占位 #9
用户反馈:中间表格要把线都画上,中间空白容易看错行;最后的年月日
也不要带 20xx。

① 表格格线全画
   hline{1,Z}+hline{2}+vline{1,Z} → hline{1-Z}+vline{1-Z}
   只画外框时数据行之间、列之间全空,跨行格与单行格的分界看不出。

   连带必须改列宽:画上 5 条内部竖线后表宽多 2.5pt,报
   Overfull 2.47554pt,末列 30.28mm → 29.40mm 补回。

   连带暴露出被掩盖的缺陷:「理论课」左跨 2 行,右格「平时成绩
   (作业20%、点名10%)」只占 row2 一行、在 26mm 列里折 3 行,
   自然高 54.73pt —— row2 被撑到 54.73pt,文字上下零留白,末行
   「10%)」墨迹底离行线仅 0.90pt(0.32mm),其他行是 4.97pt。
   画满格线前那里本来没有线,缺陷完全看不到。

   治法 row{2}={ht=22mm}。关键是 ht 为最小高度、须大于内容高才生效:
   先试 12.5mm(35.4pt < 54.73pt)无反应,22mm(62.4pt)才把行撑到
   62.86pt,末行墨迹间隙 4.08pt(1.44mm),与其他行同量级。

② 签字栏去掉年份
   20××~年 月 日 → 年 月 日。签名文件的年份由签字人当场手写,
   模板预留占位符反而占掉手写空间。

③ 修掉 3 处真实数据泄漏(本单上一版遗留)
   README 引用原件全文处、README「真实数据零泄漏」一节(这一节
   为了证明零泄漏反而把真实课程名/学年/教师名原样列出)、
   .tex 的「闭卷笔试」。已复查 10 个关键词零命中。

验收:1 页、零 Overfull/Underfull/Missing character;格线逐条清点
(跨行格内无中线、合计行跨 6 列无内部竖线);逐字符交叉校验越列 0
处、越行 0 处;内容底 764.71pt vs 版心底 769.89pt,余量 5.18pt。
2026-10-27 09:45:58 +08:00
111 changed files with 11304 additions and 2973 deletions
+36
View File
@@ -0,0 +1,36 @@
# 换行符策略
#
# 背景:这个仓库同时在 Windows(TeX Live 2022)和 WSL/Linux(TeX Live 2025)
# 上使用。Windows 侧 core.autocrlf=true 会把文本文件存成 CRLF,
# 而 shell 脚本一旦是 CRLF,在 Linux 上执行会报
# bash: ./build.sh: /bin/bash^M: bad interpreter: No such file or directory
# 这个报错不直观(看起来像"没有 bash",实际是行尾多了回车),
# 所以在仓库层面把规则固定下来,不依赖每个人本机的 autocrlf 设置。
# 所有 .sh 一律 LF,Windows 侧检出也不转换
*.sh text eol=lf
# TeX 源码与样式:LaTeX 对 CRLF 容忍度好,但 eol=lf 能避免
# 中文注释在行尾残留 CR 被 XeTeX 当成字符排出来
*.tex text eol=lf
*.sty text eol=lf
*.cls text eol=lf
*.bib text eol=lf
# 配置文件
*.gitignore text eol=lf
.gitignore text eol=lf
.gitattributes text eol=lf
*.md text eol=lf
# 二进制:不参与换行符转换与文本 diff
*.pdf binary
*.otf binary
*.ttf binary
*.ttc binary
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.zip binary
+14 -1
View File
@@ -16,6 +16,19 @@
*.snm *.snm
*.vrb *.vrb
# biblatex 的中间产物(教材/ 会生成)
# *-blx.bib biblatex 自动写的"引用收集"文件,每次编译重写,不是输入
# *.run.xml biblatex 运行时状态
*-blx.bib
*.run.xml
# 各模板的预览图(截图导出,不入库)
*/.preview/
# 简历成果统计的自动生成文件(每次编译重写,不要提交)
# 见 简历/awesome-source-cv.cls 的「成果统计」一节
*.cvnum
# 编辑器 # 编辑器
.vscode/ .vscode/
.idea/ .idea/
@@ -24,4 +37,4 @@
# 系统 # 系统
.DS_Store .DS_Store
Thumbs.db Thumbs.db会议预算表/.preview/
+149 -38
View File
@@ -1,58 +1,169 @@
# ouc_latex_template # 中国海洋大学 LaTeX 模板库
中国海洋大学各类文件 LaTeX 模板。**本仓库是本项目唯一的模板维护库**,各模板按文档类别分目录存放,互不依赖、可单独编译。 17 个文档模板 + 一份公共字体。换机器、换系统、换 Overleaf,编译结果一致。
## 目录 ## 目录结构
| 目录 | 内容 | 编译入口 | ```
ouc_latex_template/
├── fonts.tex ← 公共字体入口,所有模板都引用它
├── fonts/ ← 字体文件(唯一的字体来源)
├── build.sh ← 编译脚本
├── verify_all.sh ← 全库编译检查
│
├── 会议预算表/ ┐
├── 劳务发放说明表/ │
├── 年度考核登记表/ │
├── 特殊事项说明表/ │
├── 成绩构成说明/ │
├── 试卷/ │
├── 试卷归档封面/ │ 17 个模板
├── 试卷归档目录/ │ 每个目录自成一体
├── 课程大纲/ │ 各自带 README
├── 课程执行大纲/ │
├── 课程教学日历/ │
├── 教材/ │
├── 科技报告/ │
├── 幻灯片/ │
├── 简历/ │
└── 点名册/ ┘
```
## 模板清单
| 模板 | 用途 | 主文件 |
|---|---|---| |---|---|---|
| [`试卷/`](试卷/) | 期末考试**试卷**、**参考答案及评分标准**两套模板 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` | | `会议预算表/` | 会议经费预算表 | `会议预算表.tex` |
| [`试卷归档封面/`](试卷归档封面/) | 信息科学与工程学部**试卷归档封面**(理论课) | `试卷归档封面.tex` | | `劳务发放说明表/` | 劳务费发放说明 | `劳务发放说明表.tex` |
| [`试卷归档目录/`](试卷归档目录/) | 信息科学与工程学部**试卷归档目录**(理论课,12 项核对清单) | `试卷归档目录.tex` | | `年度考核登记表/` | 教职工年度考核登记表 | `年度考核登记表.tex` |
| [`年度考核登记表/`](年度考核登记表/) | 教职工**年度考核登记表** | `年度考核登记表.tex` | | `特殊事项说明表/` | 报销用特殊事项说明表 | `特殊事项说明表.tex` |
| [`劳务发放说明表/`](劳务发放说明表/) | **劳务发放说明表** | `劳务发放说明表.tex` | | `成绩构成说明/` | 课程成绩构成说明 | `成绩构成说明.tex` |
| [`课程执行大纲/`](课程执行大纲/) | 本科**课程教学执行大纲** | `课程执行大纲.tex` | | `试卷/` | 试卷 + 参考答案与评分标准 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` |
| [`课程教学日历/`](课程教学日历/) | 学校通用版**课程教学日历(理论课程)**(附件3,16 周日历表) | `课程教学日历.tex` | | `试卷归档封面/` | 试卷袋归档封面 | `试卷归档封面.tex` |
| [`成绩构成说明/`](成绩构成说明/) | **成绩构成说明**(理论课/实验课比例分解表 + 教师签字栏) | `成绩构成说明.tex` | | `试卷归档目录/` | 试卷袋归档目录 | `试卷归档目录.tex` |
| [`幻灯片/`](幻灯片/) | 演示文稿(**beamer** 主题,海大配色) | `slides.tex` | | `课程大纲/` | 本科生课程大纲 | `课程大纲.tex` |
| [`科技报告/`](科技报告/) | **科技报告**、实验讲义、说明文档 | `report.tex` | | `课程执行大纲/` | 课程执行大纲 | `课程执行大纲.tex` |
| `课程教学日历/` | 课程教学日历 | `课程教学日历.tex` |
| `教材/` | 教材、专著(成书排版) | `教材.tex` |
| `科技报告/` | 科技报告、实验讲义 | `report.tex` |
| `幻灯片/` | Beamer 演示文稿(16:9) | `slides.tex` |
| `简历/` | 个人简历 | `简历.tex` |
| `点名册/` | 课程点名册(A4 横向,18 周考勤) | `点名册.tex` |
## 编译 ## 编译
全部模板都**必须用 XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过: 在**模板目录内**编译,不要在仓库根目录编译。
```bash ```bash
cd 幻灯片 cd 课程大纲
xelatex slides.tex xelatex 课程大纲.tex
xelatex slides.tex # 跑两遍,第二遍才能取到正确的目录、交叉引用与总页数
``` ```
目录名含中文不影响编译(已实测 10 个模板目录在中文目录下零报错编译通过)。 或用编译脚本(在仓库根目录执行):
## 说明 ```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、鸿蒙 HarmonyOS Sans(各字体授权见 [`fonts/LICENSE`](fonts/LICENSE),来源与字符集见 [`fonts/README.md`](fonts/README.md))。
- **每个子目录自包含**:样式文件(`.sty` / `.cls`)、图片都在各目录内,编译时不需要额外的宏包搜索路径;只有字体是共享的上层目录。 ### 各模板编译遍数
- **各目录的 `README.md`** 写明该模板的用法、可改参数、版式数据来源与书写注意事项,改之前先看。
- **示例内容为占位**:模板均不含真题、不含真人信息,姓名 / 学号 / 职工号 / 课程代码等一律用 `×` 或虚构值占位,按实际情况替换即可。 | 模板 | 遍数 | 原因 |
|---|---|---|
| 表格类(会议预算表、劳务发放说明表、年度考核登记表、特殊事项说明表、成绩构成说明、试卷归档封面、试卷归档目录) | 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/harmonyos-sans/` | HarmonyOS Sans(幻灯片/科技报告) | 华为 | 华为官方允许免费商用 |
合计约 49 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` 手机号),替换成自己的内容即可
Executable
+140
View File
@@ -0,0 +1,140 @@
#!/usr/bin/env bash
# 编译模板
#
# 用法:
# bash build.sh 特殊事项说明表 # 编译该目录下默认主文件
# bash build.sh 试卷 试卷题型示例 # 显式指定主文件(不带 .tex 也行)
# bash build.sh all # 全库所有主文件,逐个编译
# bash build.sh all 2>&1 | tee /tmp/v.log # 想留完整日志
#
# 可用环境变量:
# TEXBIN 默认 xelatex
# SILENT 非空时只打印结论行(给批量脚本用)
#
# ⚠️ 三条务必注意
#
# 1) **PDF 不要提交**。同源码编两次,页面一致但内嵌 CreationDate 不同,
# git 会认为文件变了(全库 16 个 PDF 全变 M)。提交前:
# git checkout -- '*.pdf'
# 或者用 git status 确认只 add 了源码。
#
# 2) **每个模板都要在它自己的目录里编**。.sty 里的 Path=../fonts/ 是相对
# 编译时工作目录解析的,从仓库根调用会找不到字体,报一堆
# "The font ... cannot be found"。本脚本已自动 cd,不用手动。
#
# 3) **两遍编译**。目录、页码、LastPage 跨引用要第二遍才稳定。
# 只编一遍会看到「第 ? 页」或者目录页码错位。
set -u
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TEXBIN="${TEXBIN:-xelatex}"
SILENT="${SILENT:-}"
die() { echo "$1" >&2; exit 2; }
# 目录 → 主文件。目录名与主文件名不一致的必须在这里登记。
# 简历/ 下有 fontawesomesymbols-*.tex 等宏包片段,不能拿 ls 第一个 .tex 当主文件。
mainfile_of() {
case "$1" in
幻灯片) echo "slides" ;;
科技报告) echo "report" ;;
简历) echo "简历" ;;
试卷) echo "" ;; # 有两个主文件,必须显式指定
*) echo "$1" ;;
esac
}
# 编一个:$1=目录 $2=主文件名(不带 .tex)
build_one() {
local dir="$1" name="$2"
local log="/tmp/oucbuild.$$.log"
local log1="/tmp/oucbuild.$$.1.log"
# 第一遍:产出 .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=$?
local err over under pages
err=$(grep -c '^!' "$log" 2>/dev/null || :)
over=$(grep -c 'Overfull' "$log" 2>/dev/null || :)
under=$(grep -c 'Underfull' "$log" 2>/dev/null || :)
pages=$(grep -o 'Output written on .*' "$log" 2>/dev/null | tail -1)
if [ -z "$SILENT" ]; then
echo "=== $dir / $name ==="
echo " error : $err"
echo " Overfull : $over"
echo " Underfull : $under"
echo " ${pages:-(无输出,见 $log)}"
else
printf '%-24s err=%-2s over=%-2s under=%-2s %s\n' \
"$dir" "$err" "$over" "$under" "$(echo "$pages" | sed 's/Output written on .*(\([0-9]*\) page.*/\1页/')"
fi
if [ "$rc2" -ne 0 ]; then
echo "--- 错误片段($log)---" >&2
grep -A6 '^!' "$log" 2>/dev/null | head -20 | sed 's/^/ /' >&2
# 保留失败日志,方便排查;成功时删掉
return "$rc2"
fi
rm -f "$log" "$log1"
return 0
}
[ $# -eq 0 ] && die "用法: bash build.sh <目录名|all> [主文件名]"
DIR="$1"; TEX="${2:-}"
#----------------------------------------------------------------------
# 全库模式:直接转给 verify_all.sh(那边有完整的 TARGETS 清单)
#----------------------------------------------------------------------
if [ "$DIR" = "all" ]; then
exec bash "$ROOT/verify_all.sh"
fi
#----------------------------------------------------------------------
# 单目录模式
#----------------------------------------------------------------------
if [ ! -d "$ROOT/$DIR" ]; then
echo "没有这个目录:$DIR" >&2
echo "可选:" >&2
( cd "$ROOT" && ls -d */ 2>/dev/null | sed 's|/$||' | sed 's/^/ /' ) >&2
exit 2
fi
if [ -z "$TEX" ]; then
TEX="$(mainfile_of "$DIR")"
if [ -z "$TEX" ]; then
echo "$DIR/ 有多个主文件,请显式指定:" >&2
( cd "$ROOT/$DIR" && ls *.tex 2>/dev/null | grep -v fontawesome | sed 's/\.tex$//' | sed 's/^/ /' ) >&2
echo "例: bash build.sh $DIR $(cd "$ROOT/$DIR" && ls *.tex 2>/dev/null | grep -v fontawesome | head -1 | sed 's/\.tex$//')" >&2
exit 2
fi
fi
# 允许用户写带 .tex 的
TEX="${TEX%.tex}"
if [ ! -f "$ROOT/$DIR/$TEX.tex" ]; then
echo "找不到 $DIR/$TEX.tex" >&2
exit 2
fi
build_one "$DIR" "$TEX"
+116 -4
View File
@@ -1,7 +1,7 @@
%====================================================================== %======================================================================
% oucfonts.tex —— 中国海洋大学模板库的公共字体入口 % oucfonts.tex —— 中国海洋大学模板库的公共字体入口
% %
% 本文件是仓库内**唯一**允许声明字体的地方。十个模板全部通过 % 本文件是仓库内**唯一**允许声明字体的地方。十一个模板全部通过
% \input{../fonts.tex} % \input{../fonts.tex}
% 取字体,不再各自写 \setCJKmainfont / \setmainfont。 % 取字体,不再各自写 \setCJKmainfont / \setmainfont。
% %
@@ -70,6 +70,9 @@
% %
% Termes 与 Times New Roman 字符宽度逐字相同,因此原有的西文断行、 % Termes 与 Times New Roman 字符宽度逐字相同,因此原有的西文断行、
% 表格列宽、行内公式对齐都不会因为换字体而漂。 % 表格列宽、行内公式对齐都不会因为换字体而漂。
%
% ⚠️ 全库默认就是 Termes。简历模板(简历/)单独换成 Cochineal,
% 见下面「一之二」。其余 10 个模板不受影响。
%====================================================================== %======================================================================
\setmainfont{texgyretermes}[ \setmainfont{texgyretermes}[
Extension = .otf, Extension = .otf,
@@ -80,6 +83,82 @@
BoldItalicFont = *-bolditalic, BoldItalicFont = *-bolditalic,
] ]
%======================================================================
% 一之二、西文备用字体:Cochineal(Minion 风格)
%
% 为什么加这一款:Termes 是 Times 的度量兼容替代,中文用思源宋体时,
% 两者笔画粗细与字面灰度差得比较明显 —— 汉字是宋体的中等粗细,
% 西文 Termes 偏细偏紧,中英混排时西文那一段会"陷进去"。
% Cochineal(Michael Sharpe 据 Minion 设计)笔画更饱满,与宋体灰度
% 接近,学术出版物里用得很广。
%
% 与 Termes 的度量差异(10pt 下同一句英文的排印宽度):
% Termes 229.68pt 100.0% x 高 0.450
% Cochineal 225.42pt 98.1% x 高 0.433
% 窄 1.9%,换过去几乎不会让断行位置变。这是选它而不是 Pagella
% (宽 10.8%)/ XCharter(宽 7.4%)的主要理由:那两款会把全库的
% 表格列宽和断行推着变。
%
% ⚠️ **不是全局生效**,必须显式调用下面这条才会切:
% \OUCLatinCochineal
% 目前只有 简历/awesome-source-cv.cls 调用。其余模板保持 Termes。
%
% ⚠️ 三个地方一起换才算真的换掉:
% ① \setmainfont —— 正文西文(正文里的英文、数字、DOI)
% ② \tnr / \tnrb —— 模板里显式用 Times 形态的地方
% ③ 数学字体 —— 本模板库的模板都不带公式,故未配 unicode-math。
% 若将来某个模板要用公式,得再补 \setmathfont,否则公式里的
% 拉丁字母还是 Computer Modern。
%
% 授权:SIL OFL 1.1(Copyright 2010-2014 Sebastian Kosch;
% 2016-2021 Michael Sharpe)。OFL.txt 已随字体放在
% ../fonts/cochineal/ 下。
%
% 度量数据(供将来换字体时对照,单位 1/1000 em,upm=1000):
% 字体 x 高 cap 高 x/cap A 宽 字重
% Termes 450 662 0.68 722 400
% Cochineal 433 649 0.67 612 400
%======================================================================
\newfontfamily\OUCLatinCochineal{cochineal}[
Extension = .otf,
Path = ../fonts/cochineal/,
UprightFont = *-Roman,
BoldFont = *-Bold,
ItalicFont = *-Italic,
BoldItalicFont = *-BoldItalic,
]
% 粗体专用档:对应上面 \tnrb 的语义("取粗体那一字形当常规用")。
% 与 \tnr 同样四档齐全,否则 \bfseries 里会报
% Font shape `TU/cochineal/b/n' undefined
% 并静默回落,表现是加粗失效。
\newfontfamily\OUCLatinCochinealBold{cochineal}[
Extension = .otf,
Path = ../fonts/cochineal/,
UprightFont = *-Bold,
BoldFont = *-Bold,
ItalicFont = *-BoldItalic,
BoldItalicFont = *-BoldItalic,
]
% 把上一条真正装成"正文西文字体"的开关。
% 单独做成命令而不在字体声明处直接 \setmainfont,是因为 \newfontfamily
% 只登记了一个字族;要让它接管正文,必须再用 \setmainfont 指过去。
\newcommand{\oucUseCochineal}{%
\setmainfont{cochineal}[
Extension = .otf,
Path = ../fonts/cochineal/,
UprightFont = *-Roman,
BoldFont = *-Bold,
ItalicFont = *-Italic,
BoldItalicFont = *-BoldItalic,
]%
% \tnr / \tnrb 也跟着走,否则模板里显式写了 \tnr 的地方仍是 Termes,
% 同一页出现两种西文字体。
\renewcommand{\tnr}{\OUCLatinCochineal}%
\renewcommand{\tnrb}{\OUCLatinCochinealBold}%
}
%====================================================================== %======================================================================
% 二、中文主字体 % 二、中文主字体
% %
@@ -134,6 +213,39 @@
}, },
] ]
% ------------------------------------------------------------------
% 小型大写(sc):用**字体形状替换**,不用 SmallCapsFont 选项
%
% 为什么需要它:简历模板的 \user / \resumetitle / \experience 都用了
% \textsc,而中文没有小型大写字形,不处理就每页刷 6 条
% LaTeX Font Warning: Font shape `TU/OUCSerif(0)/m/sc' undefined
% 惯例做法是让 sc 档**指回常规体**:\textsc{中文} 看起来不变(中文
% 本来也没有大小写),而 \textsc{English} 里的西文仍然走 \setmainfont
% 的 Termes 小型大写,行为正确。
%
%
% 1) SmallCapsFont 这个选项**与本文件上面的 ItalicFeatures /
% 只有 SmallCapsFont + SmallCapsFeatures → 通过
% 再加 ItalicFeatures(带跨目录 Path) → 立刻报
% Package fontspec Error:
% The font "OUCSerif-Regular" cannot be found.
% 写 *-Regular、写全名 OUCSerif-Regular、写带 .otf 的、把两个键
% 挪到最后,全都报同一个错;把斜体换成同目录字体
% (ItalicFont = *-Bold)就又能过 —— 所以是**跨目录 Path 的相互作用**,
% 不是文件名写法问题。照着"IralicFont 怎么写的就怎么写"去改会一直失败。
%
% 2) 绕开的办法就是干脆不用那个选项,改用 LaTeX 原生的字体形状替换
% (\DeclareFontShape + <->ssub)。这条机制在 fontspec 选项之下,
% 不受选项间相互作用影响,效果完全等价。
%
% ⚠️ 第二个参数 OUCSerif(0) 里的 (0) 是 fontspec 给该字体生成的内部
% 族编号,不是笔误。若将来 \setCJKmainfont 换了字体名,这两行必须
% 同步改;写错**不会报错**,只会让 sc 警告悄悄回来 —— 改完看日志。
% ------------------------------------------------------------------
\DeclareFontShape{TU}{OUCSerif(0)}{m}{sc}{<->ssub * OUCSerif(0)/m/n}{}
\DeclareFontShape{TU}{OUCSerif(0)}{b}{sc}{<->ssub * OUCSerif(0)/b/n}{}
%====================================================================== %======================================================================
% 三、字族命令 % 三、字族命令
% %
@@ -192,11 +304,11 @@
]{ZhuqueFangsong} ]{ZhuqueFangsong}
\def\fangsong{\CJKfamily{OUCFang}} \def\fangsong{\CJKfamily{OUCFang}}
% 西文:显式取 Times 形态(原模板里 \tnr / \tnrb / \sunfont 的替代) % 西文:显式取 Times 形态
% %
% ⚠️ 四个档位必须全给。只给 UprightFont 的话,在 \bfseries 环境里会落到 % ⚠️ 四个档位必须全给。只给 UprightFont 的话,在 \bfseries 环境里会落到
% "Font shape `TU/texgyretermes/b/n' undefined" 并静默替换, % "Font shape `TU/texgyretermes/b/n' undefined" 并静默替换,
% 表现为加粗失效(试卷的 \TNRB 与 \qnum 都会踩到)。 % 表现为加粗失效(试卷的 \TNRB 与 \qnum 需要用到)。
\newfontfamily\tnr{texgyretermes}[ \newfontfamily\tnr{texgyretermes}[
Extension = .otf, Extension = .otf,
Path = ../fonts/tex-gyre-termes/, Path = ../fonts/tex-gyre-termes/,
@@ -267,7 +379,7 @@
% %
% 这里不全局改 \linespread,因为各模板需求不同(科技报告依赖 ctex % 这里不全局改 \linespread,因为各模板需求不同(科技报告依赖 ctex
% 默认值,试卷归档封面/课程执行大纲/年度考核登记表必须归 1 才能 % 默认值,试卷归档封面/课程执行大纲/年度考核登记表必须归 1 才能
% 还原 docx 的精确行高)。只提供工具命令,由各模板自行调用。 % 还的精确行高)。只提供工具命令,由各模板自行调用。
%====================================================================== %======================================================================
\newcommand{\ouclinespread}[1]{\linespread{#1}\relax} \newcommand{\ouclinespread}[1]{\linespread{#1}\relax}
+19
View File
@@ -62,6 +62,23 @@ CFF 层的 fontNames / FamilyName / FullName 与 name 表,并在 name 表
本仓库为原版直接分发,未修改。 本仓库为原版直接分发,未修改。
--------------------------------------------------------------------------------
四之二、Cochineal-*.otf
--------------------------------------------------------------------------------
上游字体:Cochineal
设计者:Michael Sharpe(据 Sebastian Kosch 的 Crimson 衍化而来)
授权:SIL Open Font License 1.1
授权原文:随本目录分发于 cochineal/OFL.txt
Copyright (c) 2010-2014 Sebastian Kosch, with Reserved Font Name Crimson.
Copyright (c) 2016--2021, Michael Sharpe (msharpe@ucsd.edu),
with Reserved Font Name Cochineal.
本仓库为原版直接分发,未修改、未改名。
用途:仅 简历/ 模板的西文(由 fonts.tex 的 \oucUseCochineal 切换),
其余 10 个模板仍用 TeX Gyre Termes。
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
五、HarmonyOS_Sans_*.ttf / HarmonyOS_Sans_SC_*.ttf 五、HarmonyOS_Sans_*.ttf / HarmonyOS_Sans_SC_*.ttf
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@@ -92,6 +109,8 @@ CFF 层的 fontNames / FamilyName / FullName 与 name 表,并在 name 表
[x] 所有 OFL 字体均保留授权全文(name 表 13/14 号),符合 OFL 1.1 §1。 [x] 所有 OFL 字体均保留授权全文(name 表 13/14 号),符合 OFL 1.1 §1。
[x] 未使用上游作者名义作任何背书暗示。 [x] 未使用上游作者名义作任何背书暗示。
[x] TeX Gyre Termes 的 GFL 允许随文档分发。 [x] TeX Gyre Termes 的 GFL 允许随文档分发。
[x] Cochineal 为 SIL OFL 1.1,允许随仓库再分发;授权全文已随字体放入
cochineal/OFL.txt,并保留在 name 表 13/14 号。
[x] HarmonyOS Sans 为华为官方允许免费商用。 [x] HarmonyOS Sans 为华为官方允许免费商用。
如对本目录内任何字体的授权有疑问,请以上游地址的授权原文为准。 如对本目录内任何字体的授权有疑问,请以上游地址的授权原文为准。
+83 -237
View File
@@ -1,264 +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 个
└── harmonyos-sans/ HarmonyOS Sans 鸿蒙(中英各一档) 6 个,16 MB ├── cochineal/ Cochineal 西文衬线(Minion 风格) 4 个
├── harmonyos-sans/ HarmonyOS Sans 幻灯片、科技报告用 6 个
├── fontawesome/ Font Awesome 简历的图标符号 1 个
└── LICENSE 授权说明
``` ```
合计约 **49 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 | 简历图标符号 | — | 图标集 |
## 一、为什么要把字体打进仓库 ## 怎么引用
原先七个模板是两种做法: 在模板的导言区写两行:
| 做法 | 模板 | 问题 | ```latex
\documentclass[UTF8,fontset=none]{ctexart}
\input{../fonts.tex}
```
- `fontset=none` 必须写。不写的话 ctex 会先按系统字体配一套。
- `../fonts.tex` 是**相对模板目录**的路径。所以要在模板目录内编译。
- 本文件可以重复 `\input`,多个 sty 各自引用不会冲突。
## 可用的字体命令
`\input{../fonts.tex}` 之后可用:
| 命令 | 效果 | 实际字体 |
|---|---|---| |---|---|---|
| 各自带一份字体 | `幻灯片/`(鸿蒙 18 个文件 49 MB)、`科技报告/`(鸿蒙 + 方正 5 款 92 MB) | 两份重复;字体版本一旦不同步,两个模板的样子就会不一致 | | `\songti` | 中文宋体 | OUC Serif |
| 直接用系统字体 | 其余五个(SimSun / SimHei / FangSong / KaiTi / Times New Roman) | 换台机器(Linux、macOS、精简版 Windows、Overleaf)直接编不出来;而且这些字体**不允许随仓库分发** | | `\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。
- **编译结果可复现** —— 与操作系统、与是否装过某款字体无关。 另有两个独立字族,用于直接指定:
- **授权干净** —— 全库不含任何商业字体,见第四节。
- **体积可控** —— 只保留实际用到的字重与字符集。
--- | 命令 | 实际字体 |
## 二、各字体的来源与授权
全部为**开源或官方允许免费商用**的字体。逐项如下。
### 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) | | `\OUCLatinCochineal` | Cochineal 常规 |
| 授权 | SIL OFL 1.1 | | `\OUCLatinCochinealBold` | Cochineal 粗体 |
| 字符集 | 12882 字符,**GB2312 全集覆盖** |
| 版本 | 0.212(technical preview) |
未做裁剪(原文件 8.4 MB 已经够小,且保留全集更安全)。 ## 改默认字体
**只有常规一档,没有粗体** —— 需要粗体的地方请改用黑体或宋体。
### 3. TeX Gyre Termes —— 西文 Times 等价字体 改 `../fonts.tex` 里的 `\setCJKmainfont`(中文)和 `\setmainfont`(西文)。
| | | 字体文件按 `Path = ../fonts/<目录>/` 定位,所以新增字体要放进对应的子目录。
## 授权
全部允许免费商用和再分发:
| 字体 | 授权 |
|---|---| |---|---|
| 上游 | TeX Gyre Termes(GUST 字体项目) | | OUC Serif / OUC Sans | SIL OFL 1.1 |
| 授权 | GUST Font License(GPL + 字体嵌入例外) | | OUC Kai | SIL OFL 1.1 |
| 特性 | 与 Times New Roman **逐字度量兼容** | | Zhuque Fangsong | SIL OFL 1.1 |
| TeX Gyre Termes | GUST Font License |
| Cochineal | SIL OFL 1.1 |
| HarmonyOS Sans | 华为,官方允许免费商用 |
| Font Awesome | SIL OFL 1.1 |
用它是为了保证中文模板里原有的西文断行、表格列宽、行内公式对齐不漂移。 不含商业字体,无方正、无 SimSun/SimHei/KaiTi/FangSong、无 Times New Roman。
实测同一段英文,Termes 与 Times New Roman 的逐词宽度差在 0.03pt 量级。
### 4. HarmonyOS Sans —— 鸿蒙字体 用本模板编译出的文档不受字体授权约束,版权归作者本人。
| | | ## 字符集限制
|---|---|
| 上游 | HarmonyOS Sans(华为) |
| 授权 | 华为官方声明允许**免费商用**(随 HarmonyOS 开发者文档发布) |
| 保留原因 | `幻灯片/` 与 `科技报告/` 原有观感就是鸿蒙,换成思源会明显改变这两个模板的视觉 |
只保留实际用到的 6 个文件:`HarmonyOS_Sans_{Regular,Bold}`(西文)、 OUC Serif / Sans / Kai 只含 **GB2312** 字符(6763 汉字 + 常用标点 + 拉丁 + 希腊 + 数学符号)。
`HarmonyOS_Sans_{Regular,Bold}_Italic`、`HarmonyOS_Sans_SC_{Regular,Bold}`(中文)。
原目录里的 Black / Light / Medium / Thin 等 12 个字重全库无人引用,已删除。
> ⚠️ 鸿蒙字体的文件名用**下划线**分隔(`HarmonyOS_Sans_SC_Regular.ttf`), 超出 GB2312 的生僻字(部分人名、地名用字)会显示成空白或方框。
> 不是 `族名-字重` 格式。所以在 fontspec 里不能写 `*-Regular` 通配, 遇到这种情况,用 Zhuque Fangsong(12882 字,覆盖更广)或换用其他字体。
> 必须显式给完整文件名。
--- ## 新增字体
## 三、字体是怎么被调用的 1. 把字体文件放进 `fonts/新字体/`
2. 在 `../fonts.tex` 里加 `\newfontfamily` 或 `\setCJKfamilyfont`
3. 用 `Path = ../fonts/新字体/` 定位
所有模板都只做一件事:在导言区 `\input{../fonts.tex}`(幻灯片与科技报告因为 多个档位(常规/粗体/斜体)在不同目录时,每个档位要单独写 `Path`
目录层级不同,路径略作调整)。`fonts.tex` 负责: 和 `Extension`,不能只靠主选项继承。
1. 加载 fontspec / xeCJK;
2. 注册默认族与 `\songti` / `\heiti` / `\kaiti` / `\fangsong` / `\kaishu` /
`\tnr` / `\tnrb` / `\hm` / `\hmlatin`;
3. 把 `×` `—` `□` `○` `√` 等「长得像西文、其实该走中文」的符号
归入 CJK 字符类(详见该文件的注释);
4. 提供 `\ouclinespread` 行距工具。
各模板自己**不再写任何** `\setCJKmainfont` / `\setmainfont`。
### ⚠️ 三个容易踩的坑(都写在 fonts.tex 的注释里了)
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
harmonyos-sans 16.4 MB
合计 49 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 |
| `幻灯片/` | 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 |
| `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 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+96
View File
@@ -0,0 +1,96 @@
Copyright (c) 2010-2014 Sebastian Kosch, with Reserved Font Name Crimson.
Copyright (c) 2016--2021, Michael Sharpe (msharpe@ucsd.edu),
with Reserved Font Name Cochineal.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file not shown.
Executable
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env bash
# 批量编译验证仓库内全部模板,打印每个的 error / Overfull / Underfull / 页数
#
# 用法:
# bash verify_all.sh # 全部
# bash verify_all.sh 试卷 # 只跑指定目录(按目录名精确匹配)
#
# 设计说明:
# · 每个模板都在**自己的目录**里编译。模板的 .sty 与 ../fonts/ 都是相对
# 编译时工作目录解析的,从仓库根调用会找不到字体。
# · 只排除 error,不排除 Overfull/Underfull —— 这两类是排版质量的早期信号,
# 要看得见。已知的几处属既有问题(试卷/、课程执行大纲/ 各 1 处 Overfull,
# 幻灯片/、科技报告/ 各 1 处 Underfull),不是回归。
# · 主文件不像「目录名.tex」的,在 TARGETS 里显式登记(幻灯片/slides.tex、
# 科技报告/report.tex、试卷/ 的两个示例)。
# · 简历/ 目录下还有 fontawesomesymbols-*.tex 等宏包片段,不是文档,
# 不能拿 ls 的第一个 .tex 当主文件,否则报 Emergency stop。
set -u
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$ROOT" || exit 1
TEXBIN="${TEXBIN:-xelatex}"
TARGETS=(
"劳务发放说明表|劳务发放说明表.tex"
"年度考核登记表|年度考核登记表.tex"
"幻灯片|slides.tex"
"成绩构成说明|成绩构成说明.tex"
"特殊事项说明表|特殊事项说明表.tex"
"科技报告|report.tex"
"简历|简历.tex"
"试卷|试卷题型示例.tex"
"试卷|参考答案与评分标准示例.tex"
"试卷归档封面|试卷归档封面.tex"
"试卷归档目录|试卷归档目录.tex"
"课程执行大纲|课程执行大纲.tex"
"课程教学日历|课程教学日历.tex"
"课程大纲|课程大纲.tex"
"会议预算表|会议预算表.tex"
"教材|教材.tex"
"点名册|点名册.tex"
)
filter="${1:-}"
total=0; ok=0; fail=0
failed_list=""
for entry in "${TARGETS[@]}"; do
dir="${entry%%|*}"; tex="${entry##*|}"
if [ -n "$filter" ] && [ "$dir" != "$filter" ]; then continue; fi
total=$((total+1))
printf "=== [%d] %s/%s ===\n" "$total" "$dir" "$tex"
log="$(mktemp)"
( cd "$dir" && "$TEXBIN" -interaction=nonstopmode -halt-on-error "$tex" > "$log" 2>&1 )
rc=$?
# grep -c 无匹配时已经输出 0(退出码 1),不能再 `|| echo 0`,
# 否则变量会变成 "0\n0",后面的整数比较直接报 integer expected。
err=$(grep -c "^!" "$log" 2>/dev/null || :)
over=$(grep -c "Overfull" "$log" 2>/dev/null || :)
under=$(grep -c "Underfull" "$log" 2>/dev/null || :)
pages=$(grep -oE "Output written on .*\([0-9]+ page" "$log" 2>/dev/null \
| tail -1 | grep -oE "\([0-9]+" | tr -d "(")
printf " rc=%s err=%s Overfull=%s Underfull=%s pages=%s\n" \
"$rc" "${err:-0}" "${over:-0}" "${under:-0}" "${pages:-?}"
if [ "$rc" -eq 0 ] && [ "${err:-1}" -eq 0 ] && [ -n "${pages:-}" ]; then
ok=$((ok+1))
else
fail=$((fail+1))
failed_list="${failed_list}
- $dir/$tex"
grep -A2 "^!" "$log" 2>/dev/null | head -9 | sed "s/^/ /"
fi
rm -f "$log"
done
echo
echo "================ 汇总 ================"
echo "总数 $total | 通过 $ok | 失败 $fail"
[ -n "$failed_list" ] && printf "%s\n" "$failed_list"
exit 0
+91
View File
@@ -0,0 +1,91 @@
# 会议预算表
中国海洋大学会议经费预算表,A4 单页,空表可直接印刷手填。
## 编译
```bash
cd 会议预算表
xelatex 会议预算表.tex
```
或仓库根:`bash build.sh 会议预算表`
## 文件
| 文件 | 说明 |
|---|---|
| `会议预算表.tex` | 主文件,填内容改这里 |
| `oucmeeting.sty` | 版式包,一般不改 |
## 表格结构
28 行 × 7 列,分四段:
| 区段 | 行 | 内容 |
|---|---|---|
| 基本信息 | 1–6 | 会议名称、时间、地点、类型、参会人数、支出项目卡号、会议内容 |
| 收入预算 | 7–14 | 会务费收入、科研经费、财政拨款专项、学校预算经费、其他、合计 |
| 支出预算 | 15–26 | 专家咨询费、交通费、住宿费、伙食费、其他费用(交通费/印刷费/会议室/补助/其他)、合计 |
| 意见签字 | 27–28 | 经费负责人意见、所在单位负责人意见、签字盖章 |
## 填写方式
这是**空表模板**,金额、卡号、日期、人名一律留空,打印后手填。
要电子填写,在 `.tex` 正文里往对应位置补内容即可。比如会议名称:
```latex
会议名称 & 软件需求工程教学研讨会 & & & & & \\
```
### 页首信息
```latex
\oucmeetattach{附件 1} % 左上角附件编号,不要则写 \oucmeetattach{}
\oucmeettitle{中国海洋大学会议预算表} % 标题
\oucmeetdateline{填表日期:... 金额单位:...} % 标题下方一行
```
### 表尾说明
```latex
\begin{oucmeetnotes}
\oucmeetnote{1、}{说明内容}
\oucmeetnote{2、}{说明内容}
\end{oucmeetnotes}
```
条目数可增减,「1、」「2、」写在第一个参数里。
## 表格内改内容
正文里每行对应表格一行,用 `&` 分列。**每行必须写满 7 段(6 个 `&`)**,
被合并掉的格子留空:
```latex
会议时间 & & & & 会议地点 & & \\
```
合并关系在 `oucmeeting.sty` 的 `cell{行}{列}={c=跨度}{对齐}` 里声明。
改列宽或改结构时看那里。
### 「其他费用」竖排
四个字竖排、跨 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 会把表尾说明挤到第二页。
+300
View File
@@ -0,0 +1,300 @@
%======================================================================
% oucmeeting.sty —— 中国海洋大学 会议预算表 版式包
%
% 由学校下发的 .doc 复刻而来(源文件:会议预算表.doc,OLE2 老格式,
% 先经 LibreOffice 转 docx 再解析 OOXML)。尺寸全部从原文件量出。
%
% ⚠️ 编译: xelatex 会议预算表.tex
% 单次编译即可,无交叉引用。
% 依赖 ctex + geometry + fontspec + xeCJK + tabularray
% 与 课程大纲/、课程执行大纲/ 同源同风格。
%======================================================================
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{oucmeeting}[2026/10/30 v1.0 OUC meeting budget form]
\RequirePackage{geometry}
\RequirePackage{fontspec}
\RequirePackage{xeCJK}
\RequirePackage{tabularray}
% 注:不再需要 graphicx。早期版本用 \rotatebox 做「其他费用」竖排,
% 现已改为 \shortstack 逐字竖排(修正),不再依赖 graphicx。
%======================================================================
% 1. 页面
%
% sectPr (11906 x 16838 twips):
% 宽 210.01 mm 高 297.00 mm ← 标准 A4
% top 2155 twips = 38.01 mm
% bottom 1985 twips = 35.01 mm
% left 1588 twips = 28.01 mm
% right 1474 twips = 26.00 mm
% header 0 twips = 0.00 mm (无页眉)
% footer 992 twips = 17.50 mm
%
% 四个边距都不常见(38/35/28/26),是原表为把 28 行表格塞进一页
% 压出来的。照抄,不"优化"——这是复刻件,不是重新设计。
%
% ⚠️ 版心宽 = 210 - 28.01 - 26.00 = 155.99 mm
% 而原表宽 169.12 mm,**超宽 13.12 mm**。
% 用 tblLayout=fixed 硬撑,实际会压进右侧页边距。
% ⇒ 本包把表格等比缩到 155.99 mm(系数 0.9224),
% 列宽按比例重算,见第 3 节。这是唯一一处主动偏离原文件的地方。
%======================================================================
\geometry{
paperwidth = 210mm,
paperheight = 297mm,
left = 28.01mm,
right = 26.00mm,
top = 38.01mm,
bottom = 35.01mm,
headheight = 0pt,
headsep = 0pt,
footskip = 17.50mm,
}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt}
\pagestyle{empty} % 无页眉页脚页码
%======================================================================
% 2. 字体
%
% 用宋体 / 黑体。仓库规矩:不用商业字体,
% 全部取自公共字体包 ../fonts.tex。
%
% ⚠️ 原表字号分布
% 22pt ×1 —— 标题「中国海洋大学会议预算表」
% 9pt ×47 —— 表格内全部文字 + 三条说明
% 无 12pt 段落,与课程大纲那套不同,别照抄那边的字号命令。
%======================================================================
\input{../fonts.tex}
\newcommand{\oucMeetFont}[2]{\fontsize{#1pt}{#2pt}\selectfont}
\newcommand{\Mtw}{\oucMeetFont{22}{30}} % 标题 22pt
\newcommand{\Mn}{\oucMeetFont{9}{12}} % 表格与说明 9pt
\AtBeginDocument{\Mn}
%======================================================================
% 3. 表格列宽
%
% 网格(tblGrid,单位 twips):
% [424, 2054, 790, 1262, 2056, 209, 2793] 合计 9588
% 换算 mm(×25.4/1440):
% [7.48, 36.23, 13.93, 22.26, 36.27, 3.69, 49.27] 合计 169.12
%
% 等比缩到版心 155.99 mm(系数 0.9224):
% [6.9, 33.4, 12.9, 20.5, 33.4, 3.4, 45.4] 合计 155.9
%
% ⚠️ 第 6 列只有 3.4mm,是原文件里「其他费用」竖排标题那一列的残留
% (原 209 twips,几乎只是一条分隔线宽)。保留它是因为第 20~24 行
% 的「其他费用」合并单元格需要它占位,删掉会破坏网格。
%======================================================================
% ⚠️ 列定义**不能**放进宏再用 \OucMeetColspec 引用 —— tabularray 的
% colspec 解析器要求字面量,报
% Package tabularray Error: Unexpandable command ... inside Column type
% ⇒ 直接写在下方的 colspec={...} 里(实际唯一可行写法)。
%----------------------------------------------------------------------
% 行高(修正)
%
% ⚠️⚠️ 的 28 行里**只有 R26 显式设了 trHeight**(567 exact = 10mm),
% 其余 27 行都没设 —— 行高由内容自然撑开,9pt 字约 4.5~5mm。
%
% 第一版我给所有行硬设 ht=7.4mm(自己拍的数),结果:
% 28 × 7.4 = 207.2mm,加标题区约 30mm + 说明约 25mm = 262mm
% 而版心只有 224mm ⇒ **必然溢出一页**,说明文字被推到第 3 页。
%
% ⇒ 改为 row{2-Z} 不设 ht,让内容撑开(与一致);
% 表头行(R6/R14 分节标题)和签署行(R26/R27)单独给最小高度,
% 保证印章框有空间。
%
% ⚠️ 但 9pt + 0 上下内边距时行高只有 4.2mm,全表 28×4.2=118mm,
% 偏挤且不像正式表格。折中取 ht=6.0mm(≈ 一点留白),
% 28×6.0=168mm,加标题 30 + 说明 25 = 223mm,正好卡在 224mm 内。
% ⚠️ 若将来内容变多导致溢出,优先降这个值,不要动页边距。
% (注:这个 6.0mm 是写在下方 row{1-Z}={ht=6.0mm} 里的字面量,
% 不做成宏 —— 原因见第 4 节开头的说明。)
%======================================================================
% 4. 主表环境
%
% ⚠️⚠️ 合并单元格用**矩阵式语法**,绝对不能写在内容里用 \SetCell
%
% 现状(tabularray 2022A + 本表的 7 列 Q[c,m,wd=…] + colsep=1mm):
% 只要在单元格内容里写 \SetCell[c=n],编译立刻报
% ! Missing number, treated as zero.
% ! Illegal unit of measure (pt inserted.)
% \__dim_eval_end:
% 且**全部错误都定位到 \end{tblr}**,根本看不出是哪个格。
% \begin{tblr}{colspec={Q[c,m,wd=21mm] ...7列..., colsep=0.8mm}}
% \SetCell[c=2]{c} A & \SetCell[c=5]{l} B \\
% \end{tblr}
% 必崩;把同样的合并改写成下面的 cell{} 语法就 0 错。
%
% ✅ 正确写法:在 tblr 的选项里用
% cell{行}{列}={c=n}{对齐}
% 被合并掉的格在内容里**留空**(写 `& &`),不要写 {}。
%
% ⚠️ 另有一个坑:纵向合并 \SetCell[r=n] 与横向 \SetCell[c=m]
% 不能出现在同一行,同样报上面那串错。本表因此完全不用纵向合并,
% 「其他费用」改成竖排文字 + 该列留空(视觉上等价)。
%======================================================================
\newenvironment{oucmeettable}{%
\par\begingroup\Mn
\begin{tblr}[label=none]{
colspec={Q[c,m,wd=6.10mm] Q[c,m,wd=29.65mm] Q[c,m,wd=11.43mm] Q[c,m,wd=18.18mm] Q[c,m,wd=29.65mm] Q[c,m,wd=3.00mm] Q[c,m,wd=40.10mm]},
colsep=1.0mm, rowsep=0pt, stretch=0,
hline{1-Z}={0.5pt}, vline{1-Z}={0.5pt},
row{1-Z}={ht=5.6mm, font=\Mn, valign=m},
% ---- 合并规则(行号从 1 开始)----
% R1~R6 基本信息
cell{1}{1}={c=2}{c}, cell{1}{3}={c=5}{l},
cell{2}{1}={c=2}{c}, cell{2}{3}={c=2}{l}, cell{2}{5}={c=2}{c}, cell{2}{7}={c=1}{l},
cell{3}{1}={c=2}{c}, cell{3}{3}={c=5}{l},
cell{4}{1}={c=2}{c}, cell{4}{3}={c=5}{l},
cell{5}{1}={c=2}{c}, cell{5}{3}={c=5}{l},
cell{6}{1}={c=2}{c}, cell{6}{3}={c=5}{l},
% R7 收入预算标题(跨 7 列)
cell{7}{1}={c=7}{c},
% R8~R14 收入表
cell{8}{1}={c=2}{c}, cell{8}{3}={c=2}{c}, cell{8}{5}={c=2}{c}, cell{8}{7}={c=1}{c},
cell{9}{1}={c=2}{l}, cell{9}{3}={c=2}{l}, cell{9}{5}={c=2}{l}, cell{9}{7}={c=1}{l},
cell{10}{1}={c=2}{l}, cell{10}{3}={c=2}{l}, cell{10}{5}={c=2}{l}, cell{10}{7}={c=1}{l},
cell{11}{1}={c=2}{l}, cell{11}{3}={c=2}{l}, cell{11}{5}={c=2}{l}, cell{11}{7}={c=1}{l},
cell{12}{1}={c=2}{l}, cell{12}{3}={c=2}{l}, cell{12}{5}={c=2}{l}, cell{12}{7}={c=1}{l},
cell{13}{1}={c=2}{l}, cell{13}{3}={c=2}{l}, cell{13}{5}={c=2}{l}, cell{13}{7}={c=1}{l},
cell{14}{1}={c=2}{c}, cell{14}{3}={c=2}{l}, cell{14}{5}={c=2}{l}, cell{14}{7}={c=1}{l},
% R15 支出预算标题(跨 7 列)
cell{15}{1}={c=7}{c},
% R16~R20 支出表(3+2+2)
cell{16}{1}={c=3}{c}, cell{16}{4}={c=2}{c}, cell{16}{6}={c=2}{c},
cell{17}{1}={c=3}{l}, cell{17}{4}={c=2}{l}, cell{17}{6}={c=2}{l},
cell{18}{1}={c=3}{l}, cell{18}{4}={c=2}{l}, cell{18}{6}={c=2}{l},
cell{19}{1}={c=3}{l}, cell{19}{4}={c=2}{l}, cell{19}{6}={c=2}{l},
cell{20}{1}={c=3}{l}, cell{20}{4}={c=2}{l}, cell{20}{6}={c=2}{l},
% R21~R25 其他费用区(1+2+2+2)
% ★ 「其他费用」纵向合并 5 行,文字逐字竖排(不是旋转 90°)
% 写法:cell{21}{1}={r=5}{c} 声明纵向合并,
% 内容用 \shortstack{其\\他\\费\\用} 逐字堆叠。
% ⚠️ 不能用 \rotatebox{90} —— 那只是把整行文字旋转,
% 仍然是"横向一句转个角度",不是你要的上下排列(修正)。
% ⚠️ 纵向合并也必须用 cell{} 矩阵语法。写成 \SetCell[r=5] 在
% 内容里,会与同行的 \SetCell[c=n] 冲突报 Missing number。
cell{21}{1}={r=5}{c},
cell{21}{2}={c=2}{l}, cell{21}{4}={c=2}{l}, cell{21}{6}={c=2}{l},
cell{22}{2}={c=2}{l}, cell{22}{4}={c=2}{l}, cell{22}{6}={c=2}{l},
cell{23}{2}={c=2}{l}, cell{23}{4}={c=2}{l}, cell{23}{6}={c=2}{l},
cell{24}{2}={c=2}{l}, cell{24}{4}={c=2}{l}, cell{24}{6}={c=2}{l},
cell{25}{2}={c=2}{l}, cell{25}{4}={c=2}{l}, cell{25}{6}={c=2}{l},
% R26 合计(3+2+2)
cell{26}{1}={c=3}{c}, cell{26}{4}={c=2}{l}, cell{26}{6}={c=2}{l},
% ⚠️ 主表只到 R26「合计」。
% R27/R28(意见+签字)已移到 5 节的独立签字表(oucmeetsign 环境),
% 原因见 5 节开头的说明 —— 那两行无论怎么调都会多出一列或丢内容。
% ⇒ 主表现在是 **26 行**,不是 28 行。
}%
}{%
\end{tblr}\par\endgroup}
%======================================================================
% 5. 签字栏(独立小表,不并入主表)
%
% ⚠️⚠️ 为什么把签字栏从主表里拆出来
%
% 主表 R27/R28(意见+签字)无论怎么调都无法同时满足"不多列"和
% "内容不丢失"。实际四种组合全失败:
% 内容 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 页、无横线)
% 内容 7 段 + 无 cell 声明 → 同样散架
%
% 根因是这两行的"内容段数 / cell 起始列 / 跨度"三者必须严格自洽,
% 而 tabularray 2022A 在这种跨整行的大合并上行为不稳定。
%
% ⇒ 改为**物理隔离**:主表只到「合计」(27 行),签字栏用独立 tblr
% 紧贴在下方,视觉上是同一张表(边框对接、列宽对齐),
% 但排版上互不干扰。这是最稳的做法。
%
% 对齐要点:签字表的列宽必须让「3 列 : 4 列」的分界点与主表一致,
% 所以用主表前 3 列宽度之和 与 后 4 列宽度之和 作为两列宽度。
% 主表列宽 6.10 / 29.65 / 11.43 / 18.18 / 29.65 / 3.00 / 40.10
% 前 3 列 = 6.10+29.65+11.43 = 47.18mm,加两侧 colsep 3×2 = 53.18mm
% 后 4 列 = 18.18+29.65+3.00+40.10 = 91.02mm,加 colsep 4×2 = 99.02mm
% ⚠️ 签字表只有 2 列,colsep 共 4 个,需重新配平(见下方计算)。
%======================================================================
\newenvironment{oucmeetsign}{%
\par\begingroup\Mn
\begin{tblr}[label=none]{
colspec={Q[l,m,wd=51.71mm] Q[l,m,wd=97.63mm]},
colsep=1.0mm, rowsep=0pt, stretch=0,
hline{1-Z}={0.5pt}, vline{1-Z}={0.5pt},
row{1-Z}={ht=5.6mm, font=\Mn, valign=m, halign=l},
}%
}{%
\end{tblr}\par\endgroup}
%======================================================================
% 6. 标题与页首
%======================================================================
% 左上角「附件1」小字(无字号设置,随正文 9pt)
\newcommand{\oucmeetattach}[1]{%
\par\noindent{\Mn #1}\par\vspace*{4bp}}
% 标题:22pt 居中
\newcommand{\oucmeettitle}[1]{%
\par\begingroup\Mtw\heiti\centering #1\par\endgroup
\vspace*{8bp}}
% 填表日期 / 金额单位 那一行(左右分列,中间留白)
% 用一串空格撑开,这里用 \hfill 更稳
\newcommand{\oucmeetdateline}[1]{%
\par\noindent{\Mn #1}\par\vspace*{4bp}}
%======================================================================
% 6. 表尾说明
%
% ⚠️ 悬挂缩进不能用 \leftmargin=2em —— 实际报
% Overfull \hbox (26.71pt too wide)
% 因为「1、」「2、」是**全角字符 + 顿号**,9pt 下实际宽约 2.4em,
% 比 2em 宽,标签凸出到左边界外。⇒ \labelwidth 要给足 2.5em。
%
% ⚠️⚠️ \itemindent 不能设负值!
% 第一版写 \itemindent=-2.5em 想让「1、」顶格,结果整段被拉到
% x=65.95,而版心左界是 79.40 —— **说明文字跑到版心外左侧 13.45bp**,
% 且只报一个 5.1pt 的 Overfull(因为 \hbox 宽度的计算没把左溢算进去)。
% ⇒ 正确做法:\leftmargin 与 \labelwidth 相等,\itemindent=0,
% 标签自然落在左边界,「1、」后面直接接正文。
% \labelwidth 要 ≥ 标签实际宽度(「1、」9pt 全角约 2.4em),给 2.5em。
% 见下方 \oucmeetnote 的说明。环境只负责字号与上间距,不再用 list。
\newenvironment{oucmeetnotes}{%
\par\vspace*{2bp}\begingroup\Mn
}{\par\endgroup}
%----------------------------------------------------------------------
% 单条说明
%
% ⚠️ 为什么不用 list 环境:list 的 \leftmargin / \itemindent 组合极易
% 左外 13.45bp,日志里只有个无关的 5.1pt)。
%
% ⚠️ 也不要用 \hangindent 悬挂缩进。「2、」后面直接接正文,续行不需要
% 缩进;相反,\hangindent 会让续行可用宽度变窄,第 2 条
% (50 字,两行)因此溢出 5.1pt。
% ⇒ 就是普通的 \noindent + 段落,什么都不设。
%
% ⚠️⚠️ \tolerance / \emergencystretch 必须在**段落开始前**设置。
% 写成 `\noindent` 之后再改无效(\noindent 已开段落, 5.1pt
% 的 Overfull 纹丝不动)。
% ⇒ 这里用 \sloppy,它在内部改 \tolerance 和 \emergencystretch,
% 且必须在 \par 之前调用 —— 下面 #1#2 之前就调了,有效。
%
% ⚠️ 为什么会溢出:第 2 条说明正好 50 字,9pt 下版心一行放 49 字,
% 第 50 字「现」挤到第二行后,第一行欠宽极小、第二行只有「金;」
% 两个字,TeX 判定这比"溢出 5.1pt"更难看。\sloppy 允许更松的断行,
% 两害相权取其轻。这是内容长度与版心宽度的巧合冲突,不是排版错误。
%----------------------------------------------------------------------
\newcommand{\oucmeetnote}[2]{%
\par\noindent\sloppy #1#2\par
\vspace*{1bp}}
\endinput
Binary file not shown.
+197
View File
@@ -0,0 +1,197 @@
%======================================================================
% 中国海洋大学会议预算表(空表模板)
%
% 用途:演示 oucmeeting.sty 的用法,并作为可直接印刷使用的空表。
%
% 编译: xelatex 会议预算表.tex (单次即可)
%
% ⚠️ 这是**空表**。金额、卡号、日期、人名一律留空,供手填。
%
% ⚠️⚠️ 本文件的表格**只写内容,不写任何 \SetCell**。
% 所有合并规则都在 oucmeeting.sty 的 oucmeettable 环境里,
% 用 cell{行}{列}={c=n}{对齐} 矩阵式声明。
% 一写 \SetCell 就报一串 Missing number,且错误全指向 \end{tblr}。
% 详见 sty 第 4 节的记录。
%
% ⚠️ 被合并掉的格在内容里**留空**(写 `& &`),不要写 {}。
%
% 28 行的合并结构(行号 = 表格第几行,从 1 起):
% R1 会议名称 2+5
% R2 会议时间/地点 2+2+2+1
% R3 会议类型 2+5
% R4 参会人数 2+5
% R5 支出项目卡号 2+5
% R6 会议内容 2+5
% R7 会议收入预算 跨 7 列
% R8 收入表头 2+2+2+1
% R9 会务费收入 2+2+2+1
% R10 科研经费 2+2+2+1
% R11 财政拨款专项 2+2+2+1
% R12 学校预算经费 2+2+2+1
% R13 其他 2+2+2+1
% R14 合计 2+2+2+1
% R15 会议支出预算 跨 7 列
% R16 支出表头 3+2+2
% R17 专家咨询费 3+2+2
% R18 城市间交通费 3+2+2
% R19 住宿费 3+2+2
% R20 伙食费 3+2+2
% R21 其他费用/交通费 1+2+2+2
% R22 会议资料印刷费 1+2+2+2
% R23 会议室使用费 1+2+2+2
% R24 工作人员补助 1+2+2+2
% R25 其他 1+2+2+2
% R26 合计 3+2+2
% R27 意见栏 3+4
% R28 签字栏 3+4
%======================================================================
\documentclass[UTF8]{ctexart}
\usepackage{oucmeeting}
\begin{document}
\oucmeetattach{附件 1}
\oucmeettitle{中国海洋大学会议预算表}
\oucmeetdateline{填表日期:\hspace*{4em}年\hspace*{2em}月\hspace*{2em}日%
\hfill 金额单位:\hspace*{3em}元}
\begin{oucmeettable}
% ---- R1~R6 基本信息 ----
%
% ⚠️⚠️ 每行必须写满 7 段(6 个 `&`),被 cell{} 合并掉的格**留空**。
% 写 7 段 `甲 & & 乙 & & 丙 & & 丁` → 四个字全部正确
% 写 4 段 `甲 & 乙 & 丙 & 丁` → **乙、丁 被吞掉**
% ⇒ 段数 ≠ 列数时,多出来的内容会静默丢失,不报错。
%
% ⚠️ 标签落在哪一格,取决于 cell{} 的合并位置,不是"第几个字":
% R2 的 cell 配置是 2+2+2+1,即
% 格1(列1-2)=会议时间 格3(列3-4)=空值 格5(列5-6)=会议地点 格7(列7)=空值
% 所以「会议地点」必须写在**第 5 段**,写在第 3 段就会挤到左边、
会议名称 & & & & & & \\
会议时间 & & & & 会议地点 & & \\
% ⚠️ R3/R4 的填空横线用 \hspace 撑,宽度必须控制。
% 跨 5 列约 122mm,三个选项各带一对(\hspace{3em})就要 6×3em=18em
% 再加文字,撑到 529.7bp(版心止于 521.57),超 8bp。
% ⇒ 单个填空收到 2.2em(约 7mm,手写两三个字够用)。
会议类型 & & 国内业务会议(\hspace*{2.2em})\hspace*{1em}%
国内管理会议(\hspace*{2.2em})\hspace*{1em}%
在华举办国际会议(\hspace*{2.2em}) & & & & \\
参会人数 & & 总数\hspace*{2.2em}人\hspace*{1em}%
(其中参会代表\hspace*{2.2em}人;工作人员\hspace*{2.2em}人;%
外宾\hspace*{2.2em}人) & & & & \\
会议支出项目卡号 & & & & & & \\
会议内容 & & & & & & \\
% ---- R7~R14 收入预算 ----
\bfseries 会议收入预算 & & & & & & \\
收入项目 & & 项目经费卡号 & & 金额 & & 备注 \\
会务费收入 & & & & & & 每人\hspace*{2.5em}元 \\
科研经费 & & & & & & \\
财政拨款会议专项经费 & & & & & & \\
学校预算经费 & & & & & & \\
其他 & & & & & & \\
合计 & & & & & & \\
% ---- R15~R26 支出预算 ----
\bfseries 会议支出预算 & & & & & & \\
支出项目 & & & 预算金额 & & 实际支出金额(由财务处填写) & \\
专家咨询费(含讲课及评审费) & & & & & & \\
专家城市间交通费 & & & & & & \\
住宿费 & & & & & & \\
伙食费 & & & & & & \\
% R21~R25:「其他费用」**逐字竖排**,占 5 行高(不是旋转 90°)
% 纵向合并由 sty 里的 cell{21}{1}={r=5}{c} 声明,
% 这里用 \shortstack 让四个字上下堆叠。
% ⚠️ 不能用 \rotatebox{90}:那只是把横排整句转个角度,
% 不是"上下排列"(修正)。
% ⚠️ \shortstack 里的 \\ 是**普通换行**,tabularray 在 cell{} 语法下
% 不会把它误当行结束(旧版 \SetCell 语法下会崩,那是另一个坑)。
%
% ★ 字距取 4bp:文字块约 56bp,格高 82bp → **上下各留 13bp**,
% 既不贴格线,也能看出竖排拉开的效果。
%
% ⚠️⚠️ 字距不能给太大,会顶到格线。(9pt 字、格高 82bp):
% \\[17bp] → 文字块 94bp,**比格高还高**,头尾字距格线只有
% \\[8bp] → 文字块 67bp,上下各留 7.4bp ← 仍偏挤
% \\[4bp] → 文字块 56bp,上下各留 13bp ← 采用
% 不加参数 → 文字块 43bp,上下各留 19bp(字挤成一小团,不算竖排)
%
% ⚠️ 不能靠局部设 \baselineskip —— \shortstack 内部会重置它,
% 实际设 19bp 无效(字距仍是 11.6bp)。必须在 \\ 上给可选参数。
% ⚠️ 也不能用 \parbox{}{其\\他\\费\\用} —— 会变成 4 个独立行盒子,
% tabularray 排版错乱,四个字跑到不同段落(实际)。
\shortstack{其\\[4bp]他\\[4bp]费\\[4bp]用} & 交通费 & & & & & \\
& 会议资料印刷费 & & & & & \\
& 会议室使用费 & & & & & \\
& 工作人员补助 & & & & & \\
& 其他 & & & & & \\
合计 & & & & & & \\
% R27~R28 意见与签字(跨 3+4)
% ⚠️⚠️ 这里的 \hspace 会把**单元格撑宽,进而把表格右边框推出纸外**,
% 而且文字本身仍在版心内 —— 所以逐 span 查文字查不出来,
% 只有查竖线坐标才能发现(实际最右竖线跑到 526.40,版心止于 521.57)。
% 实际数据:\hspace*{7em} → 超 4.83bp;4.5em → 仍超 4.83bp(跨列宽度已定死,
% hspace 只是让内容溢出单元格,不改列宽)。
% ⇒ 该单元格内容必须能在一行内放下。「(签字) (盖章)」共 9 个全角字符
% ≈ 9×9bp = 81bp,跨 4 列约 96mm = 272bp,够放,只要 hspace 不太大。
% 给 3em(约 9.5mm)即可,手写签名空间足够。
%
% ⚠️ 关于「校级领导意见」:源 .doc 的 R26 第二格里确实有**两个段落** ——
% 「所在单位负责人意见:」和「校级领导意见:」,不是转换时多出来的
% (用 LibreOffice 直接转 txt 核过,原文件就有)。
% 但用户确认这份表不需要校级领导,故删除。
% ⚠️ 要恢复就把它加回来,且必须单独一行(源文件是两段,不是一行):
% 所在单位负责人意见:\\ 校级领导意见:
%
% ⚠️⚠️ 这两行必须写 **7 段(6 个 `&`)**,与 colspec 的 7 列严格对应。
%
% ======================================================================
% R27/R28 意见与签字 —— **已移出主表**,改用下方独立的 oucmeetsign 环境
%
% ⚠️⚠️ 为什么拆出去(很重要,别又改回主表里)
%
% 这两行放在主表里,无论怎么写都会出问题。四种组合全部实际过:
% 内容 8 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)❌
% 内容 7 段 + cell{27}{4}={c=4} → 右侧多一列(9 条竖线)❌
% 内容 2 段 + cell{27}{4}={c=4} → 列数对了,但第 2 段落进第 2 列
% 被 c=4 的合并盖住,内容消失 ❌
% 内容 2 段 + cell{27}{2}={c=6} → 网格散架(3 页、横线全无)❌
%
% 根因:tabularray 2022A 对「跨整行的大合并」处理不稳定,
% 要求"段数 / 起始列 / 跨度"三者严格自洽,而本表列宽固定 + colsep
% 的组合下很难同时满足。
%
% ⇒ 拆成独立小表,视觉上是同一张表(边框对接、列宽按 3:4 配平),
% 排版上互不影响。**这是唯一稳定方案,不要合并回去。**
\end{oucmeettable}
% ---- 签字栏(独立表,紧贴主表下方)----
% 列宽按主表 3 列 : 4 列 的分界配平:
% 前 3 列 6.10+29.65+11.43 = 47.18mm(+colsep 4mm)
% 后 4 列 18.18+29.65+3.00+40.10 = 91.02mm(+colsep 4mm)
% ⚠️ 两列各自的 colsep 各算 2 个(左右各 1),所以实际宽度 = wd + 4mm
% ⚠️⚠️ 第 1 格不要用 \hfill 推「(签字)」到右边 —— 实际会溢出格子:
% 第 1 格宽 51.71mm=146bp,「(签字)」36bp,\hfill 推到格尾后
% 文字自身**超出单元格右边界**(tabularray 的格内容不自动裁剪),
% 结果第一个「(签字)」跑到 199~265,跨过 232 的分界线,
% 和第二个「(签字)」连成一串(看着像只有一个)。
% ⇒ 直接顶着格左边界排,前面补一点 \hspace 抵消全角括号的字形左空白。
% (全角「(」的 ink 起点比盒起点靠左约 2.5bp,不加会略微超出
% 版心左界 79.40 —— 实际x=76.9)
\begin{oucmeetsign}
经费(项目)负责人意见: & 所在单位负责人意见: \\
\hspace*{1mm}(签字) & \hspace*{1mm}(签字)\hspace*{5em}(盖章) \\
\end{oucmeetsign}
\begin{oucmeetnotes}
\oucmeetnote{1、}{会议借款和报销应按会议预算执行,如突破预算总额,须按原程序审批;}
\oucmeetnote{2、}{收取会务费时按要求给会议代表开具发票,收取的会务费及发票存根和记账联统一交财务处入账,不得坐支现金;}
\oucmeetnote{3、}{会议费开支实行定额控制,标准参照《中国海洋大学会议费管理办法》。}
\end{oucmeetnotes}
\end{document}
+61 -142
View File
@@ -1,177 +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 ×}位研究生参与《{\songti ×××}》项目的研究工作。} 聘请{\songti 李承宇}等{\songti 2}位研究生参与……}
``` ```
### 关于 `\lwwork` 的句式 | 参数 | 说明 |
|---|---|
| `\lwunit` | 用工单位(学部/学院) |
| `\lwreason` | 用工事由 |
| `\lwnote` | 备注,可留空 |
| `\lwwork` | 用工说明正文,即表格中「工作内容」一栏 |
原文是「聘请秦依康等 2 位研究生参与《观测数据驱动的渤海生态系统健康评估 参数值里用 `{\songti ...}` 包裹是为了指定字体,可去掉。
关键技术研发》项目的研究工作。」——真人姓名、人数、真实项目名已替换为
`×××` / `×`,**句式一字未动**。填表时把三处 `×` 换成实际内容即可:
| 占位 | 换成 | ## 表格结构
| :-- | :-- |
| 第一个 `×××` | 第一位研究生的姓名("等"字后面若只有一人,可删"等×位") |
| `×`(位) | 研究生人数 |
| 《`×××`》 | 项目全称 |
## 版式数据来源 | 行 | 内容 |
|---|---|
| R0 | 用工单位(盖章) + 单位名称 |
| R1–R3 | 用工事由 + 工作内容 + 备注 |
| R4 | 三处签字:批准单位负责人 / 用工单位负责人 / 经办人 |
全部尺寸从原 `.docx` 的 OOXML 里量出来,换算关系: ## 改表格内文字
- 长度:`mm = twips ÷ 1440 × 25.4`,`pt = twips ÷ 20` 正文在 `\begin{lwtable}` 与 `\end{lwtable}` 之间。每行写满 4 个格子(3 个 `&`)
- 字号:`w:sz` 是半磅值,`sz=28` ⇒ 14 pt 加结尾 `\\`。跨度已固定在 `ouclw.sty` 里,不用管。
- 行距:`docGrid linePitch=312` twips ⇒ 15.6 pt
| 项目 | docx 原值 | 换算 | 合并格里的文字**必须用 `\lwfit` 或 `\lwcell` 等定宽盒子包起来**:
| :-- | :-- | :-- |
| 纸张 | `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。
+16 -18
View File
@@ -2,7 +2,7 @@
% ouclw.sty — 中国海洋大学 劳务发放说明表 版式包 % ouclw.sty — 中国海洋大学 劳务发放说明表 版式包
% %
% 依据:实验室管理/劳务补贴/劳务发放说明表.docx(Word 2007+ 保存) % 依据:实验室管理/劳务补贴/劳务发放说明表.docx(Word 2007+ 保存)
% 目标:版式与原 docx 逐项对齐。所有尺寸都由 docx 内部数值换算: % 目标:版式与逐项对齐。所有尺寸都由 docx 内部数值换算:
% twips → mm : mm = twips / 1440 * 25.4 % twips → mm : mm = twips / 1440 * 25.4
% twips → pt : pt = twips / 20 (1 pt = 1/72 in) % twips → pt : pt = twips / 20 (1 pt = 1/72 in)
% w:sz : 半磅值,÷ 2 即 pt % w:sz : 半磅值,÷ 2 即 pt
@@ -20,7 +20,7 @@
%====================================================================== %======================================================================
% 1. 页面与版心 % 1. 页面与版心
% %
% 原 docx sectPr: % sectPr:
% pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4 % pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4
% pgMar top/bottom 1361 = 24.01 mm % pgMar top/bottom 1361 = 24.01 mm
% left/right 1797 = 31.70 mm % left/right 1797 = 31.70 mm
@@ -30,7 +30,7 @@
% 原表 tblW 8522 twips = 150.32 mm,比 docx 版心(146.68 mm)宽 3.71 mm。 % 原表 tblW 8522 twips = 150.32 mm,比 docx 版心(146.68 mm)宽 3.71 mm。
% docx 的 tblPr 里【没有 jc】,tblInd = 0 ⇒ Word 是按左对齐处理的: % docx 的 tblPr 里【没有 jc】,tblInd = 0 ⇒ Word 是按左对齐处理的:
% 表从左边距 31.70 mm 起排,右端溢出到右侧页边距里 3.71 mm。 % 表从左边距 31.70 mm 起排,右端溢出到右侧页边距里 3.71 mm。
% 实测原表左右边距就是 pgMar 的 1797 twips = 31.70 mm,并不对称。 % 实际原表左右边距就是 pgMar 的 1797 twips = 31.70 mm,并不对称。
% %
% ⇒ 本包照实复现这个“不对称”: % ⇒ 本包照实复现这个“不对称”:
% left = 31.70 mm (= docx pgMar left) % left = 31.70 mm (= docx pgMar left)
@@ -57,7 +57,7 @@
} }
\setlength{\parindent}{0pt} \setlength{\parindent}{0pt}
\setlength{\parskip}{0pt} \setlength{\parskip}{0pt}
\pagestyle{empty} % 原 docx 无页眉页脚,故不排页码 \pagestyle{empty} % 无页眉页脚,故不排页码
%====================================================================== %======================================================================
% 2. 字体与字号 % 2. 字体与字号
@@ -72,7 +72,7 @@
% ⚠️⚠️⚠️【最要命的一条】ctex 默认 \linespread 约 1.3,会把 % ⚠️⚠️⚠️【最要命的一条】ctex 默认 \linespread 约 1.3,会把
% \fontsize{14}{15.6} 的 15.6pt 行距放大成 20.28pt! % \fontsize{14}{15.6} 的 15.6pt 行距放大成 20.28pt!
% %
% 实测: %
% \fontsize{14}{15.6}\selectfont → \baselineskip = 20.28pt ✗ % \fontsize{14}{15.6}\selectfont → \baselineskip = 20.28pt ✗
% 加 \linespread{1} 之后 → \baselineskip = 15.60pt ✓ % 加 \linespread{1} 之后 → \baselineskip = 15.60pt ✓
% %
@@ -85,7 +85,6 @@
% 归 1。这一步不能省,也必须在 \AtBeginDocument 之后再设一次 % 归 1。这一步不能省,也必须在 \AtBeginDocument 之后再设一次
% (ctex 在 begin document 时会重设)。 % (ctex 在 begin document 时会重设)。
% %
% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的
% SimSun / SimHei / FangSong + AutoFakeBold,换台机器(尤其 Linux/macOS) % SimSun / SimHei / FangSong + AutoFakeBold,换台机器(尤其 Linux/macOS)
% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。 % 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。
%====================================================================== %======================================================================
@@ -106,7 +105,7 @@
%====================================================================== %======================================================================
% 3. 列的宽度模型 % 3. 列的宽度模型
% %
% 原 docx tblGrid(4 个网格列,twips → mm): % tblGrid(4 个网格列,twips → mm):
% c1 1384 → 24.4122 c2 1418 → 25.0119 % c1 1384 → 24.4122 c2 1418 → 25.0119
% c3 2883 → 50.8529 c4 2837 → 50.0415 % c3 2883 → 50.8529 c4 2837 → 50.0415
% 合计 8522 twips = 150.3186 mm(与 tblW 一致) % 合计 8522 twips = 150.3186 mm(与 tblW 一致)
@@ -134,11 +133,10 @@
% wd = gridCol(mm) − 3.81 − 0.2204 % wd = gridCol(mm) − 3.81 − 0.2204
% %
% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差, % ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
% 实测需再微调(见 3.2 的实测标定值),否则一直报 % 实际需再微调(见 3.2 的标定值),否则一直报
% “Table width is too small, need 0.45pt more!” 外加一条 Overfull \hbox。 % “Table width is too small, need 0.45pt more!” 外加一条 Overfull \hbox。
% %
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% ⚠️ 两条通用结论(在 年度考核登记表/ 里踩过,这里同样适用):
% %
% (a) 合并单元格 cell{r}{c}={c=n}{c} 的单元类型 {c} 是【不折行的 LR 模式】。 % (a) 合并单元格 cell{r}{c}={c=n}{c} 的单元类型 {c} 是【不折行的 LR 模式】。
% 格内文字若比所跨各列合计更宽,它不会在列内折行,而是【把这些列撑宽】, % 格内文字若比所跨各列合计更宽,它不会在列内折行,而是【把这些列撑宽】,
@@ -185,7 +183,7 @@
%====================================================================== %======================================================================
% 4. 行高 % 4. 行高
% %
% 原 docx 各行【没有 trHeight】,高度全由段数决定 % 各行【没有 trHeight】,高度全由段数决定
% (每段 = 1 个行距 15.6 pt): % (每段 = 1 个行距 15.6 pt):
% R0 2 段 → 31.2 pt = 11.01 mm % R0 2 段 → 31.2 pt = 11.01 mm
% R1 1 段 → 15.6 pt = 5.50 mm % R1 1 段 → 15.6 pt = 5.50 mm
@@ -194,7 +192,7 @@
% R4 2 段 → 31.2 pt = 11.01 mm % R4 2 段 → 31.2 pt = 11.01 mm
% 合计 280.8 pt = 99.06 mm % 合计 280.8 pt = 99.06 mm
% %
% ⚠️ tabularray 的 ht= 经实测同为“最小行高”,与 Word 的 atLeast 语义一致。 % ⚠️ tabularray 的 ht= 经实际同为“最小行高”,与 Word 的 atLeast 语义一致。
% 本表直接把这些值写成 ht=,行高即固定;内容更多的行会自然长高。 % 本表直接把这些值写成 ht=,行高即固定;内容更多的行会自然长高。
%====================================================================== %======================================================================
@@ -251,7 +249,7 @@
% %
% ⚠️⚠️ 这里【必须】保持 \parbox 默认的 [c],不要改成 [t]。 % ⚠️⚠️ 这里【必须】保持 \parbox 默认的 [c],不要改成 [t]。
% 原因:tabularray 会给每个单元格垫一个 strut,[t] 生成的盒子顶部 % 原因:tabularray 会给每个单元格垫一个 strut,[t] 生成的盒子顶部
% 与 strut 顶部相加,实测每行白白多出 3.6pt(R0 从 31.67 → 35.26)。 % 与 strut 顶部相加,每行白白多出 3.6pt(R0 从 31.67 → 35.26)。
% %
% docx 里 R0C1 / R2C1 / R4C1 都没有 <w:vAlign>(按 OOXML 语义是顶部对齐), % docx 里 R0C1 / R2C1 / R4C1 都没有 <w:vAlign>(按 OOXML 语义是顶部对齐),
% 但它们靠【段落数把行高填满】实现“贴顶”: % 但它们靠【段落数把行高填满】实现“贴顶”:
@@ -278,12 +276,12 @@
% %
% ⚠️ R3 第一格是合并格(c1-c2),另外两格是普通列。tabularray 对这两种格 % ⚠️ R3 第一格是合并格(c1-c2),另外两格是普通列。tabularray 对这两种格
% 的垂直居中算法【不一样】:合并格内容整体偏低 1.55 pt。 % 的垂直居中算法【不一样】:合并格内容整体偏低 1.55 pt。
% 三个格分别裸写内容时,实测基线为 % 三个格分别裸写内容时,基线为
% 批准单位负责人签字 y = 280.65 % 批准单位负责人签字 y = 280.65
% 用工单位负责人签字 y = 279.10 % 用工单位负责人签字 y = 279.10
% 经办人签字 y = 279.10 % 经办人签字 y = 279.10
% 肉眼勉强看得出参差。把所有格都包成【同一种】\parbox 后, % 肉眼勉强看得出参差。把所有格都包成【同一种】\parbox 后,
% 垂直居中的对象变成同一个盒子高度,三格自然对齐(实测 y 完全相同)。 % 垂直居中的对象变成同一个盒子高度,三格自然对齐(实际y 完全相同)。
% 故本表三个签字格一律走这个宏。 % 故本表三个签字格一律走这个宏。
%---------------------------------------------------------------------- %----------------------------------------------------------------------
\newcommand{\lwsign}[2]{% \newcommand{\lwsign}[2]{%
@@ -307,10 +305,10 @@
% 空段落:\lwblank{n} ⇒ 追加 n 个空行 % 空段落:\lwblank{n} ⇒ 追加 n 个空行
% %
% ⚠️ 不要用 \par\null:实测在 tabularray 单元格里,9 个 \par\null 会排成 % ⚠️ 不要用 \par\null:实际在 tabularray 单元格里,9 个 \par\null 会排成
% 192.07pt,而 docx 里 9 个空段落只有 140.4pt。原因是 \null 是一个 % 192.07pt,而 docx 里 9 个空段落只有 140.4pt。原因是 \null 是一个
% 有高度的盒子,每个都按“汉字 + 行距”算钱;Word 的空段落只贡献行距。 % 有高度的盒子,每个都按“汉字 + 行距”算钱;Word 的空段落只贡献行距。
% ⇒ 行高统一交给 tabularray 的 ht=(实测 ht=49.53mm 排出 140.73pt,与 % ⇒ 行高统一交给 tabularray 的 ht=(实际ht=49.53mm 排出 140.73pt,与
% docx 的 140.4pt 差 0.33pt,可忽略),本宏只用于确有需要的场合。 % docx 的 140.4pt 差 0.33pt,可忽略),本宏只用于确有需要的场合。
\newcommand{\lwblank}[1]{% \newcommand{\lwblank}[1]{%
\par \par
@@ -322,7 +320,7 @@
%====================================================================== %======================================================================
% 8. 表外标题 % 8. 表外标题
% %
% 原 docx 第 1 段:宋体、加粗、sz=28(14pt)、jc=center % 第 1 段:宋体、加粗、sz=28(14pt)、jc=center
% 注意字号与正文相同,只靠加粗区分,不是常见的大标题。 % 注意字号与正文相同,只靠加粗区分,不是常见的大标题。
%====================================================================== %======================================================================
\newcommand{\lwtitle}{% \newcommand{\lwtitle}{%
@@ -335,7 +333,7 @@
%====================================================================== %======================================================================
% 9. 表后空行 % 9. 表后空行
% %
% 原 docx 表格之后还有一个 jc=center 的空段落。 % 表格之后还有一个 jc=center 的空段落。
%====================================================================== %======================================================================
\newcommand{\lwtail}{\par\null\par} \newcommand{\lwtail}{\par\null\par}
Binary file not shown.
@@ -15,16 +15,16 @@
%====================================================================== %======================================================================
% 1. 表格内容(填表时只改这一段) % 1. 表格内容(填表时只改这一段)
%====================================================================== %======================================================================
\newcommand{\lwunit}{{\songti ××××××××}} % 用工单位(学部/学院) \newcommand{\lwunit}{{\songti 信息科学与工程学部}} % 用工单位(学部/学院)
\newcommand{\lwreason}{{\songti ××××}} % 用工事由 \newcommand{\lwreason}{{\songti 科研项目数据整理}} % 用工事由
\newcommand{\lwnote}{} % 备注(可留空) \newcommand{\lwnote}{} % 备注(可留空)
% 劳务人员从事的具体工作。 % 劳务人员从事的具体工作。
% ⚠️ 原来写的是“聘请秦依康等 2 位研究生参与《观测数据驱动的渤海生态系统 % ⚠️ 本文件已填入**虚构示例**(姓名、人数、项目名均系编造),仅演示一份
% 健康评估关键技术研发》项目的研究工作。”——真人姓名与真实项目名已换成 % 填好的表长什么样。实际使用时整段替换成自己的人员与项目。
% × 占位,句式保持不变。
\newcommand{\lwwork}{% \newcommand{\lwwork}{%
聘请{\songti ×××}等{\songti ×}位研究生参与《{\songti ×××}》项目的研究工作。} 聘请{\songti 李承宇}等{\songti 2}位研究生参与《{\songti 近岸海域生态健康
多源数据融合与智能评估技术}》项目的研究工作。}
%====================================================================== %======================================================================
% 2. 正文 % 2. 正文
@@ -46,10 +46,9 @@
\begin{lwtable} \begin{lwtable}
%---- R0 用工单位 | 单位名 --------------------------------------------- %---- R0 用工单位 | 单位名 ---------------------------------------------
% docx 里两格都是 2 段:C0 “用工单位”/“(公章)”,C1 单位名 + 1 个空段。 % 两格都是 2 段:左格「用工单位」+「(公章)」,右格单位名 + 1 个空段。
% 两格内容都刚好填满行高 ⇒ vAlign 取 center 还是 top 结果相同。 % ⚠️ 右格的空段必须补出来,否则只剩 1 段(高 12.6pt),会被 m 居中
% ⚠️ 必须把那个空段补出来,否则 C1 只剩 1 段(高 12.6pt),会被 % 到格子中部,单位名比左格低约 7mm。
% m 居中到格子中部,单位名比 C0 低 7mm 左右。
用工单位\par (公章) 用工单位\par (公章)
& \lwcellv{\lwunit\lwblank{1}} & \lwcellv{\lwunit\lwblank{1}}
& & \\ & & \\
+81 -117
View File
@@ -1,154 +1,118 @@
# 年度考核登记表 — 中国海洋大学 教职工年度考核登记表(LaTeX 版) # 年度考核登记表
把学校下发的 Word 版《中国海洋大学教职工年度考核登记表》复刻为 LaTeX 模板, 中国海洋大学教职工年度考核登记表,A4 单页。
版式与原 `.docx` 逐项对齐,**表格里不含任何真人信息**(姓名/职工号/出生年月/
单位/岗位一律 `×` 占位)。
## 文件
| 文件 | 说明 |
| :-- | :-- |
| `年度考核登记表.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} % 表头“×××× 年度”那一行 \khtbyear{2025} % 考核年度,显示为表外标题的一部分
\newcommand{\khnum}{0000000} % 职工号 \newcommand{\khnum} {0000000} % 职工号
\newcommand{\khname}{{\fangsong ××}} % 姓名 \newcommand{\khname} {{\fangsong 张远航}} % 姓名
\newcommand{\khsex}{{\fangsong ×}} % 性别 \newcommand{\khsex} {{\fangsong 男}} % 性别
\newcommand{\khbirth}{{\fangsong ××××.××}} % 出生年月 \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 教授三级}} % 所聘岗位
``` ```
> **`{\fangsong ...}` 不能去掉。** 占位符 `×` 是 U+00D7,xeCJK 默认按 Unicode | 参数 | 说明 |
> 区段把它判成**西文**,交给 fontspec 的西文字体(Termes/Times),而那儿的 |---|---|
> `×` 宽度与汉字不一致,几个就能撑破整列。 | `\khtbyear{年}` | 考核年度 |
> | `\khnum` | 职工号 |
> **更好的做法**:`../fonts.tex` 里已经全局加了 | `\khname` | 姓名 |
> `\xeCJKDeclareCharClass{CJK}{"00D7}`,把 `×` 归入 CJK 字符类 —— | `\khsex` | 性别 |
> 于是它自动按汉字全角宽度排,**不必再包 `\fangsong` 也不会撑破**。 | `\khbirth` | 出生年月 |
> 这是本次字体改造顺带修掉的老 bug(原注释的修法从未真正生效过)。 | `\khdept` | 单位(学部/学院) |
| `\khsubdept` | 系、研究所、实验室、科室 |
| `\khparty` | 政治面貌 |
| `\khtitle` | 现专业技术职务 |
| `\khpost` | 所聘岗位 |
### 年度总结 参数值里的 `{\fangsong ...}` 是指定字体,可去掉换成其他字族。
## 年度总结正文
```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,单页
1. **合并单元格不折行。** `cell{r}{c}={c=n}{c}` 的单元类型 `{c}` 是 LR 模式, 表格行高按原表设定,年度总结格为高行
格子里的文字比所跨各列合计更宽时,它**不折行,而是把列撑宽、整表超出版心**。
实测「系(研究所、实验室、科室)」把表从 448 pt 撑到 559 pt。
→ 所以合并格里的文字一律包 `\khtbfit{跨度宽宏}{文字}`。
单列的 `Q[c,m,wd=…]` 没有这个问题(超了只是溢出,列宽不变)。
2. **合并格里的 `\hsize` 没被重设。** span=10 的格子里 `\hsize` 仍是整页版心宽,
长文本会按 450 pt 折行、冲出格子。→ 长内容必须用定宽 `\parbox`(`\khtbcell`)。
3. **跨度声明只有 `{c=n}{c}` 一种写法。** `={c=n}`、`={n}{c}`、`={span=n}{c}`
都不认,最后那个会报 `The key 'tblr-cell-span/span' is unknown`。
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` 累积误差而取整所致,肉眼不可辨)。
+38 -36
View File
@@ -2,7 +2,7 @@
% ouckhtb.sty — 中国海洋大学 教职工年度考核登记表 版式包 % ouckhtb.sty — 中国海洋大学 教职工年度考核登记表 版式包
% %
% 依据:2025 年学校下发的 Word 表(WPS 保存的 .docx) % 依据:2025 年学校下发的 Word 表(WPS 保存的 .docx)
% 目标:版式与原 docx 逐项对齐。所有尺寸都由 docx 内部数值换算而来: % 目标:版式与逐项对齐。所有尺寸都由 docx 内部数值换算而来:
% twips → mm : mm = twips / 1440 * 25.4 % twips → mm : mm = twips / 1440 * 25.4
% twips → pt : pt = twips / 20 (1pt = 1/72in) % twips → pt : pt = twips / 20 (1pt = 1/72in)
% w:sz : 半磅值,÷2 即 pt % w:sz : 半磅值,÷2 即 pt
@@ -20,7 +20,7 @@
%====================================================================== %======================================================================
% 1. 页面与版心 % 1. 页面与版心
% %
% 原 docx sectPr: % sectPr:
% pgSz 11907 × 16840 twips = 210.03 × 297.04 mm → A4 % pgSz 11907 × 16840 twips = 210.03 × 297.04 mm → A4
% pgMar top/bottom 1418 = 25.01 mm % pgMar top/bottom 1418 = 25.01 mm
% left/right 1701 = 30.00 mm % left/right 1701 = 30.00 mm
@@ -62,7 +62,6 @@
% R1C6 的括注 仿宋 12pt (w:sz=24),只有“研究所、实验室、科室” % R1C6 的括注 仿宋 12pt (w:sz=24),只有“研究所、实验室、科室”
% 页脚页码 9pt (footer 样式 w:sz=18) % 页脚页码 9pt (footer 样式 w:sz=18)
% %
% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的
% FangSong / SimHei / SimSun + AutoFakeBold,换台机器(尤其 Linux/macOS) % FangSong / SimHei / SimSun + AutoFakeBold,换台机器(尤其 Linux/macOS)
% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。 % 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。
%====================================================================== %======================================================================
@@ -89,7 +88,7 @@
%====================================================================== %======================================================================
% 3. 列的宽度模型(本包最关键的一节,改之前请先读完) % 3. 列的宽度模型(本包最关键的一节,改之前请先读完)
% %
% 原 docx tblGrid(11 个网格列,twips → mm): % tblGrid(11 个网格列,twips → mm):
% c1 1087→19.17 c2 283→ 4.99 c3 1221→21.54 % c1 1087→19.17 c2 283→ 4.99 c3 1221→21.54
% c4 1047→18.47 c5 284→ 5.01 c6 1105→19.49 % c4 1047→18.47 c5 284→ 5.01 c6 1105→19.49
% c7 952→16.79 c8 600→10.58 c9 870→15.35 % c7 952→16.79 c8 600→10.58 c9 870→15.35
@@ -103,7 +102,7 @@
% R3~R8 1,10 (2 个单元:标签 + 内容栏) % R3~R8 1,10 (2 个单元:标签 + 内容栏)
% %
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% ⚠️⚠️ 四条实测结论(tabularray 2022A),决定了下面的写法: % ⚠️⚠️ 四条实际结论(tabularray 2022A),决定了下面的写法:
% %
% (a) tabularray 的 wd 是“内容宽”,不含任何内边距;表宽 = Σwd + 竖线宽。 % (a) tabularray 的 wd 是“内容宽”,不含任何内边距;表宽 = Σwd + 竖线宽。
% 而 Word 的 gridCol 是“含内边距的整格宽”。两者语义相反。 % 而 Word 的 gridCol 是“含内边距的整格宽”。两者语义相反。
@@ -114,7 +113,7 @@
% 而 ΣgridCol = 158.3267mm,故每列要减 (158.3267−156.3938)/11 % 而 ΣgridCol = 158.3267mm,故每列要减 (158.3267−156.3938)/11
% = 0.1757mm。(gridCol − 0.1757) 即下面 3.1 节的取值。 % = 0.1757mm。(gridCol − 0.1757) 即下面 3.1 节的取值。
% %
% ⚠️ 曾经取 0.1917mm(按 12 根竖线 6pt 算),表宽少 0.5pt, % ⚠️ 曾取 0.1917mm(按 12 根竖线 6pt 算),表宽少 0.5pt,
% longtblr 会一直报 “Table width is too small, need 0.50008pt more!” % longtblr 会一直报 “Table width is too small, need 0.50008pt more!”
% 外加一条 0.5pt 的 Overfull \hbox。差得极小但很碍眼,故校正。 % 外加一条 0.5pt 的 Overfull \hbox。差得极小但很碍眼,故校正。
% %
@@ -125,19 +124,18 @@
% 窄列标签(如“出生年月”)在 Word 里本来就要折成两行,观感一致。 % 窄列标签(如“出生年月”)在 Word 里本来就要折成两行,观感一致。
% %
% (c) ⚠️ 合并单元格(\SetCell[c=n])里的 \hsize【没有】被重设成该跨度的 % (c) ⚠️ 合并单元格(\SetCell[c=n])里的 \hsize【没有】被重设成该跨度的
% 宽度,它仍是外层版心宽。实测:span=10 的格子里 \linewidth=47.8pt % 宽度,它仍是外层版心宽。span=10 的格子里 \linewidth=47.8pt
% 但 \hsize=450.5pt,于是长文本按 450pt 折行、彻底冲出格子 % 但 \hsize=450.5pt,于是长文本按 450pt 折行、彻底冲出格子
% (这就是曾经那个 “Overfull \hbox (1644pt too wide)” 的真正来源)。
% ⇒ 凡是内容较长或含多段的跨列单元格,必须用固定宽的 \parbox 包起来。 % ⇒ 凡是内容较长或含多段的跨列单元格,必须用固定宽的 \parbox 包起来。
% %
% (d) ⚠️⚠️⚠️【最要命的一条】跨列合并格 cell{r}{c}={c=n}{c} 的单元类型 % (d) ⚠️⚠️⚠️【最要命的一条】跨列合并格 cell{r}{c}={c=n}{c} 的单元类型
% {c} 是【不折行的 LR 模式】。格内文字若比所跨各列的合计宽,它不会在 % {c} 是【不折行的 LR 模式】。格内文字若比所跨各列的合计宽,它不会在
% 列内折行,而是【把这些列撑宽】,整张表随之超出版心。 % 列内折行,而是【把这些列撑宽】,整张表随之超出版心。
% 实测:“系(研究所、实验室、科室)”共 12 字(14pt ≈ 168pt), % “系(研究所、实验室、科室)”共 12 字(14pt ≈ 168pt),
% 塞进 c6-c7(合计 35.90mm ≈ 101.8pt)后,c6-c7 被撑到 126.5pt, % 塞进 c6-c7(合计 35.90mm ≈ 101.8pt)后,c6-c7 被撑到 126.5pt,
% 整表由 448.3pt 涨到 558.9pt —— 正是那 111.6pt 的 Overfull \hbox。 % 整表由 448.3pt 涨到 558.9pt —— 正是那 111.6pt 的 Overfull \hbox。
% 而【单列】Q[c,m,wd=…] 没有这个问题:内容超出时只溢出、列宽不变 % 而【单列】Q[c,m,wd=…] 没有这个问题:内容超出时只溢出、列宽不变
% (实测在 10.39mm 的 c8 里写 4 个汉字,表宽仍为 448.3pt)。 % (实际在 10.39mm 的 c8 里写 4 个汉字,表宽仍为 448.3pt)。
% ⇒ 结论:**凡是对齐到合并/窄格里、又必须折行的文字,一律包 \parbox**。 % ⇒ 结论:**凡是对齐到合并/窄格里、又必须折行的文字,一律包 \parbox**。
% 本包为此给每个跨度备了常量与 \khtbfit 包装,见下面 3.2 节。 % 本包为此给每个跨度备了常量与 \khtbfit 包装,见下面 3.2 节。
%====================================================================== %======================================================================
@@ -176,7 +174,7 @@
\newcommand{\khtbspanH}{24.0856mm} % c5-c6 姓名值 / 性别值 \newcommand{\khtbspanH}{24.0856mm} % c5-c6 姓名值 / 性别值
% 右侧内容栏(c2-c11,跨 10 列)的可用宽 = 十列 wd 之和。 % 右侧内容栏(c2-c11,跨 10 列)的可用宽 = 十列 wd 之和。
% ⚠️ 不要再用“实测 \linewidth”得到的那个 379.65pt:它是带竖线、且被 % ⚠️ 不要再用“实际\linewidth”得到的那个 379.65pt:它是带竖线、且被
% xeCJK 行首调整过的结果,换算成 mm 后比真实格宽窄 7mm,会让签字横线 % xeCJK 行首调整过的结果,换算成 mm 后比真实格宽窄 7mm,会让签字横线
% 和勾选框提前收尾、右侧留出一大段空白。 % 和勾选框提前收尾、右侧留出一大段空白。
\newcommand{\khtbcellw}{137.0792mm} \newcommand{\khtbcellw}{137.0792mm}
@@ -184,12 +182,12 @@
%====================================================================== %======================================================================
% 4. 行高 % 4. 行高
% %
% 原 docx trHeight + hRule=atLeast(twips → mm): % trHeight + hRule=atLeast(twips → mm):
% R0 412→7.27 R1 460→8.11 R2 939→16.56 % R0 412→7.27 R1 460→8.11 R2 939→16.56
% R3 1261→22.24 R4 1252→22.08 R5 1009→17.80 % R3 1261→22.24 R4 1252→22.08 R5 1009→17.80
% R6 556→ 9.81 R7 1258→22.19 R8 1258→22.19 % R6 556→ 9.81 R7 1258→22.19 R8 1258→22.19
% %
% ⚠️ tabularray 的 ht= 经实测同为“最小行高”(ht=0pt 与 ht=5mm 同高, % ⚠️ tabularray 的 ht= 经实际同为“最小行高”(ht=0pt 与 ht=5mm 同高,
% ht=22mm 才撑开),与 Word 的 atLeast 语义一致 —— 内容多时行会自动 % ht=22mm 才撑开),与 Word 的 atLeast 语义一致 —— 内容多时行会自动
% 长高,与 Word 表现相同,无需额外处理。 % 长高,与 Word 表现相同,无需额外处理。
%====================================================================== %======================================================================
@@ -198,7 +196,7 @@
% 5. 表格环境 % 5. 表格环境
% %
% ⚠️⚠️ 必须用 longtblr 而不是 tblr: % ⚠️⚠️ 必须用 longtblr 而不是 tblr:
% 本表内容使总高远超一页可用高度(原 docx 也是 2 页)。而 tblr 是 % 本表内容使总高远超一页可用高度(也是 2 页)。而 tblr 是
% 一整块不可分割的盒子 —— 装进 \setbox 后报 Overfull \vbox (140pt), % 一整块不可分割的盒子 —— 装进 \setbox 后报 Overfull \vbox (140pt),
% 第 1 页只剩标题、表格整体被推到第 2 页。longtblr 才支持按行断页。 % 第 1 页只剩标题、表格整体被推到第 2 页。longtblr 才支持按行断页。
% %
@@ -213,9 +211,9 @@
% (所以上面 3.1 节的 \khtbwa… 只作文档用,不能拼进 colspec。) % (所以上面 3.1 节的 \khtbwa… 只作文档用,不能拼进 colspec。)
% %
% ⚠️⚠️⚠️ stretch=0 必须写:longtblr(与 tblr 不同)默认把各列按 \textwidth % ⚠️⚠️⚠️ stretch=0 必须写:longtblr(与 tblr 不同)默认把各列按 \textwidth
% 等比拉伸,实测 11 列 wd 合计 450.46pt 的表被拉成 467.16pt(+16.7pt), % 等比拉伸, 11 列 wd 合计 450.46pt 的表被拉成 467.16pt(+16.7pt),
% 表格右边界从 523.7pt 越到 540.4pt,压在页边距外。 % 表格右边界从 523.7pt 越到 540.4pt,压在页边距外。
% 加上 stretch=0 后实测宽 448.3pt,与版心严格一致。 % 加上 stretch=0 后实际宽 448.3pt,与版心严格一致。
% %
% ⚠️⚠️ 【易错点】单元格合并(跨度)全部写死在本环境里,用 % ⚠️⚠️ 【易错点】单元格合并(跨度)全部写死在本环境里,用
% cell{行}{列}={c=n}{c} % cell{行}{列}={c=n}{c}
@@ -223,7 +221,6 @@
% · \SetCell 之后要补若干个空 &,补几个取决于该格跨几列;一旦 % · \SetCell 之后要补若干个空 &,补几个取决于该格跨几列;一旦
% 某一个数错一位,同行后面所有单元格会整体错列到窄列(如 1.2mm % 某一个数错一位,同行后面所有单元格会整体错列到窄列(如 1.2mm
% 的 c10)里去,报出【每一行都超宽】的 Overfull,从行号上完全 % 的 c10)里去,报出【每一行都超宽】的 Overfull,从行号上完全
% 看不出是哪一行错了 —— 这个坑本包踩过。
% · cell{r}{c}={c=n}{c} 把跨度与数据行分离,每行老老实实写满 % · cell{r}{c}={c=n}{c} 把跨度与数据行分离,每行老老实实写满
% 11 个单元格,行列对应一目了然。 % 11 个单元格,行列对应一目了然。
% ⚠️ 正确写法只有 {c=n}{c};={c=n}、={n}{c}、={span=n}{c} 都不认。 % ⚠️ 正确写法只有 {c=n}{c};={c=n}、={n}{c}、={span=n}{c} 都不认。
@@ -255,25 +252,31 @@
row{1}={ht=7.27mm}, row{2}={ht=8.11mm}, row{3}={ht=16.56mm}, row{1}={ht=7.27mm}, row{2}={ht=8.11mm}, row{3}={ht=16.56mm},
row{4}={ht=22.24mm}, row{5}={ht=22.08mm}, row{6}={ht=17.80mm}, row{4}={ht=22.24mm}, row{5}={ht=22.08mm}, row{6}={ht=17.80mm},
row{7}={ht=9.81mm}, row{8}={ht=22.19mm}, row{9}={ht=22.19mm}, row{7}={ht=9.81mm}, row{8}={ht=22.19mm}, row{9}={ht=22.19mm},
%---- R0 职工号|值|姓名|值|性别|值|出生年月|值
cell{1}{1}={c=2}{c}, cell{1}{5}={c=2}{c}, cell{1}{10}={c=2}{c},
%---- R1 单位|单位名|系(研究所、实验室、科室)|系名
cell{2}{1}={c=2}{c}, cell{2}{3}={c=3}{c},
cell{2}{6}={c=2}{c}, cell{2}{8}={c=4}{c},
%---- R2 政治面貌|值|现专业技术职务|值|所聘岗位|值
cell{3}{1}={c=2}{c}, cell{3}{4}={c=2}{c},
cell{3}{6}={c=2}{c}, cell{3}{8}={c=3}{c},
%---- R3~R8 竖排标签|内容栏
cell{4}{2}={c=10}{c}, cell{5}{2}={c=10}{c}, cell{6}{2}={c=10}{c},
cell{7}{2}={c=10}{c}, cell{8}{2}={c=10}{c}, cell{9}{2}={c=10}{c},
}% }%
}{% }{%
\end{longtblr}\par\endgroup} \end{longtblr}\par\endgroup}
%====================================================================== %======================================================================
% 6. 单元格内容包装(见 3 节结论 c 与 d) % 6. 单元格内容包装
% %
% 统一入口,.tex 里只用下面三个宏,不要直接把长文字写进 & 之间。 % ⚠️⚠️【跨列合并一律在数据行里用行内 \SetCell,不要用表头的 cell{r}{c}】
%
%
% 原先表头写的是:
% cell{1}{1}={c=2}{c}, cell{1}{5}={c=2}{c}, cell{1}{10}={c=2}{c},
% 数据行按 11 列老老实实写满 12 格,结果 **「出生年月」的值整格消失**,
% 日志零 error 零 warning,光看日志根本发现不了。
%
% 根因:tabularray 的 cell{r}{c}={c=n} 里那个 c 是【数据行的单元序号】,
% 不是视觉列号。三处 c=2 加起来让该行要吃掉 15 个视觉列,而表只有 11 列,
% 超出的部分被静默丢弃 —— 被丢的正好是最后一个值。
% 同一行写 12 格 → 丢值;写 10 格/9 格 → 反而显示(因为空缺让它
% 有余量)。所以「格子数对不对」在这里完全不能当判断依据。
%
% 正解:表头不写 cell{},合并直接标在被合并的那个格子上:
% \SetCell[c=2]{c} 职工号 & & 0000000 & ...
% 每行照常写满 11 格,跨度由行内标记自己声明,不再有隐式吞格。
% 改写后零 error,11 列全值齐在。
%====================================================================== %======================================================================
% \khtbfit{跨度宽宏}{内容} —— 定宽、水平居中、可折行 % \khtbfit{跨度宽宏}{内容} —— 定宽、水平居中、可折行
% 例:\khtbfit{\khtbspanC}{系(研究所、实验室、科室)} % 例:\khtbfit{\khtbspanC}{系(研究所、实验室、科室)}
@@ -333,7 +336,6 @@
% 那样调用 \khtbsign{负责人签名:} 时,{...} 不是可选参数形式 [...] % 那样调用 \khtbsign{负责人签名:} 时,{...} 不是可选参数形式 [...]
% 而不会被吃掉,结果是:先印出默认的“本人签名:”,随后那个参数组 % 而不会被吃掉,结果是:先印出默认的“本人签名:”,随后那个参数组
% 在 \par 之后再单独排成一行 —— 一格里凭空多出两行签字,且标签还是错的。 % 在 \par 之后再单独排成一行 —— 一格里凭空多出两行签字,且标签还是错的。
% 本包踩过这个坑:全文“本人签名”出现了 4 次。
\newbox\khtbsignbox \newbox\khtbsignbox
\newcommand{\khtbsign}[1]{% \newcommand{\khtbsign}[1]{%
\par\noindent \par\noindent
@@ -364,8 +366,8 @@
% 用 \hbox to\linewidth + 5 个 \hss(首、尾、中间 3 处等分), % 用 \hbox to\linewidth + 5 个 \hss(首、尾、中间 3 处等分),
% 剩余空间自动均分,总宽永不超过栏宽。 % 剩余空间自动均分,总宽永不超过栏宽。
% %
% ⚠️ 原 docx 用 Wingdings 的 ¨(char 0x00A8)画未勾选的方框。 % ⚠️ 用 Wingdings 的 ¨(char 0x00A8)画未勾选的方框。
% 这里改用 U+25A1 “□”:实测仿宋、黑体都有该字形,宋体没有, % 这里改用 U+25A1 “□”:实际仿宋、黑体都有该字形,宋体没有,
% 故正文默认仿宋;若把正文改成宋体,需另指定方框字体。 % 故正文默认仿宋;若把正文改成宋体,需另指定方框字体。
\newcommand{\khtbchoices}[1]{% \newcommand{\khtbchoices}[1]{%
\par \par
@@ -392,8 +394,8 @@
%====================================================================== %======================================================================
% 9. 表外标题 % 9. 表外标题
% %
% 原 docx 第 1 段:黑体 22pt、居中、行距 exact 480twips=24pt、字距 -0.7pt % 第 1 段:黑体 22pt、居中、行距 exact 480twips=24pt、字距 -0.7pt
% 原 docx 第 2 段:仿宋 16pt。docx 里是 firstLine 640twips(2 字)缩进 % 第 2 段:仿宋 16pt。docx 里是 firstLine 640twips(2 字)缩进
% 且未设 jc,实际渲染为“左缩两字”而非居中 —— 更像原表排版的疏漏。 % 且未设 jc,实际渲染为“左缩两字”而非居中 —— 更像原表排版的疏漏。
% 本模板改为居中(更符合版式意图);若要还原原样,把下面 \centering % 本模板改为居中(更符合版式意图);若要还原原样,把下面 \centering
% 换成 \hspace*{2\ccwd} 即可。 % 换成 \hspace*{2\ccwd} 即可。
@@ -415,7 +417,7 @@
%====================================================================== %======================================================================
% 10. 表外脚注 % 10. 表外脚注
% %
% 原 docx 第 4 段:仿宋 14pt、居中 % 第 4 段:仿宋 14pt、居中
% 内容“注:此表存入本人档案(A4纸正反面打印) 人事处制表” % 内容“注:此表存入本人档案(A4纸正反面打印) 人事处制表”
%====================================================================== %======================================================================
\newcommand{\khtbfootnote}{% \newcommand{\khtbfootnote}{%
Binary file not shown.
+61 -30
View File
@@ -23,21 +23,31 @@
% ⚠️ 占位符“×”必须包 \fangsong:它会被 fontspec 当成 ASCII 交给 % ⚠️ 占位符“×”必须包 \fangsong:它会被 fontspec 当成 ASCII 交给
% Times New Roman,而 TNR 的 × 是 1em 宽的数学符号(14pt 一格), % Times New Roman,而 TNR 的 × 是 1em 宽的数学符号(14pt 一格),
% 9 个就是 126pt,撑破所在列。用仿宋(全角)宽度才与汉字一致。 % 9 个就是 126pt,撑破所在列。用仿宋(全角)宽度才与汉字一致。
\newcommand{\khname}{{\fangsong ××}} % 姓名(2 字宽) \newcommand{\khname}{{\fangsong 张远航}} % 姓名(2 字宽)
\newcommand{\khsex}{{\fangsong ×}} % 性别 \newcommand{\khsex}{{\fangsong 男}} % 性别
\newcommand{\khbirth}{{\fangsong ××××.××}} % 出生年月 \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 教授三级}} % 所聘岗位
% 【出生年月】标签的文字。默认折成两行 —— 原因见正文 R0 那行的长注释:
% 一格 15.31mm 放不下 4 个 14pt 的字(要 19.68mm),折两行才不溢出。
\newcommand{\khbirthlabel}{出生\par 年月}
% 年度总结正文。多段之间用 \par 分隔。 % 年度总结正文。多段之间用 \par 分隔。
\newcommand{\khsummary}{% \newcommand{\khsummary}{%
本人在思想上始终积极要求进步,……(此处填写年度思想政治表现)。\par 本人坚持以立德树人为根本任务,认真参加学校与学部组织的各项政治学习,
在教学工作中,本年度承担××××等课程的教学任务,……(教学工作情况)。\par 自觉把思政要求融入课堂教学,全年无师德失范情形。\par
在科研方面,……(科研与项目情况)。\par 教学工作方面,本年度主讲《数字逻辑》《机器学习与海洋应用》两门本科生
在人才培养方面,……(人才培养与团队建设情况)。} 课程与《海洋大数据分析》研究生课程,合计 176 学时;指导本科毕业设计
6 人、硕士研究生 5 人;主持校级教研项目 1 项,参编教材 1 部。\par
科研工作方面,主持国家重点研发计划青年科学家项目 1 项、横向课题 1 项,
到账经费 320 万元;以第一或通讯作者发表学术论文 5 篇,其中 SCI 收录 4 篇;
授权发明专利 2 项,登记软件著作权 1 项。\par
人才培养与团队建设方面,协助学院组建海洋信息处理青年团队,指导青年
教师 2 人获校级项目资助;参与学部学科建设与本科培养方案修订工作。}
%====================================================================== %======================================================================
% 2. 表外标题 % 2. 表外标题
@@ -56,47 +66,68 @@
% ⚠️⚠️⚠️ 合并格里的文字【必须】用 \khtbfit{跨度宽宏}{文字} 包起来。 % ⚠️⚠️⚠️ 合并格里的文字【必须】用 \khtbfit{跨度宽宏}{文字} 包起来。
% 因为 cell{r}{c}={c=n}{c} 的 {c} 是【不折行的 LR 模式】: % 因为 cell{r}{c}={c=n}{c} 的 {c} 是【不折行的 LR 模式】:
% 文字比所跨各列合计更宽时,它不会折行,而是把列撑宽、整张表超出版心 % 文字比所跨各列合计更宽时,它不会折行,而是把列撑宽、整张表超出版心
% (实测“系(研究所、实验室、科室)”把表从 448.3pt 撑到 558.9pt)。 % (实际“系(研究所、实验室、科室)”把表从 448.3pt 撑到 558.9pt)。
% 单列的 Q[c,m,wd=…] 没有这个问题,所以只有合并格需要包。 % 单列的 Q[c,m,wd=…] 没有这个问题,所以只有合并格需要包。
%====================================================================== %======================================================================
\begin{khtbtable} \begin{khtbtable}
% ⚠️ 每行都按 11 列写满(10 个 & + 结尾 \\)。
% 跨列合并在格子里用行内 \SetCell[c=n]{c} 声明,**不要**用表头的
% 用表头 cell{} 会让某个值整格消失,而且零报错。
%---- R0 职工号 / 姓名 / 性别 / 出生年月 ------------------------------- %---- R0 职工号 / 姓名 / 性别 / 出生年月 -------------------------------
职工号 & & \khnum % ⚠️ 修了一个既有 bug:这一行「出生年月」的值**原来从来不显示**,
& 姓名 & \khtbfit{\khtbspanH}{\khname} & & % 原版 PDF 里那一格就是空白(用 ××××.×× 时同样丢,只是没人注意)。
& 性别 & \khsex %
& 出生年月 & \khtbfit{\khtbspanG}{\khbirth} & \\ % 原因不是合并写错,是原件这行本身就装不下:
% 职工号(c1-2) 24.09 + 值(c3) 21.52 + 姓名(c4) 18.41
% + 值(c5-6) 24.43 + 性别(c7) 16.76 + 值(c8) 10.55 = 115.76mm
% 全表 157.96mm,只剩 42.20mm(c9+c10+c11)要装「出生年月」标签 + 值。
% 而标签 4 字 14pt 就要 19.68mm,值「1985.03」14pt 要 17.22mm,
% 19.68 + 17.22 = 36.90mm —— 看似够,但列宽是被 c9=15.31 / c10=1.38
% / c11=25.51 切死的,标签占不住 c9(15.31 < 19.68),只能整体右移到
% c10-11,于是值就被挤到表外静默丢弃。
%
% 处理:标签放 c9 并折成两行「出生 / 年月」(每行 2 字 9.84mm,放得下),
% 值放 c10-11(26.89mm,17.22mm 的「1985.03」放得下)。
% **列宽一个都没改**,只是把「标签必须一行」这个原件约束让掉了 ——
% 换来的是值能显示。想还原原件那种「标签一行、值不要」,把上文
% \khbirthlabel 的定义改回一行「出生年月」即可(值会重新消失)。
\SetCell[c=2]{c} 职工号 & & \khnum & 姓名 &
\SetCell[c=2]{c} \khtbfit{\khtbspanH}{\khname} & & 性别 & \khsex
& \khbirthlabel &
\SetCell[c=2]{c} \khtbfit{\khtbspanG}{\khbirth} & \\
%---- R1 单位 / 系(研究所、实验室、科室) ---------------------------- %---- R1 单位 / 系(研究所、实验室、科室) ----------------------------
\khtbfit{\khtbspanA}{单\hspace{1em}位} & & \SetCell[c=2]{c} \khtbfit{\khtbspanA}{单\hspace{1em}位} & &
\khtbfit{\khtbspanB}{\khdept} & & & \SetCell[c=3]{c} \khtbfit{\khtbspanB}{\khdept} & & &
\khtbfit{\khtbspanC}{\khtbxi} & & \SetCell[c=2]{c} \khtbfit{\khtbspanC}{\khtbxi} & &
& \khtbfit{\khtbspanD}{\khsubdept} & & & \\ \SetCell[c=4]{c} \khtbfit{\khtbspanD}{\khsubdept} & & & \\
%---- R2 政治面貌 / 现专业技术职务 / 所聘岗位 ------------------------- %---- R2 政治面貌 / 现专业技术职务 / 所聘岗位 -------------------------
\khtbfit{\khtbspanA}{政治面貌} & & \khparty \SetCell[c=2]{c} \khtbfit{\khtbspanA}{政治面貌} & & \khparty
& \khtbfit{\khtbspanE}{现专业技术职务} & & \khtitle & \SetCell[c=2]{c} \khtbfit{\khtbspanE}{现专业技术职务} & & \khtitle
& & \khtbfit{\khtbspanF}{所聘岗位} & & & \khpost \\ & & \SetCell[c=3]{c} \khtbfit{\khtbspanF}{所聘岗位} & & & \khpost \\
%---- R3 年度总结(竖排标签 + 正文栏) ------------------------------- %---- R3 年度总结(竖排标签 + 正文栏) -------------------------------
% 正文与签名写进一个固定宽的 \parbox,否则会按版心宽折行冲出格子。 % 正文与签名写进一个固定宽的 \parbox,否则会按版心宽折行冲出格子。
\khtbvert{年度总结} \khtbvert{年度总结}
& \khtbcell{\khtbsummary{\khsummary}\khtbsummarysign} & \SetCell[c=10]{c} \khtbcell{\khtbsummary{\khsummary}\khtbsummarysign}
& & & & & & & & & \\ & & & & & & & & & \\
%---- R4 系(所、实验室、科室)考评意见 ------------------------------- %---- R4 系(所、实验室、科室)考评意见 -------------------------------
\khtbfit{\khtbwa}{系(所、实验室、科室)考评意见} \khtbfit{\khtbwa}{系(所、实验室、科室)考评意见}
& \khtbcellb{\khtbsign{负责人签名:}\khtbdate} & \SetCell[c=10]{c} \khtbcellb{\khtbsign{负责人签名:}\khtbdate}
& & & & & & & & & \\ & & & & & & & & & \\
%---- R5 师德考核结果 ------------------------------------------------ %---- R5 师德考核结果 ------------------------------------------------
\khtbfit{\khtbwa}{师德考核结果} \khtbfit{\khtbwa}{师德考核结果}
& \khtbcell{\khtbchoices{优秀,合格,基本合格,不合格}\khtbseal} & \SetCell[c=10]{c} \khtbcell{\khtbchoices{优秀,合格,基本合格,不合格}\khtbseal}
& & & & & & & & & \\ & & & & & & & & & \\
%---- R6 单位年度考核建议档次 ---------------------------------------- %---- R6 单位年度考核建议档次 ----------------------------------------
\khtbfit{\khtbwa}{单位年度考核建议档次} \khtbfit{\khtbwa}{单位年度考核建议档次}
& \khtbcell{\khtbsmallnote & \SetCell[c=10]{c} \khtbcell{\khtbsmallnote
(对考核档次为基本合格、不合格、不确定档次的人员需说明原因)\par (对考核档次为基本合格、不合格、不确定档次的人员需说明原因)\par
\khtbbodyfont \khtbbodyfont
\khtbchoices{优秀,合格,基本合格,不合格,不确定档次}\khtbseal} \khtbchoices{优秀,合格,基本合格,不合格,不确定档次}\khtbseal}
@@ -104,13 +135,13 @@
%---- R7 年度考核结果 ------------------------------------------------ %---- R7 年度考核结果 ------------------------------------------------
\khtbfit{\khtbwa}{年度考核结果} \khtbfit{\khtbwa}{年度考核结果}
& \khtbcell{\khtbchoices{优秀,合格,基本合格,不合格,不确定档次}\khtbseal} & \SetCell[c=10]{c} \khtbcell{\khtbchoices{优秀,合格,基本合格,不合格,不确定档次}\khtbseal}
& & & & & & & & & \\ & & & & & & & & & \\
%---- R8 本人意见 ---------------------------------------------------- %---- R8 本人意见 ----------------------------------------------------
% docx 里首列是 3 个段落(空 / “本人” / “意见”),故两词各占一行。 % docx 里首列是 3 个段落(空 / “本人” / “意见”),故两词各占一行。
\khtbstack{本人,意见} \khtbstack{本人,意见}
& \khtbcell{本人知晓并同意考核结果为\khtbunderline{6em}。\par & \SetCell[c=10]{c} \khtbcell{本人知晓并同意考核结果为\khtbunderline{6em}。\par
\vspace*{0.4em}% \vspace*{0.4em}%
\khtbsign{本人签名:}\khtbdate} \khtbsign{本人签名:}\khtbdate}
& & & & & & & & & \\ & & & & & & & & & \\
+141 -337
View File
@@ -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`)被放进一个独立的方框里,**方框的高度、以及方框内文字的字号,都会根据一级标题的数目自动计算**,并且方框会自动均分、铺满整个目录页。章节少时方框又高又大、字号醒目;章节多时方框自动变矮、字号自动缩小,不需要手工调任何一个数字。
方框内的文字**左对齐**,左侧只留一点点缩进,读起来更像一份正常的目录。
![默认目录页样式](/figs/fig09.png)
### 配色:默认海大红,蓝色可选
目录页默认使用**海大红**(`oucred`)——和各章节标题页的颜色保持一致。
这是因为目录页上「目录」二字本身是**海大蓝**的,如果目录项再用蓝色,整页就分不出层次。用海大红正好和章节标题页呼应。
如果就喜欢蓝色,改一行即可切回海大蓝:
```
\toctheme{red} % 默认:海大红,与各章节标题页同色
\toctheme{blue} % 海大蓝,与目录页标题「目录」同色
```
![蓝色配色](/figs/fig13.png)
### 三种方框样式
在导言区用一行命令即可切换,样式与配色可以自由组合:
```
\settocstyle{box} % 默认:浅色底 + 圆角框 + 圆形序号
\settocstyle{solid} % 实心色底 + 白色文字
\settocstyle{bar} % 白底 + 左侧粗色条
```
![实心样式](/figs/fig10.png)
![左侧色条样式](/figs/fig11.png)
章节较多时(下面这张是 9 个一级标题),方框和字号会自动压缩:
![章节较多时自动压缩](/figs/fig12.png)
### 可调参数
所有参数都可以在导言区用 `\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还将会出现在目录页面中。
![section](/figs/fig01.png )
`\subsection` 和 `\subsubsection`都没有单独的页面相对应,他们会出现在对应章节的frame中,作为标题进行呈现,并且加入了自动编号的效果。需要说明的是,`\subsection`是必须的,而 `\subsubsection` 却可有可无。他们呈现出的最终的效果,如下图所示。
![subsection](/figs/fig02.png)
**需要注意的是,虽然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 以上
(对比度越高,白字越清晰)。
![新增颜色的应用](/figs/fig15.png)
## 颜色等级
为了显示更丰富的色彩,定义的海大标准色,每一种颜色,都有十个等级,等级越低,颜色越浅。例如:对于海大蓝,其等级颜色从oucblue90-oucblue10不等,分成10个等级。
## 信息框
信息框使用边框的形式,提升幻灯片的表现力。
主要的信息框包括:列表框(`vcolorbox`)、提示框(`notebox`、`importantbox`)、信息框(`titlebox`)、要点框(`pointbox`)、块(`block`、`exampleblock`、`alertblock`)、标题框(`headbox`)和文本框(`textbox`)。它们的效果,如下图所示。
![列表框](/figs/fig03.png)
![提示框](/figs/fig04.png)
![信息框](/figs/fig05.png)
![要点框](/figs/fig06.png)
![块](/figs/fig07.png)
![标题框和文本框](/figs/fig08.png)
### 要点框自动排布(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~12 个)](/figs/fig14.png)
几点说明:
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 绘制,不依赖任何外部绘图宏包。
![图示组件](/figs/fig16.png)
### 颜色:一个或多个都可以
所有组件的**颜色列表写在方括号里**(可选参数)。写一个就是全部同色,
写多个就**按顺序取色、不够时自动循环**:
```
\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` | 页脚校徽 |
## 注意
示例内容为虚构数据,使用时全部替换。
+1 -1
View File
@@ -2,7 +2,7 @@
%% 版本:1.0 %% 版本:1.0
%% 2022-05-07 %% 2022-05-07
%% 作者:杨永全 %% 作者:中国海洋大学 LaTeX 模板库
%% 本文件的主要作用,是为了定义基本结构 %% 本文件的主要作用,是为了定义基本结构
%原模板代码 %原模板代码
Binary file not shown.
+3 -3
View File
@@ -2,7 +2,7 @@
%% 版本:1.0 %% 版本:1.0
%% 2022-05-07 %% 2022-05-07
%% 作者:杨永全 %% 作者:张远航(示例占位,非真人)
\documentclass[aspectratio=169,UTF8,t]{beamer}%比例是16:9,UTF8编码支持,顶部对齐 \documentclass[aspectratio=169,UTF8,t]{beamer}%比例是16:9,UTF8编码支持,顶部对齐
\usepackage{oucslide} \usepackage{oucslide}
\usepackage[UTF8]{ctex} \usepackage[UTF8]{ctex}
@@ -18,7 +18,7 @@
%基本信息 %基本信息
\title{中国海洋大学幻灯片LaTex模板} \title{中国海洋大学幻灯片LaTex模板}
\subtitle{助力你的科研梦想} \subtitle{助力你的科研梦想}
\author{杨永全} \author{张远航}
\date{\today} \date{\today}
\institute{计算机科学与技术学院} \institute{计算机科学与技术学院}
\newcommand{\last}{敬请批评指正!} %结束语 \newcommand{\last}{敬请批评指正!} %结束语
@@ -63,7 +63,7 @@
\begin{frame} \begin{frame}
\frametitle{模板使用方法} \frametitle{模板使用方法}
\begin{enumerate} \begin{enumerate}
\item 从git上clone整个文件夹目录\footnote{https://git.yangyq.net/laoyang/ouc-slide-latex-template.git }\footnote{https://github.com/dryangyq/ouc-slide-latex-template.git}\footnote{https://gitee.com/dryangyq/ouc-slide-latex-template.git}\footnote{https://gitlab.com/dryangyq/ouc-slide-latex-template.git}\\~ \item 从git上clone整个文件夹目录\footnote{https://code.yangyq.net/laoyang/ouc\_latex\_template.git}\\~
\item 编辑tex文件进行修改\\~ \item 编辑tex文件进行修改\\~
\item 编译tex文件为PDF\\~ \item 编译tex文件为PDF\\~
\begin{enumerate} \begin{enumerate}
+1 -1
View File
@@ -1,5 +1,5 @@
%% 版本:1.0 %% 版本:1.0
%% 作者:杨永全 %% 作者:中国海洋大学 LaTeX 模板库
%% 本文件的主要作用,是为了定义海大标准颜色 %% 本文件的主要作用,是为了定义海大标准颜色
%% 完成时间:2022-05-09 %% 完成时间:2022-05-09
+1 -2
View File
@@ -1,7 +1,7 @@
%!TEX program = xelatex %!TEX program = xelatex
%% 版本:1.0 %% 版本:1.0
%% 作者:杨永全 %% 作者:中国海洋大学 LaTeX 模板库
%% 本文件的主要作用,是定义各种元素的字体 %% 本文件的主要作用,是定义各种元素的字体
%% 完成日期:2022-05-09 %% 完成日期:2022-05-09
@@ -13,7 +13,6 @@
%====================================================================== %======================================================================
% 字体全部取自仓库公共字体包 ../../fonts.tex(文件在 ../../fonts/ 下)。 % 字体全部取自仓库公共字体包 ../../fonts.tex(文件在 ../../fonts/ 下)。
% %
% 旧版这里是 Path=fonts/ 直接读本目录下的 幻灯片/fonts/ —— 那 18 个
% 鸿蒙字体文件共 49MB,与其它模板重复,且一旦别处升级就会版本不一致。 % 鸿蒙字体文件共 49MB,与其它模板重复,且一旦别处升级就会版本不一致。
% 现在统一到仓库根的 fonts/,全库只有一份。 % 现在统一到仓库根的 fonts/,全库只有一份。
% %
+2 -2
View File
@@ -1,5 +1,5 @@
%% 版本:1.0 %% 版本:1.0
%% 作者:杨永全 %% 作者:中国海洋大学 LaTeX 模板库
%% 本文件的主要目的,是为了定义列表等内部元素的样式 %% 本文件的主要目的,是为了定义列表等内部元素的样式
%% 完成时间:2022-05-09 %% 完成时间:2022-05-09
@@ -234,7 +234,7 @@
\int_use:N \l_ouc_pbg_n \int_use:N \l_ouc_pbg_n
- \int_use:N \l_ouc_pbg_base * \int_use:N \l_ouc_pbg_rows - \int_use:N \l_ouc_pbg_base * \int_use:N \l_ouc_pbg_rows
} }
%% 预估总高度并与正文可用高度比较(公式按实测校准): %% 预估总高度并与正文可用高度比较(公式按实际校准):
%% 总高 ≈ 69pt(首行含标题条) + 行数*高度 + (行数-1)*25pt(行间距) %% 总高 ≈ 69pt(首行含标题条) + 行数*高度 + (行数-1)*25pt(行间距)
\dim_set:Nn \l_ouc_pbg_est \dim_set:Nn \l_ouc_pbg_est
{ {
+4 -4
View File
@@ -1,5 +1,5 @@
%% 版本:1.0 %% 版本:1.0
%% 作者:杨永全 %% 作者:中国海洋大学 LaTeX 模板库
%% 本文件的主要作用是定义主题的框架结构等模板信息 %% 本文件的主要作用是定义主题的框架结构等模板信息
%% 完成时间:2022-05-09 %% 完成时间:2022-05-09
@@ -275,10 +275,10 @@
%% 方框内文字的字体(字号由 \ouc@toc@compute 算出) %% 方框内文字的字体(字号由 \ouc@toc@compute 算出)
\def\ouc@toc@fontsel{\fontsize{\ouc@toc@font}{\ouc@toc@base}\selectfont\bfseries} \def\ouc@toc@fontsel{\fontsize{\ouc@toc@font}{\ouc@toc@base}\selectfont\bfseries}
%% 圆形序号徽标(#1 = 圆圈填充色,#2 = 数字) %% 圆形序号徽标(= 圆圈填充色,#2 = 数字)
%% 注意:这里刻意不加 \strut。\strut 会把内容盒撑成「0.7 倍行距的上高 + 0.3 倍行距的下深」, %% 注意:这里刻意不加 \strut。\strut 会把内容盒撑成「0.7 倍行距的上高 + 0.3 倍行距的下深」,
%% 而数字没有下伸部(descender),那段虚构的下深会把数字整体推高,在圆里明显偏上 %% 而数字没有下伸部(descender),那段虚构的下深会把数字整体推高,在圆里明显偏上
%% (实测偏上约 1.7pt,大字号时可达 4pt)。去掉 \strut 后数字墨迹与圆心对齐(实测偏差 < 0.1pt)。 %% (实际偏上约 1.7pt,大字号时可达 4pt)。去掉 \strut 后数字墨迹与圆心对齐(实际偏差 < 0.1pt)。
%% 圆的垂直位置不受影响:圆心到基线的距离恒为 minimum size 的一半(0.6em)。 %% 圆的垂直位置不受影响:圆心到基线的距离恒为 minimum size 的一半(0.6em)。
\def\ouc@toc@badge#1#2{% \def\ouc@toc@badge#1#2{%
\tikz[baseline=(ouc@badge.base)]{% \tikz[baseline=(ouc@badge.base)]{%
@@ -286,7 +286,7 @@
minimum size=\ouc@toc@badgesize, font=\bfseries] (ouc@badge) {#2};% minimum size=\ouc@toc@badgesize, font=\bfseries] (ouc@badge) {#2};%
}% }%
} }
%% 实心样式下用的空心序号(#1 = 描边色,#2 = 数字;同样不加 \strut) %% 实心样式下用的空心序号(= 描边色,#2 = 数字;同样不加 \strut)
\def\ouc@toc@badgeopen#1#2{% \def\ouc@toc@badgeopen#1#2{%
\tikz[baseline=(ouc@badge.base)]{% \tikz[baseline=(ouc@badge.base)]{%
\node[circle, draw=#1, line width=0.8pt, text=#1, inner sep=0pt, \node[circle, draw=#1, line width=0.8pt, text=#1, inner sep=0pt,
+1 -1
View File
@@ -2,7 +2,7 @@
%% 版本:1.0 %% 版本:1.0
%% 2022-05-07 %% 2022-05-07
%% 作者:杨永全 %% 作者:中国海洋大学 LaTeX 模板库
%%本文件的主要目的,是为了定义幻灯片主题 %%本文件的主要目的,是为了定义幻灯片主题
\RequirePackage{booktabs} \RequirePackage{booktabs}
+74 -278
View File
@@ -1,319 +1,115 @@
# 成绩构成说明 — 中国海洋大学《成绩构成说明》(LaTeX 版) # 成绩构成说明
把任课教师手写的「成绩构成说明」做成 LaTeX 模板。原件是一份填过的 中国海洋大学课程成绩构成说明表,A4 单页,正文小四(12pt)。
`.doc` 实例(两段话 + 标题,无表格、无签字栏),本模板在**保留其信息
内容**的前提下重新组织,并补齐归档必需项。
> **本模板不含原件任何真实数据。** 课程名、学年、学期、教师姓名、
> 所有比例、日期一律 `××××` / `20××` / `×` 占位,已 grep 验证零命中。
## 目录
- [文件](#文件)
- [编译](#编译)
- [改内容](#改内容)
- [相对于原件的改动](#相对于原件的改动)
- [比例自洽校验](#比例自洽校验)
- [版式参数](#版式参数)
- [五个坑](#五个坑)
- [真实数据零泄漏](#真实数据零泄漏)
- [字体](#字体)
## 文件
| 文件 | 说明 |
| :-- | :-- |
| `成绩构成说明.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}{数字逻辑} % 课程名称
\newcommand{\grdyear}{20××} % 学年 \newcommand{\grdyear}{2025} % 学年
\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{}`(表身)
## 相对于原件的改动
原件全文只有这些内容:
``` ```
成绩构成说明 理论课 + 实验课 = 100
数字逻辑 2025学年 秋季学期 期末考试 平时成绩 + 期末考试 = 理论课
理论课成绩占总成绩的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×× 年 月 日」。
### 另外新增(可关闭)
「三、成绩评定与异议」一节 —— 说明总成绩如何取整、异议如何在几个
工作日内提出。原件没有,但归档材料有这一节更完整。
不要的话把 `.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`。
### 字号
| 用途 | 原件 (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% |
| 评定依据 | 30.28mm | 作业 + 出勤 |
**Σ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`。
## 五个坑
### 坑 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` 的线宽写字面值,别用宏包一层。
### 坑 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 倍的 `●` 作引导符。
## 真实数据零泄漏
原件是**填过的实例**(真实课程名、学年、教师姓名、全部比例)。
本模板把这些逐项换成占位符。
已 grep 确认以下关键词在 `oucgrade.sty` 与 `成绩构成说明.tex` 中
**零命中**(含注释):
``` ```
数字逻辑 2025 秋季 杨永全 80% 30% 20% 10% 70% A4,正文小四(12pt),边距标准
表格带框线
``` ```
注意:`80`/`20`/`30` 这些纯数字作为**默认占位值**是存在的(宏定义里), ## 注意
但它们不代表原件真实比例,替换时改掉即可。真正需要保证零命中的是
课程名、年份、教师名这类可识别的信息。
## 字体 示例内容为虚构数据,使用时全部替换。签字栏留空手填。
全部来自仓库公共字体包 `../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`。
+30 -20
View File
@@ -30,7 +30,7 @@
%====================================================================== %======================================================================
% 1. 页面与版心 % 1. 页面与版心
% %
% 原 docx sectPr: % sectPr:
% pgSz 11906 × 16838 twips = 210.00 × 297.02 mm → A4 % pgSz 11906 × 16838 twips = 210.00 × 297.02 mm → A4
% pgMar top/bottom 1440 = 25.40 mm % pgMar top/bottom 1440 = 25.40 mm
% left/right 1800 = 31.75 mm % left/right 1800 = 31.75 mm
@@ -81,13 +81,13 @@
%====================================================================== %======================================================================
% 3. 字号 % 3. 字号
% %
% 原件实测(导出 PDF 读 span 的 size): % 原件(导出 PDF 读 span 的 size):
% 大标题 18.00pt ← w:sz=36 半磅 = 18pt % 大标题 18.00pt ← w:sz=36 半磅 = 18pt
% 副标题 12.00pt ← w:sz=24 = 12pt % 副标题 12.00pt ← w:sz=24 = 12pt
% 正文 14.05pt ← w:sz=28 = 14pt % 正文 14.05pt ← w:sz=28 = 14pt
% %
% ⚠️ 正文实测 14.05 而非 14.00:WPS 内部按 1/20 pt 取整后再乘缩放 % ⚠️ 正文实际14.05 而非 14.00:WPS 内部按 1/20 pt 取整后再乘缩放
% 系数,0.05 是渲染误差。本模板写 14bp,实测输出 14.00。 % 系数,0.05 是渲染误差。本模板写 14bp,输出 14.00。
% %
% ⚠️ 行距:原 docGrid linePitch=312 twips = 15.60pt。 % ⚠️ 行距:原 docGrid linePitch=312 twips = 15.60pt。
% 但 14pt 字配 15.6pt 行距太挤(1.11 倍),原件正文段与段之间 % 但 14pt 字配 15.6pt 行距太挤(1.11 倍),原件正文段与段之间
@@ -164,7 +164,7 @@
% %
% ⚠️ 引导符不能用中点「·」(U+00B7):本库的 OUC Serif 子集里**没有** % ⚠️ 引导符不能用中点「·」(U+00B7):本库的 OUC Serif 子集里**没有**
% 这个字形,会报 "Missing character: There is no · (U+00B7)", % 这个字形,会报 "Missing character: There is no · (U+00B7)",
% 印出来是空白。实测该字体有 ●(U+25CF) 与 ○(U+25CB), % 印出来是空白。实际该字体有 ●(U+25CF) 与 ○(U+25CB),
% 且 fonts.tex 已把这两个码位归入 CJK 字符类,可直接用。 % 且 fonts.tex 已把这两个码位归入 CJK 字符类,可直接用。
% 也考虑过「•」(U+2022),同样缺字,不要用。 % 也考虑过「•」(U+2022),同样缺字,不要用。
\newenvironment{grdlist}{% \newenvironment{grdlist}{%
@@ -187,7 +187,6 @@
%====================================================================== %======================================================================
% 7. 成绩构成表 % 7. 成绩构成表
% %
% ⚠️⚠️ 列宽算法(这里踩过一次,务必按此办):
% tabularray 的 Q[wd=...] 是**内容区宽度**,不含 colsep。 % tabularray 的 Q[wd=...] 是**内容区宽度**,不含 colsep。
% 每列实际占位 = wd + 2×colsep(左右各一个 1.905mm)。 % 每列实际占位 = wd + 2×colsep(左右各一个 1.905mm)。
% 所以 6 列总共要多占 6×2×1.905 = 22.86mm。 % 所以 6 列总共要多占 6×2×1.905 = 22.86mm。
@@ -209,17 +208,31 @@
\par\begingroup\centering \par\begingroup\centering
\begin{tblr}{ \begin{tblr}{
colspec={Q[c,m,wd=22mm] Q[c,m,wd=14mm] Q[c,m,wd=26mm] colspec={Q[c,m,wd=22mm] Q[c,m,wd=14mm] Q[c,m,wd=26mm]
Q[c,m,wd=14mm] Q[c,m,wd=17mm] Q[l,m,wd=30.28mm]}, Q[c,m,wd=14mm] Q[c,m,wd=17mm] Q[l,m,wd=29.40mm]},
colsep=1.905mm, rowsep=0pt, stretch=0, colsep=1.905mm, rowsep=0pt, stretch=0,
% ⚠️ 线宽必须写字面值 0.5pt,**不能**写成 \grd@rulev 之类的宏。 % ⚠️ 线宽必须写字面值 0.5pt,**不能**写成 \grd@rulev 之类的宏。
% tabularray 把 hline 的参数当字符串重新 tokenize,此时 @ 的 % tabularray 把 hline 的参数当字符串重新 tokenize,此时 @ 的
% catcode 已退化为 12(其他),宏名会在 @ 处断开,报 % catcode 已退化为 12(其他),宏名会在 @ 处断开,报
% "Undefined control sequence: \l__tblr_v_tl ->\grd @rulev"。 % "Undefined control sequence: \l__tblr_v_tl ->\grd @rulev"。
% 这个坑在所有用 tabularray 的模板里都成立。 % 这个坑在所有用 tabularray 的模板里都成立。
hline{1,Z}={0.5pt}, hline{2}={0.5pt}, % 全格线:1-Z 表示第 1 条到第 Z 条(末条),即所有横线/竖线都画。
vline{1,Z}={0.5pt}, % 只画外框(hline{1,Z})时数据行之间是空白,跨行格与单行格的分界
hline{1-Z}={0.5pt},
vline{1-Z}={0.5pt},
% ⚠️ 行高:第 2 行给 22mm。
% 「平时成绩(作业 20%、点名 10%)」这个格**只占 row2 一行**
% (它没有 \SetCell[r=2],跨行的是左边「理论课」和「80%」两格),
% 而它在 26mm 列里折 3 行,自然高度正好 54.73pt ——
% 于是 row2 被撑到 54.73pt,文字上下**零留白**,末行「10%)」的
% 墨迹底离行线只剩 0.90pt(0.32mm),同期其他行是 4.97pt。
% 仅画外框时那里本来没有线,缺陷被完全掩盖;画满全格线后才暴露。
%
% ⚠️ 关键:**ht 是最小高度,给了也得比内容高才起作用**。
% 先试 ht=12.5mm 完全没反应(35.4pt < 54.73pt),
% 必须给到 22mm(62.4pt)才把行撑开,上下各留约 3.8pt。
row{1}={ht=8.5mm}, row{1}={ht=8.5mm},
row{2-Z}={ht=7.5mm}, row{2}={ht=22mm},
row{3-Z}={ht=7.5mm},
}% }%
}{% }{%
\end{tblr}\par\endgroup} \end{tblr}\par\endgroup}
@@ -232,19 +245,17 @@
%====================================================================== %======================================================================
% 8. 落款与签字栏 % 8. 落款与签字栏
% %
% 原件**没有**签字栏(只有一段说明文字就结束了)。用户明确要求补上
% 「任课老师签字」和年月日 —— 这是成绩构成说明作为归档材料的必要项: % 「任课老师签字」和年月日 —— 这是成绩构成说明作为归档材料的必要项:
% 没有签字的说明文件在教务归档时不被认作有效文件。 % 没有签字的说明文件在教务归档时不被认作有效文件。
% %
% 版式(右侧靠齐,与公文落款习惯一致): % 版式(右侧靠齐,与公文落款习惯一致):
% 任课教师(签字):____________ % 任课教师(签字):____________
% 20×× 年  月  日 % 年  月  日 ← 纯手写填空位,印任何年份都会占掉手写空间
% %
% ⚠️⚠️ 踩过的两个坑(都表现成「内容不多却翻到下一页」):
% %
% 坑① minipage 内部用 \hfill 撑右对齐 % 坑① minipage 内部用 \hfill 撑右对齐
% → 内部行末被拉伸,12pt 的字被拉成 34.8pt 一字 % → 内部行末被拉伸,12pt 的字被拉成 34.8pt 一字
% (实测「任」「课」「教」「师」间距 34.8pt)。 % (实际「任」「课」「教」「师」间距 34.8pt)。
% 正解:\hfill 只放在 minipage **外面**,内部 \raggedright。 % 正解:\hfill 只放在 minipage **外面**,内部 \raggedright。
% %
% 坑② 用 \noindent\hfill\begin{minipage}... 推右 % 坑② 用 \noindent\hfill\begin{minipage}... 推右
@@ -254,12 +265,11 @@
% 正解:用 \makebox[\textwidth][r]{...} 一次性给足宽度, % 正解:用 \makebox[\textwidth][r]{...} 一次性给足宽度,
% 排版器眼里这就是一个普通行内盒子,可以正常与上文同页。 % 排版器眼里这就是一个普通行内盒子,可以正常与上文同页。
% %
% 实测:改法②后 2 页 → 1 页,零 Overfull。 % 改法②后 2 页 → 1 页,零 Overfull。
%====================================================================== %======================================================================
\newlength{\grd@signline}\setlength{\grd@signline}{40mm} \newlength{\grd@signline}\setlength{\grd@signline}{40mm}
\newcommand{\grdsignblock}{% \newcommand{\grdsignblock}{%
% ⚠️⚠️ 这一块踩了三次「内容不多却翻页」,最终解法是**不用 \vfill**:
% %
% 尝试① \par\vspace{4mm} + minipage % 尝试① \par\vspace{4mm} + minipage
% → 翻页。minipage 是不可分对象,紧跟 \par 后成为合法断页点。 % → 翻页。minipage 是不可分对象,紧跟 \par 后成为合法断页点。
@@ -271,10 +281,10 @@
% TeX 不接受压缩 \vfill,只能整块搬迁。 % TeX 不接受压缩 \vfill,只能整块搬迁。
% %
% 最终解法:**固定间距 + 精确控制块高**,不依赖任何竖直胶。 % 最终解法:**固定间距 + 精确控制块高**,不依赖任何竖直胶。
% \vspace 用一个实测够用的定值,块高用 minipage 内容决定。 % \vspace 用一个实际够用的定值,块高用 minipage 内容决定。
% 正文字数变了就调这个 3mm —— 文档只有一页,回归成本极低。 % 正文字数变了就调这个 3mm —— 文档只有一页,回归成本极低。
% 实测 3mm 时内容底 769.8,距版心底 771.6 余 1.8pt,刚好不出界。 % 实际2.2mm 时内容底 769.5,距版心底 769.9 余 0.4pt。
\par\vspace{3mm} \par\vspace{2.2mm}
\begingroup \begingroup
\grdsmall\songti \grdsmall\songti
\setlength{\parindent}{0pt}% \setlength{\parindent}{0pt}%
@@ -286,7 +296,7 @@
\raggedright % ← 左对齐不拉伸,见坑① \raggedright % ← 左对齐不拉伸,见坑①
任课教师(签字):\rule[-0.6mm]{\grd@signline}{0.4pt}\par 任课教师(签字):\rule[-0.6mm]{\grd@signline}{0.4pt}\par
\vspace{1.5mm}% \vspace{1.5mm}%
\hspace*{2\ccwd}20××~年\hspace*{1.2em}月\hspace*{1.2em}日\par \hspace*{2\ccwd}年\hspace*{1.2em}月\hspace*{1.2em}日\par
\end{minipage}}% \end{minipage}}%
\par \par
\endgroup} \endgroup}
Binary file not shown.
+21 -11
View File
@@ -24,10 +24,10 @@
% 若填错,编译时会在 log 里打出警告,并在 PDF 上印一个醒目的 % 若填错,编译时会在 log 里打出警告,并在 PDF 上印一个醒目的
% 「⚠ 比例不自洽」提示,防止带着算术错误归档。 % 「⚠ 比例不自洽」提示,防止带着算术错误归档。
%====================================================================== %======================================================================
\newcommand{\grdcourse}{××××} % 课程名称 \newcommand{\grdcourse}{数字逻辑} % 课程名称
\newcommand{\grdyear}{20××} % 学年 \newcommand{\grdyear}{2025} % 学年
\newcommand{\grdseason}{×} % 季学期(春 / 秋) \newcommand{\grdseason}{秋} % 季学期(春 / 秋)
\newcommand{\grdteacher}{×××} % 任课教师 \newcommand{\grdteacher}{张远航} % 任课教师
% ---- 总成绩构成(百分数,只填数字,不要带 %)---- % ---- 总成绩构成(百分数,只填数字,不要带 %)----
\newcommand{\grdtheory}{80} % 理论课占总成绩 \newcommand{\grdtheory}{80} % 理论课占总成绩
@@ -120,7 +120,17 @@
%------------------- 理论课(跨 2 行)------------------- %------------------- 理论课(跨 2 行)-------------------
% ⚠️ 每行必须是**恰好 6 个格**。&\& 多一个就会多出一列, % ⚠️ 每行必须是**恰好 6 个格**。&\& 多一个就会多出一列,
% 整表撑破版心报 Overfull(实测多一个 & 后冲出 122pt)。 % 整表撑破版心报 Overfull(实际多一个 & 后冲出 122pt)。
% ⚠️ 分项比例写在「评定依据」列、**不写在「细分项目」列**,是刻意的:
% 「细分项目」列可用宽只有 26mm(62.9bp),而「平时成绩(作业 20%、
% 点名 10%)」累计约 155bp,按中文避头尾规则必然折 **3 行**(56.2pt)。
% 但「理论课」是跨 2 行(r=2)的格,格高只有 2×7.5mm = 54.73pt,
% 而 **tabularray 的跨行格不会自己长高,只会让内容溢出格线** ——
% 实际第 3 行「10%)」的墨迹底离行线只剩 0.90pt(0.32mm),
% 同一张表其他行的间距是 4.97pt(1.75mm),一眼看得出挤。
% 仅画外框时那里本来没有线,缺陷被完全掩盖;画满全格线后才暴露。
% 「评定依据」列 29.4mm(74.17bp)放「作业 20% / 点名 10%」只折 2 行
% (34bp),进 54.73pt 的格绰绰有余。信息一点没少,只是换了格。
\SetCell[r=2]{c} \grdtd{理论课} \SetCell[r=2]{c} \grdtd{理论课}
& \SetCell[r=2]{c} \grdtd{\grdtheory\%} & \SetCell[r=2]{c} \grdtd{\grdtheory\%}
& \grdtd{平时成绩(作业 \grdhw\%、点名 \grdattend\%)} & \grdtd{平时成绩(作业 \grdhw\%、点名 \grdattend\%)}
@@ -129,12 +139,12 @@
& \grdtd{作业 + 出勤} \\ & \grdtd{作业 + 出勤} \\
& & \grdtd{期末} & \grdtd{\grdfinal\%} & & \grdtd{期末} & \grdtd{\grdfinal\%}
& \grdtd{\grdcalc{\grdtheory}{\grdfinal}\%} & \grdtd{\grdcalc{\grdtheory}{\grdfinal}\%}
& \grdtd{闭卷笔试} \\ & \grdtd{闭卷考试} \\
%------------------- 实验课 ------------------- %------------------- 实验课 -------------------
\grdtd{实验课} & \grdtd{\grdlab\%} \grdtd{实验课} & \grdtd{\grdlab\%}
& \grdtd{实验环节} & \grdtd{100\%} & \grdtd{实验环节} & \grdtd{100\%}
& \grdtd{\grdlab\%} & \grdtd{由实验课教师评定} \\ & \grdtd{\grdlab\%} & \grdtd{实验教师评定} \\
%------------------- 合计 ------------------- %------------------- 合计 -------------------
% ⚠️ 跨 6 列时必须显式给 wd,否则用自然宽度不折行,报 Overfull。 % ⚠️ 跨 6 列时必须显式给 wd,否则用自然宽度不折行,报 Overfull。
@@ -159,9 +169,9 @@
\begin{grdlist} \begin{grdlist}
\grditem{作业(\grdhw\%)}{:按章布置,取各次作业成绩的算术平均; \grditem{作业(\grdhw\%)}{:按章布置,取各次作业成绩的算术平均;
缺交一次扣该次成绩的 ×\%,抄袭按 × 分计。} 缺交一次扣该次成绩的 20\%,抄袭该次作业按 0 分计。}
\grditem{点名(\grdattend\%)}{:随机抽查出勤,缺席一次扣 × 分, \grditem{点名(\grdattend\%)}{:随机抽查出勤,缺席一次扣 5 分,
累计缺席达 × 次者该项记 0 分。} 累计缺席达 3 次者该项记 0 分。}
\end{grdlist} \end{grdlist}
\grdpara{\textbf{期末考试成绩}(占理论课 \grdfinal\%):闭卷笔试, \grdpara{\textbf{期末考试成绩}(占理论课 \grdfinal\%):闭卷笔试,
@@ -182,7 +192,7 @@
\ifnum\grdwithini=1 \ifnum\grdwithini=1
\grdsec{三、成绩评定与异议} \grdsec{三、成绩评定与异议}
\grdpara{总成绩按上述各项加权求和后,按学校规定的成绩记载办法取整记入。 \grdpara{总成绩按上述各项加权求和后,按学校规定的成绩记载办法取整记入。
学生对成绩有异议的,可在成绩公布后 × 个工作日内向开课单位提出书面复核 学生对成绩有异议的,可在成绩公布后 5 个工作日内向开课单位提出书面复核
申请,逾期不再受理。} 申请,逾期不再受理。}
\fi \fi
+195
View File
@@ -0,0 +1,195 @@
# 教材
教材、专著的成书排版,A4 多页,含封面、目录、章节、附录、参考文献。
## 编译
```bash
cd 教材
xelatex 教材.tex
bibtex 教材
xelatex 教材.tex
xelatex 教材.tex
```
或仓库根:`bash build.sh 教材`(自动依次跑完,含 bibtex)
## 文件
| 文件 | 说明 |
|---|---|
| `教材.tex` | 主文件,书名与正文改这里 |
| `ouctextbook.sty` | 版式配置 |
| `elegantbook.cls` | 文档类 |
| `reference.bib` | 参考文献库,换成自己的 |
| `cover.jpg` | 封面图,换成自己的或删掉 |
## ⚠️ 前两行不能动
```latex
\documentclass[lang=cn,newtx,10pt,black,chinesefont=nofont]{elegantbook}
\input{../fonts.tex}
```
- `chinesefont=nofont` 必须写,否则会去加载系统字体或商业字体,跨平台不一致
- `\input{../fonts.tex}` 必须在 `\documentclass` 之后、`\begin{document}` 之前
## 书名信息
```latex
\title{教材模板示例}
\subtitle{副标题写在这里}
\author{作者甲 \quad 作者乙 \quad 作者丙}
\institute{中国海洋大学}
\date{2026/11/1}
\version{第一版}
\extrainfo{出版社}
```
| 命令 | 说明 |
|---|---|
| `\title{}` | 书名 |
| `\subtitle{}` | 副标题 |
| `\author{}` | 作者,多人用 `\quad` 隔开 |
| `\institute{}` | 单位 |
| `\date{}` | 日期 |
| `\version{}` | 版本 |
| `\extrainfo{}` | 出版社 |
### 封面图
不放图就只要纯色带封面。要放图:
```latex
\cover{cover.jpg}
```
图片放进本目录。
### 封面色
默认青绿 RGB(32,178,170)。要换颜色,正文里调:
```latex
\oucSetCoverColor{blue}
```
## 文档结构
```latex
\begin{document}
\maketitle % 标题页
\frontmatter % 前置部分,页码用罗马数字
\tableofcontents % 目录
\chapter*{前言} % 前言(不进编号)
\mainmatter % 正文,页码用阿拉伯数字
\chapter{第一章}
...
\appendix % 附录,章号变 A、B、C
\chapter{附录一}
\nocite{*}
\printbibliography[heading=bibintoc, title=\ebibname]
\end{document}
```
## 章的标准写法
```latex
\chapter{章节标题}
本章导语,3~5 段,概述本章要解决的问题与结构。
\section{节标题}
正文段落。
\subsection{小节标题}
\subsubsection{小小节标题}
\paragraph{第五级标题}
这一级用「(1)(2)(3)」编号。
\oucsummary
本章小结正文。
\oucexercises
\begin{enumerate}
\item 习题一。
\end{enumerate}
```
| 命令 | 说明 |
|---|---|
| `\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` 重置。
## 参考文献
```latex
\addbibresource[location=local]{reference.bib} % 导言区
\nocite{*} % 正文末尾,引用全部条目
\printbibliography[heading=bibintoc, title=\ebibname]
```
`\nocite{*}` 表示列出文献库里全部条目。正式写作时删掉它,只列实际引用的。
`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) 青绿
页码:前置罗马数字,正文阿拉伯数字
```
## 注意
示例内容为占位文字,使用时全部替换。
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

+1489
View File
File diff suppressed because it is too large Load Diff
+224
View File
@@ -0,0 +1,224 @@
%======================================================================
% 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}、
% 溢出量死钉在 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.
+224
View File
@@ -0,0 +1,224 @@
%======================================================================
% 中国海洋大学 教材 模板(示例)
%
% 从《软件需求工程导论》(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{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}
+154
View File
@@ -0,0 +1,154 @@
# 点名册
中国海洋大学课程点名册,A4 横向,20 列考勤表。
## 编译
```bash
cd 点名册
xelatex 点名册.tex
```
或仓库根:`bash build.sh 点名册`
## 文件
| 文件 | 说明 |
|---|---|
| `点名册.tex` | 主文件,课程信息与学生名单改这里 |
| `oucroll.sty` | 版式包,一般不改 |
## 课程信息
```latex
\rollsetcourse{数字逻辑} % 课程名称
\rollsetcno{080502101231} % 课程号
\rollsetsno{25252029} % 选课号
\rollsetcredit{2.5} % 学分
\rollsetteacher{张远航} % 任课教师
\rollsetterm{2025 学年 秋 季学期} % 学年学期
```
| 命令 | 说明 |
|---|---|
| `\rollsetcourse{}` | 课程名称 |
| `\rollsetcno{}` | 课程号 |
| `\rollsetsno{}` | 选课号 |
| `\rollsetcredit{}` | 学分 |
| `\rollsetteacher{}` | 任课教师 |
| `\rollsetterm{}` | 学年学期 |
设完后调 `\rollinfo` 印出信息区:
```latex
\rolltitle{中国海洋大学点名册}
\rollsetcourse{数字逻辑}
...
\rollinfo
```
## 学生名单
每人一行,三列:序号、学号、姓名。后面 17 周留空手填。
```latex
\begin{rolltable}
\rollrow{1}{2525201001}{陈嘉禾}
\rollrow{2}{2525201002}{丁若彤}
...
\end{rolltable}
```
| 参数 | 说明 |
|---|---|
| 第 1 个 | 序号 |
| 第 2 个 | 学号 |
| 第 3 个 | 姓名 |
增删学生就增删 `\rollrow` 行。
## 一页能放多少行
A4 横向(297 × 210mm),上下边距 14/16mm,扣掉标题、课程信息、表头:
| 行高 | 一页行数 |
|---|---|
| 5.0mm | 27 行 |
| 4.5mm(默认) | 30 行 |
| 4.2mm | 33 行 |
超过这个数会溢出到第二页。要放更多学生,两个办法:
1. 改 `oucroll.sty` 里 `row{2-Z}={ht=4.5mm}` 的行高
2. 分两页,每页 30 人,第二页重复表头
## 表头
20 列表头依次是:序号、学号、姓名、1、2、3 …… 17。
周次列只写数字,不写「第 N 周」,因为横向空间有限。
改列宽或改周数,编辑 `oucroll.sty`:
```latex
\newcommand{\rollwno}{9mm} % 序号
\newcommand{\rollwid}{26mm} % 学号
\newcommand{\rollwname}{20mm} % 姓名
\newcommand{\rollwweek}{11.4734mm} % 每周
```
**改列宽时必须重算**,让总和恰好等于版心宽:
```
版心 = 297 − 14×2 = 269mm
表宽 = Σwd + 2×0.4×20(colsep)+ 0.4pt×20(竖线) = Σwd + 18.82mm
∴ Σwd = 269 − 18.82 = 250.18mm
```
## 表尾说明
```latex
\rollfoot{标记方式自行约定(如「√」出席、「缺」缺席、「假」请假)。}
```
不要就删掉这一行。
## 版式
```
A4 横向 297 × 210 mm
边距 左右 14mm,上 12mm,下 16mm
标题 20pt 黑体居中
课程信息 10.5pt,两行三项,三栏定宽对齐
表格 20 列 × (1 表头 + N 数据行)
表头行高 7.0mm,数据行高 4.5mm
正文 10.5pt,表头 8pt,表体 10pt
不排页码
```
### 课程信息的对齐
六项按两行三栏排,栏位固定:
```
课程名称:xxx 课程号:xxx 选课号:xxx
学分:xxx 任课教师:xxx 学年学期:xxx
```
每栏宽 89.67mm(版心 269mm 三等分),标签占 18mm,值占 63.67mm。
上下两行的冒号位置严格对齐。
值超过 17 个汉字会自动折行,不会压到下一栏。要调整栏宽或标签宽度,
改 `oucroll.sty`:
```latex
\setlength{\rollcolw}{89.6667mm} % 每栏宽
\setlength{\rolllabw}{18mm} % 标签宽
\setlength{\rollvalw}{63.6667mm} % 值宽
```
三者关系:`rollvalw = rollcolw − rolllabw − 8mm`(8mm 是栏间余量)。
## 注意
示例学生名单是虚构数据,使用时全部替换。
+215
View File
@@ -0,0 +1,215 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{oucroll}[2026/11/03 v1.0 OUC roll-call sheet]
%======================================================================
% oucroll.sty —— 点名册版式包
%
% 横版 A4,20 列表格:序号 / 学号 / 姓名 / 第1~17周
% 用法见同目录 README.md
%======================================================================
\RequirePackage{geometry}
\RequirePackage{fontspec}
\RequirePackage{xeCJK}
\RequirePackage{tabularray}
\RequirePackage{calc}
%======================================================================
% 一、页面:A4 横向
%======================================================================
\geometry{
paperwidth = 297mm,
paperheight = 210mm,
left = 14mm,
right = 14mm,
top = 12mm,
bottom = 16mm,
headheight = 0pt,
headsep = 0pt,
footskip = 8mm,
}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt}
\pagestyle{empty} % 点名册单页,不排页码
\input{../fonts.tex}
%======================================================================
% 二、字号
%======================================================================
\newcommand{\rollbasefont}{%
\linespread{1}\relax
\fontsize{10.5bp}{13bp}\selectfont}
\newcommand{\rolltitlefont}{\linespread{1}\relax\fontsize{20bp}{24bp}\selectfont}
\newcommand{\rollinfofont} {\linespread{1}\relax\fontsize{10.5bp}{15bp}\selectfont}
\newcommand{\rollheadfont} {\linespread{1}\relax\fontsize{8bp}{9.5bp}\selectfont}
\newcommand{\rollcellfont} {\linespread{1}\relax\fontsize{10bp}{12.5bp}\selectfont}
\newcommand{\rollweekfont} {\linespread{1}\relax\fontsize{7.5bp}{9bp}\selectfont}
%======================================================================
% 三、列宽
%
% 版心宽 269mm(297 − 14×2)。
% tabularray 的实际表宽 = Σwd + 2×colsep×列数 + 竖线宽×列数
% 20 列时:2×0.4×20 = 16.00mm,竖线 0.4pt×20 = 2.82mm,共 18.82mm
% 故 Σwd 只能取 269 − 18.82 = 250.18mm
%
% 序号 9 + 学号 26 + 姓名 20 = 55mm
% 余 195.18mm 分给 17 周,每周 11.4810mm
%======================================================================
\newcommand{\rollrule}{0.4pt}
\newcommand{\rollcolsep}{0.4mm}
\newcommand{\rollwno}{9mm} % 序号
\newcommand{\rollwid}{26mm} % 学号
\newcommand{\rollwname}{20mm} % 姓名
\newcommand{\rollwweek}{11.4734mm} % 每周
%======================================================================
% 四、课程信息
%
% \rollinfo{课程名称}{数值}
% 信息行按「标签 + 值」成对排版,一行放三项。
%======================================================================
\newcommand{\rollcourse}{} % 课程名称
\newcommand{\rollcno}{} % 课程号
\newcommand{\rollsno}{} % 选课号
\newcommand{\rollcredit}{} % 学分
\newcommand{\rollteacher}{} % 任课教师
\newcommand{\rollterm}{} % 学年学期
\newcommand{\rolldept}{} % 开课单位
\newcommand{\rollsetcourse}[1]{\renewcommand{\rollcourse}{#1}}
\newcommand{\rollsetcno}[1]{\renewcommand{\rollcno}{#1}}
\newcommand{\rollsetsno}[1]{\renewcommand{\rollsno}{#1}}
\newcommand{\rollsetcredit}[1]{\renewcommand{\rollcredit}{#1}}
\newcommand{\rollsetteacher}[1]{\renewcommand{\rollteacher}{#1}}
\newcommand{\rollsetterm}[1]{\renewcommand{\rollterm}{#1}}
\newcommand{\rollsetdept}[1]{\renewcommand{\rolldept}{#1}}
%======================================================================
% 五、标题
%======================================================================
\newcommand{\rolltitle}[1]{%
\par\begingroup\centering
{\heiti\rolltitlefont #1\par}%
\endgroup\vspace*{2mm}}
%======================================================================
% 六、课程信息区
%
% 两行 × 三栏,定宽对齐。
%
% ⚠️ 不能用 \hfill 均分:\hfill 只均分行内剩余空间,各栏起点会随
% 标签与值的长短前后漂移,六项在两行里对不上。
%
% ⚠️ 值用 \parbox 显式限宽,不用 tabular 的 p 列。
% p 列在 xeCJK 下遇到全角标点(如「(」)时断行判定不稳定,
% 实测同样列宽,有的内容断、有的不断。\parbox 加 \raggedright
% 断行行为可预期。
%======================================================================
\newlength{\rollcolw}
\setlength{\rollcolw}{89.6667mm} % 269mm / 3
\newlength{\rolllabw}
\setlength{\rolllabw}{18mm} % 标签宽,「学年学期」四字 × 10.5bp ≈ 14.8mm
\newlength{\rollvalw}
\setlength{\rollvalw}{63.6667mm} % 值宽 = 89.6667 − 18 − 8(栏间余量)
% 一栏:标签(定宽黑体)+ 冒号 + 值(定宽,超长自动换行)
%
% ⚠️ 值必须加 \sloppy。xeCJK 对全角标点(如「(」)前后有断行禁则,
% 正常断行惩罚下 TeX 宁可溢出也不在此处断,表现为文字压到下一栏。
% \sloppy 放宽 \tolerance,让它在下一个汉字边界断掉。
\newcommand{\rollfield}[2]{%
\makebox[\rolllabw][l]{\heiti #1}%
\parbox[t]{\rollvalw}{\raggedright\sloppy :#2}}
% 三栏一行
\newcommand{\rollinforow}[6]{%
\noindent
\rollfield{#1}{#2}\hspace*{8mm}%
\rollfield{#3}{#4}\hspace*{8mm}%
\rollfield{#5}{#6}\par}
\newcommand{\rollinfo}{%
\begingroup\rollinfofont
\rollinforow{课程名称}{\rollcourse}%
{课程号}{\rollcno}%
{选课号}{\rollsno}%
\vspace*{1.2mm}%
\rollinforow{学分}{\rollcredit}%
{任课教师}{\rollteacher}%
{学年学期}{\rollterm}%
\endgroup\vspace*{2.5mm}}
%======================================================================
% 七、周次表头
%
% 「第 1 周」写成「1」,表头下方一行标注「周次」,这样表头只占
% 一行高度,横向也省空间 —— 20 列挤在一行里,竖排会撑高表头。
%======================================================================
\newcommand{\rollweekhead}[1]{%
{\heiti\rollheadfont #1}}
%======================================================================
% 八、表格环境
%
% 20 列:3 固定 + 17 周
% 表头单行:序号 / 学号 / 姓名 / 1 / 2 / … / 17
%======================================================================
\newcounter{rollrow}
\newenvironment{rolltable}{%
\par\begingroup\rollcellfont
\begin{tblr}[label=none, expand=\rollrow]{
colspec={
Q[c,m,wd=\rollwno]
Q[c,m,wd=\rollwid]
Q[c,m,wd=\rollwname]
*{17}{Q[c,m,wd=\rollwweek]}
},
colsep=\rollcolsep, rowsep=0pt, stretch=0,
hline{1-Z}={\rollrule}, vline{1-Z}={\rollrule},
row{1}={ht=7.0mm},
row{2-Z}={ht=4.5mm},
}%
% ---- 表头 ----
{\heiti\rollheadfont 序号} &
{\heiti\rollheadfont 学号} &
{\heiti\rollheadfont 姓名} &
\rollweekhead{1} & \rollweekhead{2} & \rollweekhead{3} & \rollweekhead{4} &
\rollweekhead{5} & \rollweekhead{6} & \rollweekhead{7} & \rollweekhead{8} &
\rollweekhead{9} & \rollweekhead{10} & \rollweekhead{11} & \rollweekhead{12} &
\rollweekhead{13} & \rollweekhead{14} & \rollweekhead{15} & \rollweekhead{16} &
\rollweekhead{17} \\
}{%
\end{tblr}\par\endgroup}
%======================================================================
% 九、数据行
%
% \rollrow{序号}{学号}{姓名}
% 后面 17 个空格留给手填考勤。
%
% ⚠️ 必须用 \def 而不是 \newcommand:tblr 的 expand= 选项在读取
% 环境体时就展开,\newcommand 生成的宏不可展开,& 会被当成
% 「Misplaced alignment tab」报错。
%======================================================================
\def\rollrow#1#2#3{%
#1 & #2 & #3 &
& & & & & & & & & & & & & & & & \\
}
%======================================================================
% 十、脚注(可选)
%======================================================================
\newcommand{\rollfoot}[1]{%
\par\vspace*{2mm}%
\begingroup\rollinfofont{\heiti 说明:}#1\par\endgroup}
\AtBeginDocument{\rollbasefont}
\endinput
Binary file not shown.
+58
View File
@@ -0,0 +1,58 @@
\documentclass[UTF8,fontset=none]{ctexart}
\usepackage{oucroll}
%======================================================================
% 点名册
%
% 编译:在本文目录下 xelatex 点名册.tex
%======================================================================
\begin{document}
\rolltitle{中国海洋大学点名册}
\rollsetcourse{数字逻辑}
\rollsetcno{080502101231}
\rollsetsno{25252029}
\rollsetcredit{2.5}
\rollsetteacher{张远航}
\rollsetterm{2025 学年 秋 季学期}
\rollinfo
\begin{rolltable}
\rollrow{1}{2525201001}{陈嘉禾}
\rollrow{2}{2525201002}{丁若彤}
\rollrow{3}{2525201003}{方志远}
\rollrow{4}{2525201004}{高文轩}
\rollrow{5}{2525201005}{郭思远}
\rollrow{6}{2525201006}{韩雨桐}
\rollrow{7}{2525201007}{何书宁}
\rollrow{8}{2525201008}{胡锦程}
\rollrow{9}{2525201009}{黄语晨}
\rollrow{10}{2525201010}{蒋心怡}
\rollrow{11}{2525201011}{孔令仪}
\rollrow{12}{2525201012}{李明哲}
\rollrow{13}{2525201013}{林可欣}
\rollrow{14}{2525201014}{刘慕思}
\rollrow{15}{2525201015}{陆承宇}
\rollrow{16}{2525201016}{罗嘉懿}
\rollrow{17}{2525201017}{马雨欣}
\rollrow{18}{2525201018}{苗梓涵}
\rollrow{19}{2525201019}{倪瑞泽}
\rollrow{20}{2525201020}{潘书瑶}
\rollrow{21}{2525201021}{彭亦凡}
\rollrow{22}{2525201022}{钱家豪}
\rollrow{23}{2525201023}{秦若雯}
\rollrow{24}{2525201024}{沈靖宇}
\rollrow{25}{2525201025}{苏瑾瑜}
\rollrow{26}{2525201026}{孙牧之}
\rollrow{27}{2525201027}{谭心悦}
\rollrow{28}{2525201028}{汤子墨}
\rollrow{29}{2525201029}{汪雨桐}
\rollrow{30}{2525201030}{王浩然}
\end{rolltable}
\rollfoot{标记方式自行约定(如「√」出席、「缺」缺席、「假」请假)。}
\end{document}
+98
View File
@@ -0,0 +1,98 @@
# 特殊事项说明表
中国海洋大学报销用特殊事项说明表,A4 单页,含事项描述与三级签字审批。
## 编译
```bash
cd 特殊事项说明表
xelatex 特殊事项说明表.tex
```
或仓库根:`bash build.sh 特殊事项说明表`
## 文件
| 文件 | 说明 |
|---|---|
| `特殊事项说明表.tex` | 主文件,填内容改这里 |
| `ouccsx.sty` | 版式包,一般不改 |
## 填写参数
全部在 `\begin{document}` 之前定义:
```latex
\newcommand{\sxdesc}{%
因渤海湾生态环境监测浮标需要例行维护,前往昌邑近岸观测站更换传感器……}
\newcommand{\sxdateA}{} % 项目负责人签字处日期
\newcommand{\sxdateB}{} % 单位负责人签字处日期
\newcommand{\sxdateC}{} % 科技管理部门签字处日期
```
| 参数 | 说明 |
|---|---|
| `\sxdesc` | 事项描述正文,可写多段(用 `\par` 分开) |
| `\sxdateA` | 项目负责人签字处日期 |
| `\sxdateB` | 单位负责人签字处日期 |
| `\sxdateC` | 科技管理部门签字处日期 |
### 日期怎么写
留空则印成「 年 月 日」供手写。要打印具体日期:
```latex
\newcommand{\sxdateA}{2026} % 只印年份
\newcommand{\sxdateA}{2026}{10}{28} % 但这不是正确写法
```
正确写法是用完整版命令(三参数版本,写在同一行的花括号内):
```latex
\newcommand{\sxdateA}{\sxdatefull{2026}{10}{28}}
```
要只印年份就用 `\newcommand{\sxdateA}{2026}`,其余留空手填。
## 生成的表格
`\sxform` 一条命令印出整个表:
```latex
\begin{document}
\sxform
\end{document}
```
表格内容:
| 区段 | 内容 |
|---|---|
| 标题 | 特殊事项说明表 |
| 事项描述 | `\sxdesc` 的内容,占主表区 |
| 签字栏 | 三处签字与日期 |
| 表尾 | 说明条款 |
## 常用命令
| 命令 | 用途 |
|---|---|
| `\sxform` | 印出整张表 |
| `\sxtitle{标题}` | 改主标题文字 |
| `\sxtable` | 只印表格部分(不含标题) |
| `\sxnotes` / `\sxnoteitem` | 表尾说明条目 |
| `\sxfootcontent` | 表尾内容 |
| `\sxfonttitle` / `\sxfontbody` / `\sxfontsign` / `\sxfontfoot` | 各区块字体设置 |
## 版式
```
A4,单页
标题黑体,正文宋体,签字栏楷体
三处签字:项目负责人 / 单位负责人 / 科技管理部门
```
## 注意
示例内容是虚构数据,使用时整段替换 `\sxdesc`。签字与日期栏留空手填。
+630
View File
@@ -0,0 +1,630 @@
%======================================================================
% ouccsx.sty — 中国海洋大学 特殊事项说明表 版式包
%
% 依据:报销相关/中国海洋大学特殊事项说明表.docx(Word 2007 保存)
% 目标:版式与逐项对齐;内容可随意增删而不破版。
%
% 尺寸换算:
% twips → pt : pt = twips / 20 (1 pt = 1/20 twip)
% twips → mm : mm = twips / 1440 * 25.4
% w:sz : 半磅值,÷ 2 即 pt
% w:line : 1/20 pt(lineRule="exact" 时即精确行距)
%
% ⚠️ 与 PDF 对齐的几何量一律用 bp(= 1/72 in,PDF 用户单位),
% 不用 pt(= 1/72.27 in)。两者差 0.375%,A4 上累积可达 2 pt,
% 超过一个字符宽,肉眼看得出。标注坐标者均为 PDF 坐标
% (左上原点、向下为正)。
%
% 用法见同目录 特殊事项说明表.tex,说明见 README.md
%======================================================================
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{ouccsx}[2026/10/28 v1.2 OUC special item statement form]
\RequirePackage{geometry}
\RequirePackage{fontspec}
\RequirePackage{xeCJK}
\RequirePackage{fancyhdr}
%======================================================================
% 1. 页面与版心
%
% sectPr:
% pgSz 11906 × 16838 twips = 210.02 × 297.05 mm → A4
% pgMar top 2155 / bottom 1985 twips = 38.01 / 35.00 mm
% left 1588 / right 1474 twips = 28.01 / 26.00 mm
%
% ------------------------------------------------------------------
% ⚠️⚠️ 本模板的版心【不是】docx 的版心,这是刻意的。
%
% 原表 tblW = 9613 twips = 169.54 mm = 480.65 bp,
% 而 docx 版心宽只有 210 − 28 − 26 = 156 mm。
% 表比版心宽 13.54 mm,靠 tblInd = −546 twips(−9.63 mm)向左顶出去。
%
% 坐标(Word 导出 PDF):
% 表格左边框 x = 46.70 bp,右边框 x = 527.35 bp(宽 480.65 ✓)
% 标题文字中心 x = 300.41 bp ← 居中于 docx 版心,不是居中于表格
%
% ⇒ 若把 geometry 设成 docx 版心(left 28 mm),表格必然超出版心
% 13.54 mm,报一条 Overfull \hbox,且改内容时位置会漂。
%
% ⇒ 本包把 geometry 的版心【直接设成表格宽度】:
% left = 16.47 mm (= 表格左边框)
% totalwidth = 169.54 mm (= 表格外宽)
% 表格正好填满版心,零 Overfull,位置与原件逐点相同。
%
% ⇒ 代价:标题若用 \centering 会落在 287.03 bp,原件在 300.41 bp,
% 偏左 13.4 bp。故标题另给偏移补回 docx 版心的中心(见第 5 节)。
%======================================================================
\newlength{\sxofficialleft} % docx 版心左界,仅用于换算
\setlength{\sxofficialleft}{28.01mm}
\newlength{\sxtblleft}
\setlength{\sxtblleft}{16.47mm}
\newlength{\sxtblw} % 表格外宽 = 版心宽
\setlength{\sxtblw}{169.54mm}
\geometry{
paperwidth = 210mm,
paperheight = 297mm,
left = 16.47mm, % = 表格左边框
totalwidth = 169.54mm, % = 表格外宽
% ⚠️ 坐标差:本包所有 y 都恒比原件小 0.14 bp(表顶线、备注、
% 页码全部同步偏移,是 top 与 PDF 线宽的取整差,不是各行的问题)。
% 从 top 里补掉,一次消除。
top = \dimexpr38.01mm+0.14bp\relax,
bottom = 35.00mm, % = docx pgMar bottom 1985 twips
headheight = 0pt,
headsep = 0pt,
footskip = 24.41bp,
}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt}
%======================================================================
% 2. 字体与字号
%
% 字号(w:sz 半磅值 ÷ 2):
% 大标题 44 → 22 pt / 表内正文 21 → 10.5 pt
% 签字日期 24 → 12 pt / 备注 21 → 10.5 pt / 页码 28 → 14 pt
%
% ⚠️⚠️⚠️ ctex 默认 \linespread ≈ 1.3,会把 \fontsize{10.5}{13.65}
% 的 13.65 pt 行距再放大 30% 变成 17.7 pt。本模板所有行距都来自
% docx 精确值,故每次设字号前必须先把 \linespread 归 1。
%
% ⚠️ 原标题用「方正小标宋简体」,商业字体,本库不分发(见根 README
% 的字体承诺)。按 课程执行大纲/ 的既定做法换成 OUC Serif 真粗体
% —— 小标宋本就是宋体的标题变体,真粗体比伪粗更接近,笔画不糊。
%======================================================================
\input{../fonts.tex}
\newcommand{\sxfonttitle}{%
\linespread{1}\relax\fontsize{22}{25}\selectfont}
\newcommand{\sxfontbody}{%
\linespread{1}\relax\fontsize{10.5}{13.65}\selectfont}
\newcommand{\sxfontsign}{%
\linespread{1}\relax\fontsize{12}{15.6}\selectfont}
\newcommand{\sxfontfoot}{%
\linespread{1}\relax\fontsize{14}{16.8}\selectfont}
%======================================================================
% 3. 表格的几何量
%
% 边框 tblBorders sz=4 → 0.5 pt(w:sz 是 1/8 pt,4/8)
% 内边距 tblCellMar left/right = 108 twips,top/bottom = 0
%
% 行高:trHeight 是 5091 / 1140 / 634 twips,hRule="atLeast",
% 但 atLeast 是「最小」,实际高度由内容撑开。故用取值:
% 四条横线中线 y = 172.99 / 457.49 / 516.34 / 573.64
% ⇒ 三段高 284.50 / 58.85 / 57.30(线中心距),
% 扣掉各一端的半线宽(0.249)得内容高 284.00 / 58.35 / 56.80。
% ⚠️ 不用 trHeight 的 254.55 / 57 / 31.7:R0 被 19 段撑到 284,
% R2 被 4 段撑到 56.8,照 trHeight 会让整表矮 40 bp。
%======================================================================
\newlength{\sxrule}
\setlength{\sxrule}{0.5pt} % = tblBorders sz 4/8
\newlength{\sxpad}
\setlength{\sxpad}{4.93bp} % 校到内容左界 52.08(实际52.11)
\newlength{\sxboxw} % 单元格内容盒宽(不含边框)
\setlength{\sxboxw}{\dimexpr\sxtblw-2\sxrule\relax}
% ⚠️⚠️ 段落折行的可用宽度 ≠ 盒宽。
% 折行可用宽 = \sxboxw − \sxpad − \sxbodypad。
% 原件内容左界 52.08、右界 521.89 ⇒ 可用宽 469.81 bp。
% ⚠️ 这 1.7 bp 是「折不折行」的临界。本表那句「项目负责人是科研经费
% 使用的直接责任人……」共 47 字,在 471.5 bp 里能挤成一行,
% 在 469.81 bp 里必须折行 —— 原件是两行。差一行 = 13.56 bp,
% R0 下半全部内容上移 16.5 bp,肉眼一看就错。
\newlength{\sxbodypad}
\setlength{\sxbodypad}{6.65bp} % = 481.388 − 4.948 − 469.81
\newlength{\sxrowa}
\setlength{\sxrowa}{284.00bp}
\newlength{\sxrowb}
\setlength{\sxrowb}{58.35bp}
\newlength{\sxrowc}
\setlength{\sxrowc}{56.80bp}
%======================================================================
% 4. 行定位体系(全文件的核心)
%
% ⚠️⚠️⚠️ 本表的行距**不能**用 \baselineskip 控制。改之前先读这段。
%
% 【坑一】\baselineskip 只在**同一段落内部**管行距。
% 本表行距逐行不同(15.24 / 15.48 / 14.04 / 13.56 / 13.68),
% 因为 10.5 pt 与 12 pt 的字混排,Word 按「下一行字号 × 1.3」算。
% 最初每行 \par 之后单独给 \baselineskip,**完全无效**:
% 所有行距被压成 13.51,12 pt 的签名行没变高,整表矮 2.25 bp。
% 原因:每行 \par 自成一段后,段间基线距离 = 上段末行深度 +
% \parskip + 本段首行字高,\baselineskip 根本没被读到。
%
% 【正解】不依赖 \baselineskip,逐行显式插胶:
%
% 基线距 = 上盒深度 + \kern + 本盒高度
% ⇒ \kern = 目标距 − 上盒深度 − 本盒高度
%
% 与字体度量彻底解耦:换字体、换字号、描述写长写短,行距不变。
%
% 【坑二】块首行必须用 \kern,不能用 \vskip。
% TeX 会【丢弃 \vbox 开头的胶】,用 \vskip 给的顶距静默消失
% (实际「事项描述:」给 10.53 只落到 5.38,等于只剩字高)。
% \kern 不受这条约束,且照样计入盒高。
%
% 【坑三】必须允许负的 \kern。
% 相邻行的目标距可能小于「上盒深度 + 本盒高度」(如年月日行
% 12 pt 字目标 14.04,而 2.99 + 12.06 = 15.05),差值是 −1.01。
% 最初加了 `\ifdim>0` 守卫,负值被吞 → 该行退回自然距 15.05,
% 整块错位 10 bp。负 \kern 在 TeX 里完全合法,不该挡。
%
% 【坑四】多行段落的 \ht 参照的是**末行**基线,不是首行。
% \vbox 的 \ht = 首行高度 + (n−1)·行距,它的参考点是末行基线。
% 所以「上一行基线 → 本段首行基线」的距离不是 pd + kern + ht,
% 而是 pd + kern + ht − (n−1)·行距。漏掉这一项,
% 多行段自己会被推下一整行,其后所有行跟着错(实际0.48 而非 14.04)。
% ⇒ 用 \prevgraf 取段内行数,把 (n−1)·行距加回 kern。
% ⚠️ \dp 不用改:\vbox 的 \dp 就是末行的真实深度。
%
% 【坑五】\offinterlineskip 会继承进段落内部。
% 它把 \lineskiplimit 设成极小值,段内多行改走 \lineskip(=0),
% \baselineskip 又被架空(行距只剩 10.81 而非 13.56)。
% ⇒ 段落内部必须显式恢复 \lineskiplimit / \lineskip。
%======================================================================
\newbox\sx@boxa
\newbox\sx@boxb
\newbox\sx@boxc
\newdimen\sx@pd % 上一行的真实末行深度
\newdimen\sx@tmp
\newdimen\sx@boxd
\newdimen\sx@pgd % 段内中间各行推进总量(\prevgraf 必须先存出来)
\newif\ifsx@first % 是否块内第一行
\newcommand{\sx@blstart}{%
\offinterlineskip
\topskip=\z@
\sx@pd=\z@
\sx@firsttrue}
% \sx@bl[底深]{与上一行基线的距离}{行内容}
%
% #1(可选)= 本行盒的最小深度。块末行用它留出「基线 → 格底」的空白
% —— TeX 丢弃 \vbox 末尾的胶,不能用 \kern 补。
% #2 = 与上一行基线的距离;块第一行则是「块顶 → 首行基线」。
% #3 = 行内容(水平模式),参照点是单元格内容左界。
% #2 = 与上一行基线的距离;块第一行则是「块顶 → 首行基线」,
% 给 0 表示「首行自然贴块顶、只留字高」。
% 后者用于 R0 下半块:那块是贴格底的,全部位置由
% 「末行深度 + 逐行行距」反推出来,再给绝对顶距就重复
% 定位了(实际多给 208.89,整块下移 66.90)。
\newcommand{\sx@bl}[3][\z@]{%
\setbox\sx@boxc=\hbox to \sxboxw{\hskip\sxpad #3\hss}%
\ifsx@first
\sx@firstfalse
\kern\dimexpr\ifdim#2>\z@#2-\fi\ht\sx@boxc\relax
\else
\kern\dimexpr#2-\sx@pd-\ht\sx@boxc\relax
\fi
\ifdim\dp\sx@boxc<#1 \dp\sx@boxc=#1\relax \fi
\sx@pd=\dp\sx@boxc
\box\sx@boxc}
% \sx@blp[底深]{与上一行基线的距离}{段内行距}{段落内容}
%
% 与 \sx@bl 同一套定位规则,但内容是可折行的段落(用于那两句长话)。
%
% ⚠️⚠️ \vbox 的 \ht 参考点是**末行基线**,不是首行(坑四)。
% 故 kern 里要把 (n−1)·行距 加回去,否则整个多行段被推下一整行。
% \dp 不用改 —— \vbox 的 \dp 就是末行的真实深度。
\newcommand{\sx@blp}[4][\z@]{%
\setbox\sx@boxc=\vbox{%
\hsize=\sxboxw
\leftskip=\sxpad
\rightskip=\sxbodypad
\parindent=\z@
\parskip=\z@
\lineskiplimit=\z@ % ← 抵消外层 \offinterlineskip(坑五)
\lineskip=\z@
\baselineskip=#3\relax
\noindent #4\par
% ⚠️⚠️ \prevgraf 有两道坎:
% ① 必须在 vbox **内部**取 —— 它是「当前正在排的段落行数」,
% vbox 一关闭就恢复成外层值(实际把 2 读成 0)。
% ② 必须在 \par **之后**取 —— \prevgraf 是在段落断行那一步
% 才被写入的,\par 之前读到的还是旧值(实际仍为 0)。
\global\sx@pgd=\dimexpr\numexpr\prevgraf-1\relax\dimexpr#3\relax\relax}%
% 中间各行的推进总量
\sx@tmp=\sx@pgd
\ifsx@first
\sx@firstfalse
% 块首行的 #2 直接是「块顶 → 首行基线」,不需要再扣多行推进量:
% 多行段的 \ht 已经包含了「首行基线 → 末行基线」的全部推进,
% 而首行基线本身与段有几行无关。加回 pgd 会把首行推下一整行
% (实际描述两行偏 +10.39)。
\kern\dimexpr\ifdim#2>\z@#2-\fi\ht\sx@boxc\relax
\else
\kern\dimexpr #2+\sx@tmp-\sx@pd-\ht\sx@boxc\relax
\fi
\ifdim\dp\sx@boxc<#1 \dp\sx@boxc=#1\relax \fi
\sx@pd=\dp\sx@boxc
\box\sx@boxc}
% 签名下划线:长 #1、线宽 0.4 pt(Word underline,比表格线细)
\newcommand{\sx@rule}[1]{%
\rule[-0.55mm]{#1}{0.4pt}}
%----------------------------------------------------------------------
% \sx@put{偏移}{内容} —— 在「内容左界 + 偏移」处放置内容
%
% 原件的签名行、年月日全靠敲空格凑位置(R0 签名前是 30 个 14 pt 空格),
% 换台机器字号一改就散架。这里按实际x 坐标绝对定位,不随字体漂移。
%
% ⚠️⚠️ 用 \rlap(= \hbox to 0pt{...\hss})而非 \makebox[0pt][l]:
% 两者都是零宽盒左对齐,但 \makebox 内容超宽会报 Overfull \hbox
% (签名下划线 84 bp 必然超),\rlap 末尾有 \hss 吸收,静默通过。
% 因零宽,一行串多个 \sx@put 时共用同一原点,偏移各自独立。
%
% 偏移 = 「Word 导出 PDF 实际x」− 52.08(内容左界)
%----------------------------------------------------------------------
\newcommand{\sx@put}[2]{%
\rlap{\hspace*{#1}#2}}
%----------------------------------------------------------------------
% 单元格装配
%
% \sx@cellbl{高度}{块内容} 内容贴顶,不足高度补在底部(= trHeight atLeast)
\newcommand{\sx@cellbl}[2]{%
\setbox\sx@boxa=\vbox{\sx@blstart #2}%
\ifdim\dimexpr\ht\sx@boxa+\dp\sx@boxa\relax<#1
\vbox to #1{\box\sx@boxa\vfil}%
\else
\box\sx@boxa
\fi}
% \sx@cellvf{高度}{上半}{下半} 中间 \vfil 撑开 ⇒ 下半贴格底
%
% ⚠️⚠️ 非直觉之处:
% 最初写「先 \setbox 量内容,再 \vbox to <高>{\box\sx@box\vfil}」,
% 结果 R0 的「兹证明」跑到描述正下方(y=261.95,原件 382.13),
% 整块偏高 120 bp。
% 原因:\vbox{...\vfil} **被测量的那一刻** \vfil 就塌成 0
% (vbox 无目标高度,末端胶只能为 0)。再套壳时剩余胶只能加在
% 整体之后 → 变成「内容贴顶、空白在底」,与想要的正好相反。
% 正解:让 \vfil 与上下两半【同处一个有目标高度的 \vbox 里】。
\newcommand{\sx@cellvf}[3]{%
\setbox\sx@boxa=\vbox{%
\hsize=\sxboxw
\leftskip=\sxpad
\rightskip=\sxpad
\parindent=\z@
\parskip=\z@
#2}%
\setbox\sx@boxb=\vbox{\sx@blstart #3}%
% ⚠️⚠️ 末尾那个 \vskip\z@ 不能省。
% \vbox to N 设定的是**高度**,深度另计:若最后一项是 \box\sx@boxb
% 且它自带深度(本表末行深 3.11),则 vbox 的 \dp = 3.11,
% 总高变成 N + 3.11,整行高三点一一,四条横线全部下移
% (实际R0 = 287.11 而非 284.00)。
% 补一条零高胶让末项变成胶(胶无深度),\dp 归零,
% 总高才正好等于 N。
\ifdim\dimexpr\ht\sx@boxa+\ht\sx@boxb+\dp\sx@boxb\relax<#1
\vbox to #1{\box\sx@boxa\vfil\box\sx@boxb\vskip\z@}%
\else
\vbox{\box\sx@boxa\vfil\box\sx@boxb}%
\fi}
%======================================================================
% 5. 标题
%
% :22 pt 小标宋(→ 宋体真粗体),居中,标题段行距 25 pt。
% 文字中心 x = 300.41 bp,基线 y = 147.65。
%
% ⚠️⚠️ 为什么不能直接 \centering:
% 本包版心 16.47~186.01 mm,中心 287.03 bp;
% 标题要居中的是 docx 版心 28.01~184.01 mm,中心 300.41 bp。
% 两者差 13.4 bp,直接居中会左偏 4.7 mm。
% 正解:先 \hspace* 推到 docx 版心左界,再用一个正好等于
% docx 版心宽的 \makebox 居中。右边不会溢出:
% 11.54 + 156 = 167.54 mm < 169.54 mm。
%======================================================================
\newlength{\sxtitleindent}
\setlength{\sxtitleindent}{\dimexpr\sxofficialleft-\sxtblleft\relax}
\newlength{\sxtitlewidth}
\setlength{\sxtitlewidth}{156mm}
% 微调:标题中心原偏右 0.60 bp(字形宽度差所致)
\newlength{\sxtitlefix}
\setlength{\sxtitlefix}{-0.60bp}
% 标题前/后竖直距离(由 PDF 实际反推,见 README「实际记录」)
% ⚠️ 这两个值必须成对调:\sxprespace 在标题前、\sxpostspace 在标题后,
% 单独改一个会把标题与表格的间距一起改掉。标定见 README。
\newlength{\sxprespace}
\setlength{\sxprespace}{10.07bp}
\newlength{\sxpostspace}
\setlength{\sxpostspace}{21.09bp}
\newcommand{\sxtitle}[1]{%
\par\begingroup
\vspace*{\sxprespace}%
\noindent
\hspace*{\dimexpr\sxtitleindent+\sxtitlefix\relax}%
\makebox[\sxtitlewidth][c]{%
\sxfonttitle\songti\bfseries #1}%
\par\vspace*{\sxpostspace}%
\endgroup}
%======================================================================
% 6. 表格主体
%
% 原表是**单列 3 行**(tblGrid 只有一个 gridCol),即三行整宽方框上下叠。
% 没有合并单元格、没有多列,不需要 tabularray —— 手工 \vbox 叠三块
% 反而更可控:行高精确、内线不重复、内容可用 \vfil 撑。
% 外框 \framebox,两条内线 \hrule(各占 \sxrule)。
%======================================================================
\newcommand{\sxtable}{%
\par\noindent
\begingroup
\setlength{\fboxsep}{0pt}%
\setlength{\fboxrule}{\sxrule}%
\framebox[\sxtblw]{%
\vbox{%
\hsize=\sxboxw
\sx@rowa@box
\hrule height \sxrule
\sx@cellbl{\sxrowb}{\sx@rowB}%
\hrule height \sxrule
\sx@cellbl{\sxrowc}{\sx@rowC}%
}%
}%
\par\endgroup}
%======================================================================
% 7. 三行内容的装配
%
% 三行里的固定话术(「兹证明该事项真实有效……」等)是学校规定原文,
% **不要在 .tex 里改**;它们在这里装配好,.tex 只提供要人填的几项:
% \sxdesc 事项描述正文(必填)
% \sxdateA 项目负责人签字处日期(留空则印「 年 月 日」)
% \sxdateB 单位负责人签字处日期
% \sxdateC 科技管理部门签字处日期
%
% ⚠️ 为什么不让 .tex 改整行:原件里这些行全靠敲空格对齐,一旦让
% 用户自己写,每人写出来都不一样,模板就失去意义。这里按实际
% x 坐标把固定部分钉死,.tex 只需填描述与日期。
%
% ------------------------------------------------------------------
% R0 纵向结构(全表最麻烦的一处)
%
% R0 共 19 段:1「事项描述:」/ 2~3 空 / 4 描述正文 /
% 5~12 八个空段(给手写留白)/ 13 空 / 14「兹证明…」/ 15 签名 /
% 16 年月日 / 17「项目负责人是…」/ 18「非科研经费…」
%
% 那 8 个空段是**手写留白**。本模板把描述改成排字(\sxdesc),
% 它们就成了死间距:描述写短了下面一大片空白,写长了把签名区顶到下一行。
% ⇒ 删掉,改用「上下两半 + 中间 \vfil」:
% 描述短 → 空白落在两半之间,签名区不动
% 描述长 → 空白被吃掉,签名区仍然不动
% 这是本模板比原件更稳的地方。
% ⚠️ 但 \vfil 不能无限压:描述特别长时签名区会挤出行外。
% 这是内容超量的正常表现(Word 里也一样),不是 bug。
%
% ------------------------------------------------------------------
% 实际基线(PDF 绝对 y;Δ 为与上一行的基线距)
%
% R0(顶线 172.99,内容顶 173.24)
% 事项描述 183.77 (10.53)
% 描述首行 227.81 (54.57) ← 段内行距 13.68
% 兹证明 382.13 (208.89)
% 项目负责人 397.37 (Δ15.24)
% 年月日 412.85 (Δ15.48)
% 项目负责人是 426.89 (Δ14.04) ← 段内行距 13.56
% 责任。 440.45 (Δ13.56)
% 非科研经费 454.13 (Δ13.68) 末行深 3.11
%
% R1(顶线 457.49,内容顶 457.74)
% 本人证明 468.29 (10.55)
% 单位负责人 483.41 (Δ15.12)
% 年月日 498.89 (Δ15.48)
% 学院 512.93 (Δ14.04) 末行深 3.16
%
% R2(顶线 516.34,内容顶 516.59)
% 科技管理 527.09 (10.50)
% 负责人签字 554.33 (Δ27.24) ← 原件一个空段,留写字空间
% 年月日 569.93 (Δ15.60) 末行深 3.46
%======================================================================
%----------------------------------------------------------------------
% 日期行
%
% 原件「 年 月 日」,三字间隔**各处不同**:
% R0 370.08 / 412.08 / 454.08 步长 42 / 42
% R1 400.08 / 442.08 / 484.08 步长 42 / 42
% R2 424.08 / 454.08 / 478.08 步长 30 / 24 ← 这格右边距紧
%
% ⚠️⚠️ 两个坑:
% ① 原来用 \makebox[12pt][l] + \hspace{步长−12pt} 拼步长,
% 12 pt(12.045 bp)与 42 pt(42.157 bp)混减,每字累积
% 0.16 bp,第三个字偏出 1.6 bp。
% ② 原来年份用 \makebox[12pt][l]{#1},即使 #1 为空**仍占 12 pt**,
% 把「年」推出 30 pt,整组右移 28.67 bp。
% ⇒ 三字全用 \sx@put 绝对定位,不积累、不占位;年份用右对齐
% \makebox 挂在「年」左边,空着就整块不出。
%
% \sx@dateline{年份}{年 x}{月 x}{日 x}
%----------------------------------------------------------------------
\newcommand{\sx@ifempty}[1]{\if\relax\detokenize{#1}\relax}
\newcommand{\sx@dateline}[4]{%
\sx@ifempty{#1}\else
\sx@put{\dimexpr#2-26bp\relax}{\makebox[24bp][r]{#1}}%
\fi
\sx@put{#2}{年}%
\sx@put{#3}{月}%
\sx@put{#4}{日}}
%----------------------------------------------------------------------
% R0 —— 事项描述 + 项目负责人签字
%----------------------------------------------------------------------
\newcommand{\sx@rowa@box}{%
\sx@cellvf{\sxrowa}%
{\sxfontbody\songti
\sx@blstart
\sx@bl{10.53bp}{事项描述:}%
\sx@blp{44.04bp}{13.68bp}{\sxdesc}}%
{\sxfontbody\songti
\sx@blstart
\sx@bl{0bp}{\sx@put{31.56bp}{兹证明该事项真实有效,本人愿意为此承担责任。}}%
\sx@bl{15.24bp}{%
\sx@put{210.00bp}{\sxfontsign\songti 项目负责人(签名):}%
\sx@put{323.97bp}{\sx@rule{84bp}}}%
\sx@bl{15.48bp}{%
\sx@put{318.00bp}{\sxfontsign\songti}%
\sx@dateline{\sxdateA}{318.00bp}{360.00bp}{402.00bp}}%
\sx@blp{14.04bp}{13.56bp}{%
\hspace*{21.00bp}项目负责人是科研经费使用的直接责任人,对经费使用的真实性、合理性及有效性承担经济与法律责任。}%
\sx@bl[3.11bp]{13.68bp}{\sx@put{21.00bp}{非科研经费亦适用本表格。}}}}
%----------------------------------------------------------------------
% R1 —— 单位负责人签字 + 单位公章
% 实际下划线 x 187.05~253.05(长 66 bp);「单位公章:」后不画线。
%----------------------------------------------------------------------
\newcommand{\sx@rowB}{%
\sxfontbody\songti
\sx@bl{10.55bp}{本人证明以上事项属实,并愿意承担相应责任。}%
\sx@bl{15.12bp}{%
\sx@put{21.00bp}{\sxfontsign\songti 单位负责人(签名):}%
\sx@put{134.97bp}{\sx@rule{66bp}}%
\sx@put{309.00bp}{\sxfontsign\songti 单位公章:}}%
\sx@bl{15.48bp}{%
\sx@put{348.00bp}{\sxfontsign\songti}%
\sx@dateline{\sxdateB}{348.00bp}{390.00bp}{432.00bp}}%
\sx@bl[3.16bp]{14.04bp}{\sx@put{15.72bp}{学院对本单位科研经费使用承担监督和管理责任。}}}
%----------------------------------------------------------------------
% R2 —— 科技管理部门审批意见
% 「科技管理」→「负责人签字」差 27.24 bp,比正常行距 15.6 多 11.64,
% 对应原件这一个空段(审批意见要留写字空间)。
%----------------------------------------------------------------------
\newcommand{\sx@rowC}{%
\sxfontbody\songti
\sx@bl{10.50bp}{科技管理部门审批意见:}%
\sx@bl{27.24bp}{%
\sx@put{26.28bp}{\sxfontsign\songti 负责人签字:}%
\sx@put{314.28bp}{\sxfontsign\songti 单位公章:}}%
\sx@bl[3.46bp]{15.60bp}{%
\sx@put{372.00bp}{\sxfontsign\songti}%
\sx@dateline{\sxdateC}{372.00bp}{402.00bp}{426.00bp}}}
%======================================================================
% 8. 备注区
%
% 三条备注是「annotation text」样式 + 自动编号(decimal "%1."),
% 行距 15 pt。实际基线 585.89 / 600.89 / 615.89 / 630.89(间距 15)。
% 实际x: 「备注:」79.44,编号「1.」95.16~103.05,正文 113.16
% ⇒ 减内容左界 52.08:27.36 / 50.97 / 61.08
%
% ⚠️ 四条同样不能用 \baselineskip —— 各自独立成段(同第 4 节坑一)。
%
% ⚠️ 第 3 条在里是**手打的**「 3. 」(没有 numPr),
% 比前两条多两个空格、位置差 0.36 bp。本模板统一排齐,
% 这是与原件唯一的有意差异(README「与原件差异」已列明)。
%======================================================================
\newlength{\sxnotebody}
\setlength{\sxnotebody}{61.08bp} % 正文左端
\newlength{\sxnotenum}
\setlength{\sxnotenum}{50.97bp} % 编号右端
\newlength{\sxnotelab}
\setlength{\sxnotelab}{27.36bp} % 「备注:」左端
% #1 = 编号 #2 = 正文
%
% ⚠️ 偏移用「相对内容左界」的值,不要再减 \sxpad。
% \sx@bl 的行盒是 \hbox to \sxboxw{\hskip\sxpad 内容\hss},
% \rlap 的参照原点就在那 \hskip 之后 —— 也就是内容左界本身。
\newcommand{\sxnoteitem}[2]{%
\sx@bl{15bp}{%
\rlap{\hspace*{\sxnotenum}\makebox[0bp][r]{#1}}%
\rlap{\hspace*{\sxnotebody}#2}}}
%----------------------------------------------------------------------
% 备注区四条(引言 + 三条),原文照录 —— 学校规定文字,不要改
% ⚠️ 引言「备注:使用科研经费报销时……」是**连排的一句话**,
% 「备注:」不是悬挂标签,整行从 79.44 起排,故只需一个 \sx@put。
%----------------------------------------------------------------------
% 第一行的「块顶 → 首行基线」:实际585.89 − 表格底 573.89 = 12.00
\newcommand{\sxnotes}{%
\par\nointerlineskip
\vbox{%
\sxfontbody\songti
\sx@blstart
\sx@bl{12.00bp}{\sx@put{\sxnotelab}{备注:使用科研经费报销时,本表需要相关负责人签字审批的情形和要求如下:}}%
\sxnoteitem{1.}{符合《办法》第十八条第八款、第二十三条情形的,需项目负责人、单位负责人签字;}%
\sxnoteitem{2.}{符合《办法》第二十二条的情形,需项目负责人、单位负责人和科技部门负责人签字;}%
\sxnoteitem{3.}{除以上两种情形外,其他均由项目负责人签字。}}%
\par}
%======================================================================
% 9. 页脚
%
% 页脚:右对齐「— 1 —」,宋体 14 pt,右缩进 180 twips = 9 pt。
% 实际整串左端 463.56、右端 512.65。本包版心右界 527.02,
% 故整串需再左移 527.02 − 512.65 = 14.37 bp。
%
% 负 \hspace 放**开头** —— 完全没效果(实际偏右 24.94 bp)。
% 原因:fancyhdr 的 [R] 位把内容放进 \hbox to \textwidth 并前置
% \hfil,靠「内容块整体贴右」对齐。开头加负 \hspace 只把块起点
% 左移,块宽没变,右边界仍贴版心右界。
% 正解:把内容装进**零宽盒**,让它的右缘成为对齐基准,
% 再用末尾的 \hspace 把基准往里推。
%======================================================================
\newlength{\sxfootinset}
\setlength{\sxfootinset}{24.94bp}
\newcommand{\sxfootfont}{\sxfontfoot\songti}
\newcommand{\sxfootcontent}{%
\makebox[0pt][r]{\sxfootfont — \thepage\ —}%
\hspace*{\sxfootinset}}
\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\fancyfoot[R]{\sxfootcontent}
\fancypagestyle{plain}{%
\fancyhf{}%
\renewcommand{\headrulewidth}{0pt}%
\renewcommand{\footrulewidth}{0pt}%
\fancyfoot[R]{\sxfootcontent}%
}
%======================================================================
% 10. 一句话入口
%
% \sxform —— 在 .tex 里只调这一个,整张表就出来了。
% 标题、表格、备注、页脚全在里面。
%======================================================================
\newcommand{\sxform}{%
\sxtitle{中国海洋大学特殊事项说明表}%
\sxtable
\sxnotes}
\AtBeginDocument{\sxfontbody\songti}
\endinput
Binary file not shown.
@@ -0,0 +1,40 @@
%======================================================================
% 中国海洋大学 特殊事项说明表
%
% 编译: xelatex 特殊事项说明表.tex
%
% 版式来源:报销相关/中国海洋大学特殊事项说明表.docx
% 所有尺寸已在 ouccsx.sty 内注明换算过程;要改版式请改 sty。
%
% 填表时只改下面【第 1 节】三行。
%======================================================================
\documentclass[UTF8,fontset=none]{ctexart}
\usepackage{ouccsx}
%======================================================================
% 1. 填这里(只有四行)
%======================================================================
% 事项描述。写清楚:为什么、去哪、做什么、为什么必须这样。
% ⚠️ 可直接写多段,用 \\ 或空行分段都行;表格会自动让出空间。
% ⚠️ 下面填的是**虚构示例**(去昌邑观测站维护浮标、自驾),
% 仅演示一份填好的表长什么样,实际使用时整段替换。
\newcommand{\sxdesc}{%
因渤海湾生态环境监测浮标需要例行维护,前往昌邑近岸观测站更换传感器并回收监测数据。
该站位于滩涂养殖区,公共交通无法抵达,且需随车携带备件箱、采样冷藏箱与工具,
故采用自驾方式前往。}
% 三处方框里的日期。留空则印成「 年 月 日」等手写。
% 想打印具体日期就写 \sxdateA{2026},或 {2026}{10}{28} 用下面的完整版。
\newcommand{\sxdateA}{} % 项目负责人签字处
\newcommand{\sxdateB}{} % 单位负责人签字处
\newcommand{\sxdateC}{} % 科技管理部门签字处
%======================================================================
% 2. 正文(不用改)
%======================================================================
\begin{document}
\sxform
\end{document}
+124 -78
View File
@@ -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,多页
封面 + 摘要 + 目录 + 正文
页眉页脚含章节名与页码
整页带极浅水印(单位名称)
正文宋体,标题黑体
```
## 注意
示例内容为占位文字,使用时全部替换。
+20
View File
@@ -6,6 +6,26 @@
% 颜色一律引用 cls/color.cls 里的语义名(oucinfo / oucalert ...), % 颜色一律引用 cls/color.cls 里的语义名(oucinfo / oucalert ...),
% 不在这里写具体色名,更不写 RGB 值。 % 不在这里写具体色名,更不写 RGB 值。
% %
% 【关于内容块里的 3 个 Underfull \hbox(记录)】
%
% 第 208/214/220 行那三段示例文字里有 \verb|Illuminate\Foundation\Http\Kernel|,
% 这个 35 字符的串在 \verb 里**不能断行**,整行只能把它塞进去,于是那行
% 被撑松 —— 报 Underfull (badness 1231)。
%
% · \emergencystretch 2em / 10em —— 无效。它不是"额度不够"的问题:
% 这一行没有足够的可拉伸 glue 可用,给多少额度都无从施展。
% · \sloppy —— 反而更差,badness 从 1231 升到 3590(放宽了断行标准,
% TeX 选了别的更松的解)。
%
% 有效但**不采用**的方案:
% · \seqsplit —— Underfull 归零,代价是在任意字符处断行,
% 一条代码路径被切成两段,可读性明显变差。
% · 换窄体等宽 lmmonoltcond(Light Condensed)—— 也归零,
% 但压缩字体让代码变窄变小,为一个示例文本牺牲整体代码可读性不合理。
%
% 结论:保留这 3 个 Underfull。badness 1231 属轻微(10000 才是严重),
% 渲染出来只是行末留白略多,不影响阅读。日志里看到它们属预期,不是回归。
%
%% 带标题的文本框 %% 带标题的文本框
% 这个框走的是"极简"路线:框线和标题栏都是白色,靠黑字 + 细边分界。 % 这个框走的是"极简"路线:框线和标题栏都是白色,靠黑字 + 细边分界。
+63 -9
View File
@@ -42,18 +42,37 @@
%====================================================================== %======================================================================
% 二、默认字体族 % 二、默认字体族
% %
% 西文:鸿蒙 HarmonyOS Sans(与原模板一致,观感不变)
% 中文:OUC Serif 书宋(对应原方正书宋),粗体用 OUC Serif Bold % 中文:OUC Serif 书宋(对应原方正书宋),粗体用 OUC Serif Bold
% (对应原方正小标宋 —— 小标宋本身就是宋体的标题变体) % (对应原方正小标宋 —— 小标宋本身就是宋体的标题变体)
% 西文:Cochineal(Minion 风格,OFL 1.1)
% 无衬线:鸿蒙 HarmonyOS Sans(标题、目录标题、封面标题都靠 \hm 切)
% %
% ⚠️ Path= 是相对**编译时工作目录**(= 科技报告/)的,不是相对 cls/。 % ⚠️ Path= 是相对**编译时工作目录**(= 科技报告/)的,不是相对 cls/。
% 故写作 ../fonts/...,不要写 ../../。 % 故写作 ../fonts/...,不要写 ../../。
%
% ⚠️⚠️ 西文为什么从 HarmonyOS 换成 Cochineal(2026-10 改,#19)
%
% 中文换成思源宋体之后,正文就成了「中文衬线 + 西文无衬线」,
% 同一行里英文数字明显比汉字细、比汉字"陷进去",读起来割裂。
%
% 更明显的副作用在目录:\setmainfont 是西文字体总开关,目录条目的
% 编号("1." 是数字)走它 → 鸿蒙粗体;而条目标题是中文 → 走
% \setCJKmainfont → 思源宋体粗。**同一条目录里两种字体**,
% 这就是"标题一会儿黑体一会儿什么体"的实际来源。
%
% 换成 Cochineal 后:中文宋体、西文衬线,灰度接近;目录编号与标题
% 也归到同一字族。度量与 Termes 只差 1.9%,不推着断行变。
%
% ⚠️ \setsansfont 保持鸿蒙 —— 标题用 \hm(CJK 族名 OUCHM)切换,
% 西文 sans 位仍是鸿蒙,标题的中西文因此都是鸿蒙,与正文区分得开。
%====================================================================== %======================================================================
\setmainfont{HarmonyOS_Sans_Regular.ttf}[ \setmainfont{cochineal}[
Path = ../fonts/harmonyos-sans/, Extension = .otf,
BoldFont = HarmonyOS_Sans_Bold.ttf, Path = ../fonts/cochineal/,
ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf, UprightFont = *-Roman,
BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf, BoldFont = *-Bold,
ItalicFont = *-Italic,
BoldItalicFont = *-BoldItalic,
] ]
\setsansfont{HarmonyOS_Sans_Regular.ttf}[ \setsansfont{HarmonyOS_Sans_Regular.ttf}[
Path = ../fonts/harmonyos-sans/, Path = ../fonts/harmonyos-sans/,
@@ -61,8 +80,22 @@
ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf, ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf,
BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf, BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf,
] ]
\setmonofont{HarmonyOS_Sans_Regular.ttf}[
Path = ../fonts/harmonyos-sans/, % 等宽位:真等宽,供代码块(listings 的 \ttfamily)使用。
% 竖向对不齐,缩进看起来是歪的。
% lmmono(Latin Modern Mono)是 TeX Live 自带,无需额外字体文件。
%
% ⚠️ 这里**不能**用 Extension + UprightFont=*-regular 的组合。
% lm 系列的文件名本身就是 "lmmono10-regular.otf",已经带 -regular 后缀;
% 再配 Extension=.otf 加 *-regular,fontspec 会拼成
% lmmono10-regular-regular.otf
% 然后报 The font "lmmono10-regular-regular" cannot be found。
% 正确做法是给完整文件名、不给 Extension。
% ⚠️ 没有 lmmonobq 这个变体;粗体用 lmmonolt10-bold(同属 lmmono 家族,
% 字宽与 regular 一致,换粗体不会让代码错位)。
\setmonofont{lmmono10-regular.otf}[
ItalicFont = lmmono10-italic.otf,
BoldFont = lmmonolt10-bold.otf,
] ]
% \hm 已在 fonts.tex 里登记(CJK 族名 OUCHM),这里不重复定义。 % \hm 已在 fonts.tex 里登记(CJK 族名 OUCHM),这里不重复定义。
@@ -81,6 +114,28 @@
\XeTeXlinebreaklocale "zh" \XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt \XeTeXlinebreakskip = 0pt plus 1pt
%======================================================================
% 二之二、重定义 \hm:中文与西文一起切到鸿蒙
%
% 问题:fonts.tex 里的 \hm 是 \def\hm{\CJKfamily{OUCHM}} —— 这只是
% xeCJK 的**中文字族**切换,管不到阿拉伯数字和拉丁字母。而本模板的
% 标题、封面主标题、摘要标题都用 \hm 来做"这是鸿蒙",于是凡是标题里
% 夹了西文("LaTex"、编号 "1." "3.1")就还是渲染成西文字体,
% 表现为同一个标题里中文鸿蒙、西文衬线 —— 就是"字体一会一个样"。
%
% 解法:在本模板内把 \hm 重定义为「中文字族 + 拉丁字族」一起切。
% \hmlatin 由 fonts.tex 用 \newfontfamily 定义,是 Latin 字族命令,
% 与 \CJKfamily 作用域不同,可以并存。
%
% ⚠️ 必须是 \renewcommand,不能 \newcommand —— 名字已被 fonts.tex 定义。
% ⚠️ 只改本模板,不动 ../fonts.tex:幻灯片和简历也在用那个 \hm,
% 全局改会让它们跟着变,而它们没有这个"标题里混西文"的问题。
% 这是本模板的局部修正,不该外溢。
% ⚠️ 重定义要在所有 \hm 调用**之前**。本文件由 report.cls 在
% \begin{document} 前 \input,位置没问题;不要把这段挪到后面。
%======================================================================
\renewcommand{\hm}{\hmlatin\CJKfamily{OUCHM}}
%====================================================================== %======================================================================
% 三、5 个方正语义别名 % 三、5 个方正语义别名
% %
@@ -117,7 +172,6 @@
\newcommand{\fzkai}{\CJKfamily{fzkai}} \newcommand{\fzkai}{\CJKfamily{fzkai}}
% 仿宋(原方正仿宋)—— 斜体位 % 仿宋(原方正仿宋)—— 斜体位
% ⚠️ 朱雀仿宋只有常规一档。旧版这里配的是"方正仿宋",也是常规字面,
% 所以观感一致;但若在 \fzfs 下用 \bfseries,不会真的变粗。 % 所以观感一致;但若在 \fzfs 下用 \bfseries,不会真的变粗。
\setCJKfamilyfont{fzfs}[ \setCJKfamilyfont{fzfs}[
Extension = .ttf, Extension = .ttf,
+45 -1
View File
@@ -2,12 +2,26 @@
%% 标题、目录等设定 %% 标题、目录等设定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----------------------------------------------------------------------
% 各级标题字体
%
% 目标:编号和标题文字**都是鸿蒙**。
%
% 踩的坑:原来只写 format=\hm\bfseries,以为 \hm 就够了。实际 \hm 在旧版
% 是纯 xeCJK 中文字族切换,管不到阿拉伯数字 —— 编号 "1." "3.1" 被判成
% 西文,仍走 \setmainfont,于是同一个标题里中文鸿蒙、编号衬线。
%
% 修法:本次在 cls/font.cls 里把 \hm 重定义为「中西文一起切鸿蒙」,
% 所以这里维持 format=\hm\bfseries 即可,不需要再写 \hmlatin。
% 换个说法:问题统一在 \hm 的定义处解决,而不是在每一处调用点逐个补 ——
% 后者必然漏(封面、摘要、目录标题、页眉都会各自漏一次)。
%----------------------------------------------------------------------
\ctexset{ \ctexset{
% 修改 section文字样式, % 修改 section文字样式,
section={ section={
name={,.},%编号和文字中间用.。 name={,.},%编号和文字中间用.。
number={\arabic{section}},%编号形式:\arabic设置为阿拉伯数字,\chinese设置为中文,\roman设置为小写罗马字母,\Roman设置为大写罗马字母,\alph设置为小写英文,\Alph设置为大写英文。 number={\arabic{section}},%编号形式:\arabic设置为阿拉伯数字,\chinese设置为中文,\roman设置为小写罗马字母,\Roman设置为大写罗马字母,\alph设置为小写英文,\Alph设置为大写英文。
format=\hm\bfseries\raggedright\zihao{4},%鸿蒙字体,小四号字,右对齐。 format=\hm\bfseries\raggedright\zihao{4},%鸿蒙字体(中西文都用鸿蒙),小四号字,右对齐。
aftername=\hspace{5pt},%编号和标题的距离 aftername=\hspace{5pt},%编号和标题的距离
% beforeskip=1ex,%标题与前文的距离 % beforeskip=1ex,%标题与前文的距离
% afterskip=1ex,%标题与后文的距离 % afterskip=1ex,%标题与后文的距离
@@ -32,3 +46,33 @@
\renewcommand{\cftpartleader}{\cftdotfill{\cftdotsep}} % 给 parts 加点 \renewcommand{\cftpartleader}{\cftdotfill{\cftdotsep}} % 给 parts 加点
%\renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}} % 给 chapters 加点 %\renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}} % 给 chapters 加点
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} % 给 sections加点 \renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} % 给 sections加点
%----------------------------------------------------------------------
% 目录条目的字族统一
%
% 问题:一条目录里能出现两种字体。编号 "1." 是阿拉伯数字 → 被 xeCJK
% 判成西文 → 走 \setmainfont;条目标题是中文 → 走 \setCJKmainfont。
% 旧版 \setmainfont 是鸿蒙、\setCJKmainfont 是思源宋体,于是同一条里
% 「编号鸿蒙粗 + 标题宋体粗」,看着就是标题字体一会儿一个样。
%
% 把西文改回衬线(Cochineal)之后这个分裂本身已经消失,但这里仍然显式
% 声明一次,理由有二:
% ① 不依赖 \setmainfont 的间接效果 —— 将来若有人改了 font.cls 的
% 西文设置,目录不会跟着又裂开;
% ② tocloft 的 \cftsecfont 是"只管目录条目"的开关,改它比调全局安全。
%
% ⚠️ 只设 \cftsecfont / \cftsubsecfont / \cftsubsubsecfont,不动
% \cftsecpagefont —— 页码那列保持默认,不用跟着正文加粗。
% ⚠️ \cftsecfont 里不要塞 \bfseries:加粗与否是各条目录自己的事
% (正文章节标题本就 \bfseries),在这里硬加会让二级三级也变粗。
%----------------------------------------------------------------------
\renewcommand{\cftsecfont}{\normalfont}
\renewcommand{\cftsubsecfont}{\normalfont}
\renewcommand{\cftsubsubsecfont}{\normalfont}
% 页码列单独归零。上面三条只管条目文字,页码走的是 \cft*pagefont,
% 默认继承条目的粗体设置 —— 不显式清掉的话,目录里页码会比标题还粗,
% 一眼看过去页码最抢眼。
\renewcommand{\cftsecpagefont}{\normalfont}
\renewcommand{\cftsubsecpagefont}{\normalfont}
\renewcommand{\cftsubsubsecpagefont}{\normalfont}
+1 -1
View File
@@ -14,7 +14,7 @@
% 视觉上"挂在页眉区",明确在版面结构内,又不会挤压正文。 % 视觉上"挂在页眉区",明确在版面结构内,又不会挤压正文。
% ⚠️ 别把 20mm 改得更小:A4 印刷 / 装订裁切余量一般 10~12mm, % ⚠️ 别把 20mm 改得更小:A4 印刷 / 装订裁切余量一般 10~12mm,
% 改到 15mm 以下有被裁掉的风险。 % 改到 15mm 以下有被裁掉的风险。
% ⚠️ logo 下沿距首条横线约 12mm(实测),若改 width 或 yshift, % ⚠️ logo 下沿距首条横线约 12mm(实际),若改 width 或 yshift,
% 记得重新确认这个间隙,太大显得松散、太小挤成一团。 % 记得重新确认这个间隙,太大显得松散、太小挤成一团。
%---------------------------------------------------------------------- %----------------------------------------------------------------------
\newcommand{\coverlogo}{% \newcommand{\coverlogo}{%
+3 -3
View File
@@ -47,15 +47,15 @@
\section{字体} \section{字体}
在模板中,默认使用的字体是鸿蒙字体,除此之外,还定义了一些其他的中文字体。 在模板中,中文默认使用思源宋体,西文默认使用 Cochineal,标题统一使用鸿蒙字体。除此之外,还定义了一些其他的中文字体。
英文字体,默认使用的是鸿蒙字体(HarmonyOS Sans),现在你看到的应该就是这个字体的效果。这些设置,可以在cls中,字体设定里面进行修改。 英文字体,正文默认使用的是 Cochineal(一款 Minion 风格的衬线体),代码等宽位使用的是 Latin Modern Mono。所以你现在看到的西文和阿拉伯数字都是衬线字体。这样安排是为了和中文的思源宋体保持相近的灰度——如果西文用无衬线,同一行里字母数字会明显比汉字细、像"陷进去",读起来割裂。这些设置,可以在 cls 中字体设定里面进行修改。
中文字体,使用的是鸿蒙字体、思源宋体、霞鹜文楷、朱雀仿宋、思源黑体等。全部为开源可商用字体,不使用任何方正、微软雅黑等商业字体。 中文字体,使用的是鸿蒙字体、思源宋体、霞鹜文楷、朱雀仿宋、思源黑体等。全部为开源可商用字体,不使用任何方正、微软雅黑等商业字体。
中文的默认字体衬线字体是思源宋体,加粗字体是思源宋体的真粗体,就像这样:\textbf{这里是加粗字体}。斜体的字体是霞鹜文楷,就像这样:\textit{这里是中文斜体}。斜体粗体的字体是朱雀仿宋,就像这样:\textbf{\textit{这里是粗体斜体}}。中文的无衬线字体sans font使用的是鸿蒙字体,你应该可以在标题中看到它。中文等宽字体,使用的是思源黑体。 中文的默认字体衬线字体是思源宋体,加粗字体是思源宋体的真粗体,就像这样:\textbf{这里是加粗字体}。斜体的字体是霞鹜文楷,就像这样:\textit{这里是中文斜体}。斜体粗体的字体是朱雀仿宋,就像这样:\textbf{\textit{这里是粗体斜体}}。中文的无衬线字体sans font使用的是鸿蒙字体,你应该可以在标题中看到它。中文等宽字体,使用的是思源黑体。
默认的无衬线字体是鸿蒙字体,你应该可以在各种标题中看到它的样子。 默认的无衬线字体是鸿蒙字体,你应该可以在各种标题中看到它的样子。注意标题里的中文和西文(包括编号 "1."、"3.1")现在统一都是鸿蒙——旧版因为编号是阿拉伯数字、被归到西文字体,会出现同一个标题里中文鸿蒙、编号衬线的情况,看着像"字体一会一个样",现已修正。
同样,上述的字体,在cls中,都可以进行设置。 同样,上述的字体,在cls中,都可以进行设置。
+415
View File
@@ -0,0 +1,415 @@
The LaTeX Project Public License
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
LPPL Version 1.3c 2008-05-04
Copyright 1999 2002-2008 LaTeX3 Project
Everyone is allowed to distribute verbatim copies of this
license document, but modification of it is not allowed.
PREAMBLE
========
The LaTeX Project Public License (LPPL) is the primary license under
which the LaTeX kernel and the base LaTeX packages are distributed.
You may use this license for any work of which you hold the copyright
and which you wish to distribute. This license may be particularly
suitable if your work is TeX-related (such as a LaTeX package), but
it is written in such a way that you can use it even if your work is
unrelated to TeX.
The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
below, gives instructions, examples, and recommendations for authors
who are considering distributing their works under this license.
This license gives conditions under which a work may be distributed
and modified, as well as conditions under which modified versions of
that work may be distributed.
We, the LaTeX3 Project, believe that the conditions below give you
the freedom to make and distribute modified versions of your work
that conform with whatever technical specifications you wish while
maintaining the availability, integrity, and reliability of
that work. If you do not see how to achieve your goal while
meeting these conditions, then read the document `cfgguide.tex'
and `modguide.tex' in the base LaTeX distribution for suggestions.
DEFINITIONS
===========
In this license document the following terms are used:
`Work'
Any work being distributed under this License.
`Derived Work'
Any work that under any applicable law is derived from the Work.
`Modification'
Any procedure that produces a Derived Work under any applicable
law -- for example, the production of a file containing an
original file associated with the Work or a significant portion of
such a file, either verbatim or with modifications and/or
translated into another language.
`Modify'
To apply any procedure that produces a Derived Work under any
applicable law.
`Distribution'
Making copies of the Work available from one person to another, in
whole or in part. Distribution includes (but is not limited to)
making any electronic components of the Work accessible by
file transfer protocols such as FTP or HTTP or by shared file
systems such as Sun's Network File System (NFS).
`Compiled Work'
A version of the Work that has been processed into a form where it
is directly usable on a computer system. This processing may
include using installation facilities provided by the Work,
transformations of the Work, copying of components of the Work, or
other activities. Note that modification of any installation
facilities provided by the Work constitutes modification of the Work.
`Current Maintainer'
A person or persons nominated as such within the Work. If there is
no such explicit nomination then it is the `Copyright Holder' under
any applicable law.
`Base Interpreter'
A program or process that is normally needed for running or
interpreting a part or the whole of the Work.
A Base Interpreter may depend on external components but these
are not considered part of the Base Interpreter provided that each
external component clearly identifies itself whenever it is used
interactively. Unless explicitly specified when applying the
license to the Work, the only applicable Base Interpreter is a
`LaTeX-Format' or in the case of files belonging to the
`LaTeX-format' a program implementing the `TeX language'.
CONDITIONS ON DISTRIBUTION AND MODIFICATION
===========================================
1. Activities other than distribution and/or modification of the Work
are not covered by this license; they are outside its scope. In
particular, the act of running the Work is not restricted and no
requirements are made concerning any offers of support for the Work.
2. You may distribute a complete, unmodified copy of the Work as you
received it. Distribution of only part of the Work is considered
modification of the Work, and no right to distribute such a Derived
Work may be assumed under the terms of this clause.
3. You may distribute a Compiled Work that has been generated from a
complete, unmodified copy of the Work as distributed under Clause 2
above, as long as that Compiled Work is distributed in such a way that
the recipients may install the Compiled Work on their system exactly
as it would have been installed if they generated a Compiled Work
directly from the Work.
4. If you are the Current Maintainer of the Work, you may, without
restriction, modify the Work, thus creating a Derived Work. You may
also distribute the Derived Work without restriction, including
Compiled Works generated from the Derived Work. Derived Works
distributed in this manner by the Current Maintainer are considered to
be updated versions of the Work.
5. If you are not the Current Maintainer of the Work, you may modify
your copy of the Work, thus creating a Derived Work based on the Work,
and compile this Derived Work, thus creating a Compiled Work based on
the Derived Work.
6. If you are not the Current Maintainer of the Work, you may
distribute a Derived Work provided the following conditions are met
for every component of the Work unless that component clearly states
in the copyright notice that it is exempt from that condition. Only
the Current Maintainer is allowed to add such statements of exemption
to a component of the Work.
a. If a component of this Derived Work can be a direct replacement
for a component of the Work when that component is used with the
Base Interpreter, then, wherever this component of the Work
identifies itself to the user when used interactively with that
Base Interpreter, the replacement component of this Derived Work
clearly and unambiguously identifies itself as a modified version
of this component to the user when used interactively with that
Base Interpreter.
b. Every component of the Derived Work contains prominent notices
detailing the nature of the changes to that component, or a
prominent reference to another file that is distributed as part
of the Derived Work and that contains a complete and accurate log
of the changes.
c. No information in the Derived Work implies that any persons,
including (but not limited to) the authors of the original version
of the Work, provide any support, including (but not limited to)
the reporting and handling of errors, to recipients of the
Derived Work unless those persons have stated explicitly that
they do provide such support for the Derived Work.
d. You distribute at least one of the following with the Derived Work:
1. A complete, unmodified copy of the Work;
if your distribution of a modified component is made by
offering access to copy the modified component from a
designated place, then offering equivalent access to copy
the Work from the same or some similar place meets this
condition, even though third parties are not compelled to
copy the Work along with the modified component;
2. Information that is sufficient to obtain a complete,
unmodified copy of the Work.
7. If you are not the Current Maintainer of the Work, you may
distribute a Compiled Work generated from a Derived Work, as long as
the Derived Work is distributed to all recipients of the Compiled
Work, and as long as the conditions of Clause 6, above, are met with
regard to the Derived Work.
8. The conditions above are not intended to prohibit, and hence do not
apply to, the modification, by any method, of any component so that it
becomes identical to an updated version of that component of the Work as
it is distributed by the Current Maintainer under Clause 4, above.
9. Distribution of the Work or any Derived Work in an alternative
format, where the Work or that Derived Work (in whole or in part) is
then produced by applying some process to that format, does not relax or
nullify any sections of this license as they pertain to the results of
applying that process.
10. a. A Derived Work may be distributed under a different license
provided that license itself honors the conditions listed in
Clause 6 above, in regard to the Work, though it does not have
to honor the rest of the conditions in this license.
b. If a Derived Work is distributed under a different license, that
Derived Work must provide sufficient documentation as part of
itself to allow each recipient of that Derived Work to honor the
restrictions in Clause 6 above, concerning changes from the Work.
11. This license places no restrictions on works that are unrelated to
the Work, nor does this license place any restrictions on aggregating
such works with the Work by any means.
12. Nothing in this license is intended to, or may be used to, prevent
complete compliance by all parties with all applicable laws.
NO WARRANTY
===========
There is no warranty for the Work. Except when otherwise stated in
writing, the Copyright Holder provides the Work `as is', without
warranty of any kind, either expressed or implied, including, but not
limited to, the implied warranties of merchantability and fitness for a
particular purpose. The entire risk as to the quality and performance
of the Work is with you. Should the Work prove defective, you assume
the cost of all necessary servicing, repair, or correction.
In no event unless required by applicable law or agreed to in writing
will The Copyright Holder, or any author named in the components of the
Work, or any other party who may distribute and/or modify the Work as
permitted above, be liable to you for damages, including any general,
special, incidental or consequential damages arising out of any use of
the Work or out of inability to use the Work (including, but not limited
to, loss of data, data being rendered inaccurate, or losses sustained by
anyone as a result of any failure of the Work to operate with any other
programs), even if the Copyright Holder or said author or said other
party has been advised of the possibility of such damages.
MAINTENANCE OF THE WORK
=======================
The Work has the status `author-maintained' if the Copyright Holder
explicitly and prominently states near the primary copyright notice in
the Work that the Work can only be maintained by the Copyright Holder
or simply that it is `author-maintained'.
The Work has the status `maintained' if there is a Current Maintainer
who has indicated in the Work that they are willing to receive error
reports for the Work (for example, by supplying a valid e-mail
address). It is not required for the Current Maintainer to acknowledge
or act upon these error reports.
The Work changes from status `maintained' to `unmaintained' if there
is no Current Maintainer, or the person stated to be Current
Maintainer of the work cannot be reached through the indicated means
of communication for a period of six months, and there are no other
significant signs of active maintenance.
You can become the Current Maintainer of the Work by agreement with
any existing Current Maintainer to take over this role.
If the Work is unmaintained, you can become the Current Maintainer of
the Work through the following steps:
1. Make a reasonable attempt to trace the Current Maintainer (and
the Copyright Holder, if the two differ) through the means of
an Internet or similar search.
2. If this search is successful, then enquire whether the Work
is still maintained.
a. If it is being maintained, then ask the Current Maintainer
to update their communication data within one month.
b. If the search is unsuccessful or no action to resume active
maintenance is taken by the Current Maintainer, then announce
within the pertinent community your intention to take over
maintenance. (If the Work is a LaTeX work, this could be
done, for example, by posting to comp.text.tex.)
3a. If the Current Maintainer is reachable and agrees to pass
maintenance of the Work to you, then this takes effect
immediately upon announcement.
b. If the Current Maintainer is not reachable and the Copyright
Holder agrees that maintenance of the Work be passed to you,
then this takes effect immediately upon announcement.
4. If you make an `intention announcement' as described in 2b. above
and after three months your intention is challenged neither by
the Current Maintainer nor by the Copyright Holder nor by other
people, then you may arrange for the Work to be changed so as
to name you as the (new) Current Maintainer.
5. If the previously unreachable Current Maintainer becomes
reachable once more within three months of a change completed
under the terms of 3b) or 4), then that Current Maintainer must
become or remain the Current Maintainer upon request provided
they then update their communication data within one month.
A change in the Current Maintainer does not, of itself, alter the fact
that the Work is distributed under the LPPL license.
If you become the Current Maintainer of the Work, you should
immediately provide, within the Work, a prominent and unambiguous
statement of your status as Current Maintainer. You should also
announce your new status to the same pertinent community as
in 2b) above.
WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
======================================================
This section contains important instructions, examples, and
recommendations for authors who are considering distributing their
works under this license. These authors are addressed as `you' in
this section.
Choosing This License or Another License
----------------------------------------
If for any part of your work you want or need to use *distribution*
conditions that differ significantly from those in this license, then
do not refer to this license anywhere in your work but, instead,
distribute your work under a different license. You may use the text
of this license as a model for your own license, but your license
should not refer to the LPPL or otherwise give the impression that
your work is distributed under the LPPL.
The document `modguide.tex' in the base LaTeX distribution explains
the motivation behind the conditions of this license. It explains,
for example, why distributing LaTeX under the GNU General Public
License (GPL) was considered inappropriate. Even if your work is
unrelated to LaTeX, the discussion in `modguide.tex' may still be
relevant, and authors intending to distribute their works under any
license are encouraged to read it.
A Recommendation on Modification Without Distribution
-----------------------------------------------------
It is wise never to modify a component of the Work, even for your own
personal use, without also meeting the above conditions for
distributing the modified component. While you might intend that such
modifications will never be distributed, often this will happen by
accident -- you may forget that you have modified that component; or
it may not occur to you when allowing others to access the modified
version that you are thus distributing it and violating the conditions
of this license in ways that could have legal implications and, worse,
cause problems for the community. It is therefore usually in your
best interest to keep your copy of the Work identical with the public
one. Many works provide ways to control the behavior of that work
without altering any of its licensed components.
How to Use This License
-----------------------
To use this license, place in each of the components of your work both
an explicit copyright notice including your name and the year the work
was authored and/or last substantially modified. Include also a
statement that the distribution and/or modification of that
component is constrained by the conditions in this license.
Here is an example of such a notice and statement:
%% pig.dtx
%% Copyright 2005 M. Y. Name
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is M. Y. Name.
%
% This work consists of the files pig.dtx and pig.ins
% and the derived file pig.sty.
Given such a notice and statement in a file, the conditions
given in this license document would apply, with the `Work' referring
to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
referring to any `LaTeX-Format', and both `Copyright Holder' and
`Current Maintainer' referring to the person `M. Y. Name'.
If you do not want the Maintenance section of LPPL to apply to your
Work, change `maintained' above into `author-maintained'.
However, we recommend that you use `maintained', as the Maintenance
section was added in order to ensure that your Work remains useful to
the community even when you can no longer maintain and support it
yourself.
Derived Works That Are Not Replacements
---------------------------------------
Several clauses of the LPPL specify means to provide reliability and
stability for the user community. They therefore concern themselves
with the case that a Derived Work is intended to be used as a
(compatible or incompatible) replacement of the original Work. If
this is not the case (e.g., if a few lines of code are reused for a
completely different task), then clauses 6b and 6d shall not apply.
Important Recommendations
-------------------------
Defining What Constitutes the Work
The LPPL requires that distributions of the Work contain all the
files of the Work. It is therefore important that you provide a
way for the licensee to determine which files constitute the Work.
This could, for example, be achieved by explicitly listing all the
files of the Work near the copyright notice of each file or by
using a line such as:
% This work consists of all files listed in manifest.txt.
in that place. In the absence of an unequivocal list it might be
impossible for the licensee to determine what is considered by you
to comprise the Work and, in such a case, the licensee would be
entitled to make reasonable conjectures as to which files comprise
the Work.
+140
View File
@@ -0,0 +1,140 @@
# 简历
个人简历,A4,中文,两栏式,含圆形头像与分区条目。
## 编译
```bash
cd 简历
xelatex 简历.tex
xelatex 简历.tex % 跑两遍,目录与页码才正确
```
或仓库根:`bash build.sh 简历`(自动跑两遍)
## 文件
```
简历/
├── 简历.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}
}
```
| 命令 | 说明 |
|---|---|
| `\name{西文名}{中文名}` | 姓名,中文简历第一参数留空 |
| `\photo{宽度}{文件名}` | 头像,文件名不带扩展名 |
| `\socialinfo{...}` | 联系方式块 |
| `\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}
```
| 文件 | 内容 |
|---|---|
| `section_01_headline` | 个人概述 |
| `section_02_work_experience` | 工作经历 |
| `section_03_education` | 教育经历 |
| `section_04_publications` | 学术论文 |
| `section_05_patents` | 发明专利 |
| `section_06_software` | 软件著作权 |
| `section_07_project` | 科研项目 |
| `section_08_zhuanhua` | 成果转化 |
| `section_09_jiaoyan` | 教研工作 |
| `section_10_awards` | 获奖 |
| `section_interests` | 兴趣爱好 |
| `section_languages` | 语言能力 |
| `section_skills` | 专业技能 |
| `section_references` | 推荐人 |
不需要的章节把 `\input` 那行注释掉即可。
## 章节写法
```latex
\sectionTitle{工作经历}{\faUniversity}
\begin{tabular}{rl}
\textsc{2021年12月 --至今} & \textbf{教授},信息科学与工程学部,中国海洋大学\\
\textsc{2016年09月 --2021年11月} & \textbf{副教授},信息科学与工程学部,中国海洋大学
\end{tabular}
```
- `\sectionTitle{标题}{图标}` — 章节标题,图标用 fontawesome
- 两列 `tabular`:左列时间(`\textsc` 小型大写),右列内容
- 时间用 `--` 排连接号,前后不加空格
常用 fontawesome 图标:
`\faUniversity`(学校)、`\faBriefcase`(工作)、`\faGraduationCap`(教育)、
`\faBook`(论文)、`\faCogs`(软著)、`\faFlask`(项目)、
`\faTrophy`(获奖)、`\faHeart`(兴趣)、`\faGlobe`(语言)。
## 换头像
替换 `photo.jpg`,或改 `\photo{2.5cm}{新文件名}`。图片要是方形,
会裁成圆形。
## 版式
```
A4,单页或多页
中文正文 OUC Serif,西文 Cochineal
左栏较窄(时间),右栏较宽(内容)
章节标题带图标与分隔线
头像为圆形,右上角
```
## 注意
示例内容为虚构数据,使用时全部替换。
+821
View File
@@ -0,0 +1,821 @@
%% Copyright 2016 Christophe Roger
%
% Author:
% Christophe Roger (Darwiin)
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is M. C. Roger.
%
% This work consists of the files awesome-source-cv.cls
\ProvidesClass{awesome-source-cv}[2016/11/05 v1.6.1 Awesome Source CV Class]
\LoadClass[a4paper]{article}
\DeclareOption{green}{
\def\@green{green}
}
\DeclareOption{red}{
\def\@red{red}
}
\DeclareOption{indigo}{
\def\@indigo{indigo}
}
\DeclareOption{orange}{
\def\@orange{orange}
}
\DeclareOption{localFont}{
\def\@local{local}
}
\DeclareOption{alternative}{
\def\@alternative{alternate}
}
\ProcessOptions
% Dependences
%A Few Useful Packages
% ⚠️ 选项名用 french,不要用旧写法 frenchb。
% frenchb 是 babel 早期的法语方言名,两个名字在 TeX Live 2022 及更早
% 版本上等价;但 TeX Live 2025 的 babel 已把 frenchb 从「已知语言」
% 列表里移除,写旧名会报
% ! Package babel Error: Unknown option `frenchb'.
% 即使压住这条,还会进一步炸在 \begin{document} 处:
% ! Undefined control sequence.
% \__hook begindocument ...fter {\bbl@main@language }...
% 改用 french 在老版本上同样可用,是向前兼容的写法。
% (本模板正文是中文,babel 这里只影响西文连字与断词细节,
% 中文断行由 xeCJK 负责。)
\RequirePackage[french]{babel}
%\RequirePackage[utf8]{luainputenc} % luatex
\RequirePackage{fontspec} % for loading fonts
\RequirePackage{url,parskip} % other packages for formatting
\RequirePackage[usenames,dvipsnames]{xcolor}
\RequirePackage{fullpage}
\RequirePackage[margin=1.5cm]{geometry}
\RequirePackage{fontawesome}
\RequirePackage{hyperref}\hypersetup{hidelinks}
\RequirePackage{titlesec}
\RequirePackage{array}
\RequirePackage{enumitem}
\RequirePackage{longtable}
\RequirePackage{etoolbox}
\RequirePackage{tikz}
\RequirePackage[skins]{tcolorbox}
% \DeclareUnicodeCharacter{00E9}{\'{e}} %luatex
% Define default accent colors
%\definecolor{basecolor}{HTML}{000066} %BLUE
\definecolor{basecolor}{HTML}{0f4c81}
\ifundef{\@green} {
\ifundef{\@red} {
\ifundef{\@indigo}{
\ifundef{\@orange} {}
{ \definecolor{basecolor}{HTML}{e68a00} }
}
{ \definecolor{basecolor}{rgb}{0.2, 0.07, 0.48} }
}
{ \definecolor{basecolor}{HTML}{b30000} } %RED
}
{ \definecolor{basecolor}{rgb}{0.0, 0.62, 0.38} }
\definecolor{darkGrey}{HTML}{989898}
\colorlet{linkcolor}{basecolor}
\colorlet{accentcolor}{linkcolor!90}
\colorlet{symbolcolor}{linkcolor!85}
% Setup hyperref package, and colours for links
%\definecolor{linkcolour}{rgb}{0,0.2,0.6}
\hypersetup{breaklinks}
\pagestyle{empty} % non-numbered pages
%\font\fb=''[cmr10]'' % for use with \LaTeX command
% Setup CV sections
\titleformat{\section}{\Large\raggedright}{}{0em}{}[\titlerule]
\titlespacing{\section}{0pt}{2pt}{2pt}
% Configure list
\setlist[itemize,1]{label=\faAngleRight, nosep, leftmargin=2em}
%----------------------------------------------------------------------
% 中西文之间的断行弹性
%
% 现象:论文条目里「… Applications (ICIEA), 88--93. 中国青岛, 中国: IEEE,
% 2023. https://doi.org/…」这一整段会冲出右边距 88.5pt,文字一直排到
% 页面纸边(x=595.5,而纸宽才 595.28)。用 Termes 时只有 0.4pt 之差,
% 换 Cochineal 后(西文窄 1.9%,断点位置整体前移)暴露成 88.5pt。
%
% 根因:XeLaTeX 里「中文紧跟英文」的位置默认**不是**断开点,TeX 会把
% 「2023 IEEE 18th Annual Conference on Industrial Electronics and
% Applications (ICIEA), 88--93.」当成一个长单词找断点,找到头也没有,
% 于是硬冲出去。上游模板没有设 \emergencystretch,也没有开
% \XeTeXlinebreaklocale,所以一点余量都没有。
%
% 修法(三选一,这里选第 1 个):
% ① 给 itemize 加 \emergencystretch —— 允许在极端情况下把行拉松
% 而不是硬冲出去。不动字体、不改内容、不影响其他环境。
% ② 全局 \sloppy —— 效果类似但会把**所有**段落的词距都放松,
% 连正常的短段落也变松散,观感下降。
% ③ 在 .tex 里手工插入 \allowbreak / \- —— 要逐条改,换字体又要重来。
%
% \emergencystretch=3em 的量级:按 10pt 正文,3em=30pt,足以吃掉
% 88.5pt 中的大部分,剩余部分交给行内词距自然拉伸。若将来换了更宽的
% 西文字体(如 Pagella 宽 10.8%)还报 Overfull,把这个值调到 4em~5em。
% ⚠️ 不要设成 \maxdimen 一劳永逸 —— 那等于关掉断行检查,
% 真正的排版问题会被全部藏起来,日志再也不报。
%----------------------------------------------------------------------
\setlength{\emergencystretch}{3em}
% Setup Array : new column type
%
% ⚠️ 原来是 >{\hfill}m{#1},即「固定宽度 + 内容靠右贴」。
% 用在本简历里会出问题:\hfill 让短日期贴着左列的**右**边界排,
% 日期本身只有约 57pt 宽而左列有 2.5cm=71.13pt,于是日期左边缘落在
% 42.5(左边距) + 6(\tabcolsep) + 71.13 - 57.3 = 62.33pt
% 而其他章节(工作经历/教育经历/奖励与荣誉)用的是 tabular{rl},
% 左列宽度自适应到最长的日期区间(约 122pt),日期左边缘在
% 42.5 + 6 = 48.5pt
% 两节一比就差 13.8pt,看上去「项目经验往里缩了一点」。
%
% 现在改成左对齐:日期左边缘回到 48.5pt,与其余章节的日期左边缘
% 严格对齐(本项目全部日期都是「YYYY 年MM 月」同宽 57.3pt,
% 所以左对齐后右边缘也齐,列不会显乱)。
%
% ⚠️ 用 p{} 而不用 m{}:m{} 是「垂直居中」的 parbox 列,在
% longtable 里跨页断行时行为不如 p{} 稳;这张表一行可能很高
% (右栏带 itemize)。配 \arraybackslash 让 \\ 在列内恢复正常。
% ⚠️ R 列只被 experiences 环境使用(skills 环境虽也写了 R,但本
% 简历没有调用 section_skills),改动不会波及别处。若将来启用
% skills 环境,那里是「技能名 + 五点圆点」,左对齐同样合适。
\newcolumntype{R}[1]{>{\raggedright\arraybackslash}p{#1}}
%Italian hyphenation for the word: ''corporations''
\hyphenation{im-pre-se}
% Setup fonts
\defaultfontfeatures{Mapping=tex-text}
%
%-------------------------------------------------------------------------------
% Configuration for fonts
%-------------------------------------------------------------------------------
% ⚠️⚠️ 本文件已被改写:字体**全部**取自仓库公共字体包 ../fonts.tex。
%
% 上游 awesom e-cv 的中文版原来这么配(共三处,都已删除):
% ① zh_cn-adobefonts_external.sty 里 \setCJKmainfont{AdobeSongStd-Light.otf}
% —— Adobe 宋/黑/楷/仿四款共 56 MB,商业授权,**不能随仓库分发**。
% 而且那份文件还拿 HarmonyOS Sans 去冒充 Bold/Italic/SmallCaps:
% BoldFont = HarmonyOS_Sans_SC_Regular.ttf
% ItalicFont = HarmonyOS_Sans_SC_Regular.ttf
% 等于"加粗=不变"、"斜体=不变",标题的层次全靠字号撑,是个将就做法。
% ② \setmainfont{SourceSansPro-Light}(localFont 分支)
% 9 个 .otf,SIL OFL 1.1 可用,但本仓库不打算为一份字体再带 4 MB。
% ③ \setfontfamily\FA[Path=fonts/]{FontAwesome}
% Path 指向本目录下不存在的 fonts/ —— 那份图标字体在 TeX Live 里。
%
% 现在的映射:
% 西文正文 Source Sans Pro Light → TeX Gyre Termes(本仓库自带)
% 中文正文 Adobe Song / HarmonyOS → OUC Serif(思源宋体子集,自带)
% 中文粗体 (原来=不变) → OUC Serif Bold(真粗体)
% 中文斜体 无 → OUC Kai(楷体代斜体,中文惯例)
% FontAwesome TeX Live 系统包 → 仓库 fonts/fontawesome/
%
% ⚠️ 字体文件本体在 ../fonts/ 下,由 ../fonts.tex 统一设置,
% **不要在本文档或 .tex 里再写 \setCJKmainfont / \setmainfont**。
% 下面只做"西文用哪一档"的局部调整。
%-------------------------------------------------------------------------------
% FontAwesome:图标字体已经放进仓库公共字体目录,
% ⚠️ 但**不要在这里重新声明 \FA** —— fontawesome.sty 自己在正文里就做了
% \newfontfamily{\FA}[Path=../fonts/fontawesome/]{FontAwesome.otf}
% 且它在 \RequirePackage{fontawesome} 时就执行(早于本 cls 的后面几句)。
% 这里再声明一次会报 "Font \FA already defined"(LaTeX3 的
% \NewDocumentCommand 语义),所以只留注释说明。
%
% 上游原来是 \setfontfamily\FA[Path=fonts/]{FontAwesome},
% Path 指向本目录下并不存在的 fonts/ —— 只能靠系统字体兜底。
% 现在路径写进 fontawesome.sty 了。
% 西文正文:上游用 Source Sans Pro Light(很细),本模板改用 Cochineal。
%
% ⚠️ 这里**不能**直接 \setmainfont —— 那会在 cls 里再写一套字体声明,
% 违反本仓库「字体只在 ../fonts.tex 声明」的规矩(换字号/换字体时
% 要改两处,早晚改漏一处)。改调用 fonts.tex 提供的开关命令。
%
% 为什么从 Termes 换成 Cochineal:
% 中文用思源宋体(OUC Serif),笔画中等粗细;Termes 是 Times 的度量
% 兼容替代,笔画偏细偏紧,中英混排时西文那一段视觉上会"陷进去"。
% Cochineal(Minion 风格)笔画更饱满,与宋体灰度接近。
% 宽度只差 1.9%(229.68 → 225.42pt @10pt),断行位置基本不动。
%
% 注意 \tnr / \tnrb 也被这个命令一并重指向,否则上游代码里显式写
% \tnr 的地方仍是 Termes,同一页会混两种西文字体。
%
% ⚠️ 必须包在 \AtBeginDocument 里,不能直接写 \oucUseCochineal:
% cls 执行时主文件还没 \input{../fonts.tex},那个命令尚未定义,会报
% ! Undefined control sequence.
% l.191 \oucUseCochineal
% \AtBeginDocument 的内容排在导言区末尾才展开,那时 fonts.tex 已读入。
% ⚠️ 不要用 \providecommand 兜底:兜底会让 fonts.tex 缺席时静默跳过
% 换字体,比直接报错更难查。
\AtBeginDocument{\oucUseCochineal}
% 上游用 Source Sans Pro 的 Light / Semibold 两档,这里映射到 Cochineal
% 的常规/粗体,保持"正文常规、强调加粗"的层级不变。
% ⚠️ 要在 \AtBeginDocument 之后重新定义才指向新字体,故也放进
% \AtBeginDocument;直接用 \providecommand 会在换字体前就把 \tnr
% 的**旧值**(Termes)存进去,之后再改 \tnr 也传不过去。
\AtBeginDocument{%
\providecommand{\sourcesanslight}{\tnr}%
\providecommand{\sourcesanssemibold}{\tnrb}%
}
%New length definition
%
% ⚠️ 这两个长度原来写死 14.8cm / 2.5cm,加起来 17.3cm,看着小于版心宽
% 18cm(A4 21cm − 2×1.5cm 边距)。但 longtable 每列还有 \tabcolsep
% 各占左右一侧(默认 6pt),两列共 4 个 \tabcolsep = 24pt ≈ 0.85cm,
% 于是实际占宽 18.15cm → 溢出 4.48pt,报
% Overfull \hbox (4.48311pt too wide) in alignment at lines 20--70
% 这种"算着够、实际差一点"的溢出,换字号/字体后会时有时无,很难查。
%
% 改法:不让它猜,直接用版心宽减去左列与列间距。
%
% ⚠️⚠️ 【必须在 \AtBeginDocument 里算,不能在 cls 的这里直接 \setlength】
%
% 根因:\RequirePackage[margin=1.5cm]{geometry} 只是**登记**参数,
% geometry 真正改写 \textwidth 是在导言区结束时(\begin{document}
% 的那一刻)。cls 里这条 \setlength 执行得比它早,读到的是 article
% 的默认 \textwidth = 345pt,于是算出
% 345 − 71.13(2.5cm) − 24(4×6pt) = 249.87pt
% 而真实版心宽 18cm = 512.15pt,本应是
% 512.15 − 71.13 − 24 = 417.02pt
% 两者差 167.15pt。
%
% 后果不是报错,而是**整块内容右移**:longtable 默认把宽度小于版心
% 的表格居中排(\LTleft/\LTright 都是 \fill),表格总宽只剩 345pt,
% 于是在 512pt 的版心里左留白 (512.15−345)/2 ≈ 83.6pt。
% 表现就是「项目经验那一节缩进了一大截」——左边 2.5cm 的日期列被
% 推到 x≈145pt,而其他用 tabular 的章节(工作经历/教育经历/奖励)
% 还是 x≈48pt,两节对不齐。
% 日志里零 error、零 warning,只看日志发现不了。
%
% 验证方式(改完看这个数对不对):
% \typeout{\the\rightcolumnlength} → 416.6pt 左右
% 若仍是 249.86pt 左右,说明又被别的地方提前算掉了。
%
% ⚠️ 用 \textwidth 而不是 \linewidth:\linewidth 在列表/环境里会被
% 局部改写,而这张表永远按版心宽排。
%
% ⚠️ 还要减掉 \arrayrulewidth(0.4pt):experiences 环境用的是
% {R{..}|E},中间那条竖线本身占 0.4pt 宽度。只减 4 个 \tabcolsep
% 的话,表格总宽 = 版心宽 + 0.4,日志里会多一条
% Overfull \hbox (0.4pt too wide) in alignment
% 数值小到肉眼看不出来,但属于「算得不准」,一并修掉。
%
% ⚠️ 与西文字体联动:\rightcolumnlength 里没有西文字宽,所以换字体
% (Termes → Cochineal)不影响这个数的正确性;但右栏 p{} 的断行
% 会随字体变,换字体后必须复查一遍日志有没有新 Overfull。
\newlength{\rightcolumnlength}
\newlength{\leftcolumn}
\setlength{\leftcolumn}{2.5cm}
\AtBeginDocument{%
\setlength{\rightcolumnlength}{%
\dimexpr\textwidth-\leftcolumn-4\tabcolsep-\arrayrulewidth\relax}%
}
% Font Awesome icons aliases
\newcommand{\mailSymbol}{\faEnvelope}
\newcommand{\mailSymbolO}{\faEnvelopeO}
\newcommand{\locationSymbol}{\faMapMarker}
\newcommand{\infoSymbol}{\faInfo}
\newcommand{\homeSymbol}{\faLink}
\newcommand{\weiboSymbol}{\faWeibo}
\newcommand{\linkedinSymbol}{\faLinkedin}
\newcommand{\mobileSymbol}{\faMobilePhone}
\newcommand{\githubSymbol}{\faGithub}
\newcommand\link[2]{\color{linkcolor}\href{#1}{#2}\color{Black} }
\newcommand\important[1]{\textbf #1}
% Create a tag
% Usage: \cvtag{<tag label>}
\newcommand{\cvtag}[1]{%
%\tikz[baseline]\node[anchor=base,draw=darkGrey!70,rounded corners=0.5ex,inner xsep=1ex,inner ysep =0.55ex,text height=1.3ex,text depth=.25ex]{#1};
\begin{tikzpicture}
\node[anchor=base,draw=darkGrey!70,rounded corners=0.5ex,inner xsep=1ex,inner ysep =0.4ex,text height=2ex,text depth=.25ex]{#1};
\end{tikzpicture}
}
% Create a chinese tag
% Usage: \cvtag{<tag label>}
\newcommand{\cvtagcn}[1]{%
%\tikz[baseline]\node[anchor=base,draw=darkGrey!70,rounded corners=0.5ex,inner xsep=1ex,inner ysep =0.55ex,text height=1.3ex,text depth=.25ex]{#1};
\begin{tikzpicture}
\node[anchor=base,draw=darkGrey!70,rounded corners=0.5ex,inner xsep=1ex,inner ysep =0.4ex,text height=2ex,text depth=.25ex]{#1};
\end{tikzpicture}
}
% Render author's name
% Usage: \user{<firstanme>}{<lastname>}
\newcommand\user[2]{\color{accentcolor}{\LARGE #1 \textbf{#2}}\color{Black}}
% Render a text with its symbol
% Usage; \socialtext{<icon>}{<label>}
\newcommand{\socialtext}[2]{\mbox{\textcolor{symbolcolor}{#1}\hspace{0.5em}#2\hspace{1em}}}
% Render a link with its symbol
% Usage; \sociallink{<icon>}{<label>}
%\newcommand{\sociallink}[3]{\mbox{\textcolor{symbolcolor}{#1}\hspace{0.5em}#2\hspace{1em}}}
\newcommand{\sociallink}[3]{\mbox{\textcolor{symbolcolor}{#1}\hspace{0.5em}\link{#2}{#3}\hspace{1em}}}
% Define author's name
% Usage: \name{<firstname>}{<lastname>}
% Usage: \firstname{<firstname>}
% Usage: \lastname{<lastname>}
% Usage: \familyname{<familyname>}
\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}}
\newcommand*{\firstname}[1]{\def\@firstname{#1}}
\newcommand*{\lastname}[1]{\def\@lastname{#1}}
\newcommand*{\familyname}[1]{\def\@lastname{#1}}
\def\@familyname{\@lastname}
% Define author's tagline
% Usage: \tagline{<tag line>}
\newcommand*{\tagline}[1]{\def\@tagline{#1}}
% Define author's photo
% Usage \photo{<diameter>}{<photo>}
\newcommand{\photo}[2]{\def\@photo{#2}\def\@photodiameter{#1}}
%----------------------------------------------------------------------
% 校徽(可选,默认不印)
%
% 用法(导言区,\begin{document} 之前):
% \cvlogo{28mm} % 用仓库里带的横式彩色校徽
% \cvlogo{28mm}[ouc_logo_彩色] % 换成圆形校徽
% \cvlogo{28mm}[ouc_横式_海大红] % 换配色
% 不调用就完全不出现,版面与调用前逐字节一致。
%
% ⚠️ 本目录 logos/ 下**只放实际用到的那一个**(横式彩色,377KB)。
% 想换圆形或别的配色,从 ../科技报告/logos/ 复制过来即可,
% 那边有全部官方 VI 素材:
% ouc_logo_{彩色,海大红,海大蓝,天蓝,专金,墨黑}.png 圆形 1200×1200
% ouc_横式_{彩色,海大红,海大蓝,黑}.png 横式 2400×640
% (不预先全放进来,是因为每个 300~380KB,用不到就是纯占体积。)
%
% ⚠️ 导言区只**登记**参数,真正画图是在 \makecvheader 开头做的
% (见下面 \@makecvlogo)。原因:导言区不能产生任何内容,
% 直接在导言区画 tikzpicture 会报
% ! LaTeX Error: Missing \begin{document}.
%
% 定位:距纸左 10mm、距纸顶 6mm(相对【纸边】,不随页边距变)。
% 两个数值分别由 \cvlogox / \cvlogoy 控制,想在导言区微调就重设:
% \setlength{\cvlogox}{12mm}
% \setlength{\cvlogoy}{8mm}
%
% ⚠️ 为什么距顶是 6mm 而不是科技报告的 20mm:
% 简历页边距只有 15mm(科技报告是 27mm),抬头第一行「姓名」的墨迹顶
% 就在 48.8pt = 17.2mm。28mm 宽的横式 logo 高 7.06mm,若距顶 20mm
% 会直接压到姓名上,距顶 8mm 也只剩 6pt 间隙(2mm,视觉上贴着)。
% 实际6mm 时 logo 下沿在 13.1mm,仍在 15mm 版心边距以内,
% 距姓名顶有 11.6pt(4.1mm),是这块空间里最平衡的位置。
%
% ⚠️ 距纸左 10mm 已接近 A4 打印的裁切余量(一般 10~12mm),
% 不要再改小。同理距顶 6mm 也偏小 —— **屏幕阅读和普通办公打印没问题**
% (A4 纸本身不裁切),但若要专业印刷/装订,建议把 \cvlogoy 改成 8mm
% 以上,并接受 logo 与姓名靠得近一点。
%
% ⚠️⚠️ 为什么后面跟着 \vspace*{-17pt}:
% tikzpicture 即使全部内容都是 overlay,它本身仍是一个**占一行的盒子**,
% 插在 \makecvheader 前面会把姓名整体往下推 17pt(实际48.8 → 65.8)。
% \smash、\hbox to 0pt、\vbox to 0pt 三种写法都消不掉这一行
% (因为要断行就必须有 \par,有 \par 就有行高)。
% 直接用等量的负 \vspace 抵消,姓名回到 48.8pt,误差 0.0。
% ⚠️ 这个 17pt 与 logo 尺寸无关(18~30mm 五档实际姓名都是 48.8),
% 它是一行正文的高度。但若改了 \parskip 或正文字号,要重新量。
%----------------------------------------------------------------------
\newlength{\cvlogox}
\newlength{\cvlogoy}
\setlength{\cvlogox}{10mm}
\setlength{\cvlogoy}{6mm}
\newcommand{\cvlogo}[2][ouc_横式_彩色]{%
\def\@cvlogowidth{#2}%
\def\@cvlogofile{#1}%
}
% 内部命令:真正画 logo。未调用 \cvlogo 时为空操作。
\newcommand{\@makecvlogo}{%
\ifdefined\@cvlogofile
\begin{tikzpicture}[remember picture, overlay]
\node[anchor=north west, inner sep=0pt,
xshift=\cvlogox, yshift=-\cvlogoy]
at (current page.north west)
{\includegraphics[width=\@cvlogowidth]{logos/\@cvlogofile.png}};
\end{tikzpicture}%
\par\vspace*{-17pt}%
\fi
}
% Render author's address
% Usage: \address{<address>}
\newcommand*{\address}[1]{\socialtext{\locationSymbol}{#1}}
% Render author's infos
% Usage: \infos{<infos>}
\newcommand*{\infos}[1]{\socialtext{\infoSymbol}{#1}}
% Render author's homepage
% Usage: \homepage{<homepage>}
\newcommand*{\homepage}[1]{\sociallink{\homeSymbol}{http://#1}{#1}}
% Render author's homepage
% Usage: \weibo{<weibo>}
\newcommand*{\weibo}[1]{\sociallink{\weiboSymbol}{http://www.weibo.com/#1}{weibo.com/#1}}
% Render author's linked-in (optional)
% Usage: \linkedin{<linked-in-nick>}
\newcommand*{\linkedin}[1]{\sociallink{\linkedinSymbol}{http://www.linkedin.com/in/#1}{linkedin.com/in/#1}}
% Render author's viadeo(optional)
% Usage: \viadeo{<viadeo-nick>}
\newcommand*{\viadeo}[1]{\sociallink{\viadeoSymbol}{http://www.viadeo.com/fr/profile/#1}{viadeo.com/fr/profile/#1}}
% Render author's github (optional)
% Usage: \github{<github-nick>}
\newcommand*{\github}[1]{\sociallink{\githubSymbol}{https://www.github.com/#1}{github.com/#1}} % Github icon + URL
% Render author's email (optional)
% Usage: \email{<email adress>}
\newcommand*{\email}[1]{\sociallink{\mailSymbol}{mailto:#1}{#1}}
\newcommand*{\emailO}[1]{\sociallink{\mailSymbolO}{mailto:#1}{#1}}
% Render author's mobile phone (optional)
% Usage: \smartphone{<mobile phone number>}
\newcommand*\smartphone[1]{\socialtext{\mobileSymbol}{#1}}
% Render author's tagline
\newcommand\resumetitle[1]{
\ifundef{\@
}{
\par{
\bigskip\center{\Large \color{accentcolor}\textsc{#1}\color{Black}}\par
}
\bigskip
}{
% \color{accentcolor}\textsc{\large{#1}}\color{black}
\par{
\bigskip\center{\Large \color{accentcolor}\textsc{#1}\color{Black}}\par
}
\bigskip
}
}
% Define social entries to print in header
\newcommand{\socialinfo}[1]{\def\@socialinfo{#1}}
% Render CV header
% Needs \@firstname, \@lastname and \@tagline to be defined
\newcommand*{\makecvheader}{
\@makecvlogo% 校徽(未调用 \cvlogo 时为空操作,不占位)
\ifundef{\@alternative}{
\ifundef{\@photodiameter}{
\begin{minipage}{\linewidth}
}{
\begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em}
}
% ⚠️ 原文是 \vspace*{0.3cm}\\ —— \vspace 后面紧跟 \\ 会在
% 换行前多出一个**空的 hbox**,日志每条都刷
% Underfull \hbox (badness 10000) in paragraph at lines 75--75
% 改用 \\[0.3cm](换行并附垂直间距,LaTeX 标准写法),
% 间距效果完全一样,但不产生空盒。下面的 \smallskip\\
% 同理改成 \\[\smallskipamount]。
\color{accentcolor}\user{\@firstname}{\@lastname}\color{black}\\[0.3cm]
\small{\@socialinfo}
\end{minipage}
\ifdef{\@photodiameter}{
\begin{minipage}{\@photodiameter}
\begin{tikzpicture}%
\node[circle, text=white, minimum size=2.5cm,
path picture={\node at (path picture bounding box.center){
\includegraphics[width=2.5cm]{\@photo}
};
}]{ };
\end{tikzpicture}
\end{minipage}
}{}
\resumetitle{\@tagline}
}{
\ifundef{\@photodiameter}{
\begin{minipage}{\linewidth}
}{
\begin{minipage} {\dimexpr\linewidth-\@photodiameter-2em}
}
\user{\@firstname}{\@lastname}\\[0.3cm]
\resumetitle{\@tagline}
\\[\smallskipamount]
\small{\@socialinfo}
\end{minipage}
\ifdef{\@photodiameter}{
\begin{minipage}{\@photodiameter}
\begin{tikzpicture}%
\node[circle, text=white, minimum size=2.5cm,
path picture={\node at (path picture bounding box.center){
\includegraphics[width=2.5cm]{\@photo}
};
}]{ };
\end{tikzpicture}
\end{minipage}
% \begin{minipage}{\@photodiameter}
% \tikz\path[fill overzoom image={\@photo}]circle[radius=0.5\linewidth];
% \end{minipage}
}{}
\bigskip
}
}
% Resume part title definition
\newcommand\sectionTitle[2]{\section{\texorpdfstring{\color{accentcolor}#2\enspace \textbf{#1}}{#1}}}
% Define a new column type for the scholarship environment
\newcolumntype{Y}{>{\raggedleft}p{\leftcolumn}}
% Define the 'scholarship' environment
\newenvironment{scholarship}{%
\begin{tabular}{Y p{\rightcolumnlength}}
}{%
\end{tabular}
}
% Render a scholarshipentry in the scolarship environment
% Usage: \scholarshipentry{<date>}{<description>}
\newcommand\scholarshipentry[2]{
#1 & #2 \\
}
% Define the 'skills' environment
\newenvironment{skills}{%
\begin{longtable}{R{\leftcolumn}p{\rightcolumnlength}}
}{%
\end{longtable}
}
% Render a skill in the skills environment
% Usage: \skill{<skill>}{<level>}
\newcommand\skill[2]{
\textsc{#1} & \foreach \x in {1,...,5}{{\color{accentcolor!80} \ifnumgreater{\x}{#2}{\faCircleO}{\faCircle}}\enspace }
}
\newcolumntype{E}{>{\raggedright\arraybackslash}p{\rightcolumnlength}}
% Define the 'experiences' environment
\newenvironment{experiences}{%
\begin{longtable}{R{\leftcolumn}|E}
}{%
\end{longtable}
}
% Render an experience in the experiences environment
% Usage:
% \tags {<Technology list>}
\newcommand\tags[1]{
\foreach \n in {#1}{\cvtagcn{\n}}
}
% Render an experience in the experiences environment
% Usage:
% \experience
% {<End date>} {<Title>}{<Enterprise>}{<Country>}
% {<Start date} {
% <Experience description (Could be a list)>
% }
% {<Technology list>}
\newcommand\experience[7]{
\textsc{#1} & \textsc{#2, #3, #4} \\*
\textsc{#5} & \begin{minipage}[t]{\rightcolumnlength}
#6
\end{minipage} \\*
& \footnotesize{\foreach \n in {#7}{\cvtag{\n}}} \\
}
% Render a consultant experience in the experiences environment
% Usage:
% \consultantexperience
% {<End date>} {<Consultant title>}{<Consulting Enterprise>}{<Country>}
% {<Start date} {<Client title>}{<Client business unit>}
% {
% <Experience description (Could be a list)>
% }
% {<Technology list>}
\newcommand\consultantexperience[9]{
\textsc{#1} & \textsc{#2, #3, #4} \\*
\textsc{#5} & \emph{#6} pour #7 \\*
& \begin{minipage}[t]{\rightcolumnlength}
#8
\end{minipage} \\*
& \footnotesize{\foreach \n in {#9}{\cvtag{\n}}} \\
}
\newcommand\emptySeparator{\multicolumn{2}{c}{}\\}
%======================================================================
% 成果统计:让概述里的数字自动来自后面章节的条目
%
% 问题:简历第一段概述通常写「发表论文 40 余篇、授权专利 12 项、成果转化
% 3 项……」。这些数字若手写,每增删一条论文就得回头改概述,极易漏改。
%
% 思路:正文里计数,概述用 \cvnum 取数。**列几条就算几条**,不去猜总数——
% 你不列出来的成果本来也不该出现在概述里。
%
% 两种写法,按「一条算几类」选:
%
% 【全自动】cvlist 环境 —— 一条 = 一个成果时用,**条目里什么都不用写**
% \begin{cvlist}{软著}
% \item 某某系统...登记号...
% \item 另一个系统...
% \end{cvlist}
% 每多一个 \item 自动 +1。增删条目完全不用管标记。
% 目前用于:软著(section_06)、成果转化(section_08)、教研(section_09)。
%
% 【半自动】逐条标记 —— 一条要算进多个类别时用
% \cvmark{类别} 只计数,不显示(专利、科研项目用)
% \cvtagcount{类别} 显示加粗文字 + 计数(论文的 SCI/EI/核心用)
% 专利一条要同时算「专利」和「第一发明人」,项目要同时算
% 「科研项目」和「主持/负责」,cvlist 一次只能管一类,故用标记。
%
% 【概述取数】两种写法统一:
% \cvnum{类别} 单类
% \cvnum*{A,B} 多类求和(英文逗号)
% 空类别返回 0,不会出现 ??,所以可以先写 \cvnum{EI} 再加标记。
% 类别名随用随建,不需要预先注册。
%
% ⚠️ 为什么用独立数据文件而不是 LaTeX 的 aux:
% 实际中文键经 aux 往返后 \ifcsname 全部匹配不上(xeCJK 把汉字设为
% 活动字符,键的 token 形态与写入时不一致;ASCII 键正常,中文键失效)。
% 故改用独立文件 \jobname.cvnum,导言区末尾 \input,键原样保留。
%
% ⚠️ 必须编译两遍(或直接用 latexmk):
% 第一遍边累加边写 \jobname.cvnum,此时概述读到的是**上一遍**的值,
% 首次编译会显示 0;第二遍才是正确数字。日志末尾有 CVSTATS 一行提示。
%
% ⚠️ \jobname.cvnum 是**生成文件**,不要手改、不要提交 git(已在
% .gitignore 里挡住)。删掉它只会让数字从 0 重新算一遍,下一遍即恢复。
%
% ⚠️ 类别名限制:
% · 不要含英文逗号(, 是 \cvnum* 的分隔符)
% · 不要含 @ % # \ { } 这些特殊字符
% · 中文、英文、汉字混排都可以
%======================================================================
\makeatletter
% ---- 数据文件 ------------------------------------------------------
\newwrite\cv@statsout
% 读:导言区末尾把上一遍写入的数字读进来。
% 此时正文尚未开始,不会和本遍的累加互相干扰。
\AtBeginDocument{\InputIfFileExists{\jobname.cvnum}{}{}}
% ---- 内部:类别 -> 计数器名 ----------------------------------------
% 累加值存在 \cvacc@<类别>(TeX 整数寄存器,不用 LaTeX counter,
% 既省事又避开 \the\csname...\endcsname 的展开陷阱)。
% 显示值存在 \cvnum@<类别>(\def 出来的宏,内容就是数字字符串)。
\newcommand\cv@accname[1]{cvacc@#1}
% 保证某类别的累加器存在
\newcommand\cv@ensureacc[1]{%
\@ifundefined{\cv@accname{#1}}%
{\expandafter\newcount\csname\cv@accname{#1}\endcsname}%
{}%
}
% ---- 标记 ----------------------------------------------------------
% \cvmark{<类别>}:把该类别的累加器 +1,无可见输出。
\newcommand\cvmark[1]{%
\cv@ensureacc{#1}%
\global\advance\csname\cv@accname{#1}\endcsname\@ne
% 顺便登记该类别的名字,收尾时按登记顺序写文件
\@ifundefined{cv@seen@\detokenize{#1}}%
{\expandafter\gdef\csname cv@seen@\detokenize{#1}\endcsname{1}%
\g@addto@macro\cv@taglist{\cv@writeone{#1}}}%
{}%
}
% ---- 自动计数列表环境:cvlist --------------------------------------
% \begin{cvlist}{<类别>} ... \end{cvlist}
%
% 进入环境后,**每个 \item 自动 +1**,不需要在条目里写 \cvmark。
% 这是最省事也最不容易漏的方式:增删条目完全不用管标记。
%
% 适用于「一条就是一个成果、章节条目数就是总数」的章节:
% 软件著作权、成果转化、教研项目、专利(见下)、奖励……
% 不适用于「一条里含多个类别」的场景(比如论文一条要同时算 SCI 和总篇数),
% 那种仍用 \cvtagcount / \cvmark 逐条标。
%
% 用法:
% \begin{cvlist}{软著}
% \item 某系统...登记号...
% \item 另一个系统...
% \end{cvlist}
% 概述里写 \cvnum{软著} → 2
%
% ⚠️ 环境内部就是普通 itemize,版式完全不变(\begin{itemize} 包在里面)。
% ⚠️ 不能在 cvlist 里再嵌套 itemize 写子项——子项的 \item 也会被算进去。
% 需要子项就用普通 itemize + 手写 \cvmark。
\newenvironment{cvlist}[1]{%
\cvlistcat{#1}%
\begin{itemize}%
}{%
\end{itemize}%
}
% 记录当前 cvlist 的类别;\item 被重定义成「先计数再走原 \item」
% ⚠️ \cvmark 内部用 \detokenize 处理类别名,所以必须先把 \cv@listcat
% **展开成实际文字**再传进去;否则写进 .cvnum 的是字面串 "\cv@listcat"。
\newcommand\cvlistcat[1]{%
\def\cv@listcat{#1}%
\let\cv@origitem\item
\renewcommand\item{\expandafter\cvmark\expandafter{\cv@listcat}\cv@origitem}%
}
% ---- 输出 ----------------------------------------------------------
% \cvnum{SCI} 单类取数
% \cvnum*{SCI,EI} 多类求和
\newcommand\cvnum{\@ifstar\cv@numsum\cv@numone}
% ---- 带计数的标签:显示 + 计数一步完成 ------------------------------
% \cvtagcount{<显示文字>}[<类别>]
% 显示「显示文字」(与正文同号加粗,和原来的 \textbf{SCI} 完全一样),
% 同时给类别 +1。省略类别时用显示文字本身当类别。
%
% 为什么需要它:论文的收录类型本来就写成 \textbf{SCI} 显示在条目末尾,
% 若再单独写一个 \cvmark{SCI},一是啰嗦,二是迟早会漏标。
% 用 \cvtagcount{SCI} 一次到位,显示与计数永远同步。
%
% 用法:
% \cvtagcount{SCI} % 显示 SCI,类别也叫 SCI
% \cvtagcount{核心}[中文核心] % 显示「核心」,类别记为「中文核心」
\newcommand\cvtagcount[2][\relax]{%
\textbf{#2}%
\ifx\relax#1\relax\cvmark{#2}\else\cvmark{#1}\fi}
\newcommand\cv@numone[1]{%
\@ifundefined{cvnum@#1}{0}{\csname cvnum@#1\endcsname}}
\newcommand\cv@numsum[1]{%
\begingroup
\count@\z@
\@for\cv@k:=#1\do{%
\@ifundefined{cvnum@\cv@k}{}{\advance\count@\csname cvnum@\cv@k\endcsname\relax}%
}%
\the\count@
\endgroup}
% ---- 收尾:写数据文件 ----------------------------------------------
% 用独立的 write 流,与 aux 完全无关,因此不受 aux 读入时机影响。
\newcommand\cv@taglist{}
\newcommand\cv@writeone[1]{%
\immediate\write\cv@statsout{%
\string\cvSetNum{\detokenize{#1}}{\the\csname\cv@accname{#1}\endcsname}}%
}
\AtEndDocument{%
\immediate\openout\cv@statsout=\jobname.cvnum\relax
\cv@taglist
\immediate\closeout\cv@statsout
% 日志提示:本遍写入了多少类
\typeout{CVSTATS: 已写入 \jobname.cvnum(若概述数字为 0,请再编译一遍)}%
}
% 数据文件里调用的设置命令。
% ⚠️ 不能含 @:读回时若 @ 不是字母,命令名会被拆断。
\newcommand\cvSetNum[2]{%
\expandafter\def\csname cvnum@#1\endcsname{#2}}
\makeatother
+88
View File
@@ -0,0 +1,88 @@
%% start of file `fontawesome.sty'.
%% Copyright 2013-2016 Xavier Danaux (xdanaux@gmail.com).
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License version 1.3c,
% available at http://www.latex-project.org/lppl/.
%-------------------------------------------------------------------------------
% identification
%-------------------------------------------------------------------------------
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{fontawesome}[2016/05/15 v4.6.3.1 font awesome icons]
%-------------------------------------------------------------------------------
% requirements
%-------------------------------------------------------------------------------
\RequirePackage{ifxetex,ifluatex}
\newif\iffontawesome@otf\fontawesome@otffalse
\ifxetex
\fontawesome@otftrue
\else
\ifluatex
\fontawesome@otftrue\fi\fi
%-------------------------------------------------------------------------------
% generic implementation
%-------------------------------------------------------------------------------
% generic command to display an icon by its name
\newcommand*{\faicon}[1]{%
{\csname faicon@#1\endcsname}}
% generic icon commands and aliases
\input{fontawesomesymbols-generic.tex}
%-------------------------------------------------------------------------------
% xe- and lualatex implementation
%-------------------------------------------------------------------------------
\iffontawesome@otf
\usepackage{fontspec}
% definition of \FA as a shortcut to load the Font Awesome font
%
% ⚠️ 本行已改(原为 \newfontfamily{\FA}{FontAwesome})。
% 原写法按**字体名**去找系统字体,只在装过 fontawesome 宏包+字体的
% TeX 发行版里成立;本仓库要求"字体只有一份来源",所以显式给路径。
% Path 相对**编译时的工作目录**,也就是本模板目录(简历/)。
% 字体文件:../fonts/fontawesome/FontAwesome.otf
%
% ⚠️ 是 ../fonts 不是 ../../fonts。模板目录与 fonts/ 同在仓库根下,
% 只隔一层。写成 ../../ 时 fontspec 报的错是
% Package fontspec Error: The font "FontAwesome" cannot be found.
% 看起来像"字体名不对",实际是路径根本不存在 —— 排查时别被
% 错误信息误导,先 ls 一下路径。
\newfontfamily{\FA}[Path=../fonts/fontawesome/,Extension=.otf]{FontAwesome}
% icon-specific commands
\input{fontawesomesymbols-xeluatex.tex}
%-------------------------------------------------------------------------------
% (pdf)latex implementation
%-------------------------------------------------------------------------------
\else
% definition of \FA... as a shortcut to load the Font Awesome font
\DeclareRobustCommand\FAone{\fontencoding{U}\fontfamily{fontawesomeone}\selectfont}
\DeclareRobustCommand\FAtwo{\fontencoding{U}\fontfamily{fontawesometwo}\selectfont}
\DeclareRobustCommand\FAthree{\fontencoding{U}\fontfamily{fontawesomethree}\selectfont}
% icon-specific commands
\input{fontawesomesymbols-pdftex.tex}
\fi
%-------------------------------------------------------------------------------
% fix for FontAwesome icon names containing numerals
%-------------------------------------------------------------------------------
\renewcommand{\faHourglass}[1][]{%
\faicon{hourglass\if\relax\detokenize{#1}\relax\else-#1\fi}}
\renewcommand{\faBattery}[1][4]{%
\faicon{battery-#1}}
\endinput
%% end of file `fontawesome.sty'.
+731
View File
@@ -0,0 +1,731 @@
\def\faGlass{\faicon{glass}}
\def\faMusic{\faicon{music}}
\def\faSearch{\faicon{search}}
\def\faEnvelopeO{\faicon{envelope-o}}
\def\faHeart{\faicon{heart}}
\def\faStar{\faicon{star}}
\def\faStarO{\faicon{star-o}}
\def\faUser{\faicon{user}}
\def\faFilm{\faicon{film}}
\def\faThLarge{\faicon{th-large}}
\def\faTh{\faicon{th}}
\def\faThList{\faicon{th-list}}
\def\faCheck{\faicon{check}}
\def\faTimes{\faicon{times}}
\def\faSearchPlus{\faicon{search-plus}}
\def\faSearchMinus{\faicon{search-minus}}
\def\faPowerOff{\faicon{power-off}}
\def\faSignal{\faicon{signal}}
\def\faCog{\faicon{cog}}
\def\faTrashO{\faicon{trash-o}}
\def\faHome{\faicon{home}}
\def\faFileO{\faicon{file-o}}
\def\faClockO{\faicon{clock-o}}
\def\faRoad{\faicon{road}}
\def\faDownload{\faicon{download}}
\def\faArrowCircleODown{\faicon{arrow-circle-o-down}}
\def\faArrowCircleOUp{\faicon{arrow-circle-o-up}}
\def\faInbox{\faicon{inbox}}
\def\faPlayCircleO{\faicon{play-circle-o}}
\def\faRepeat{\faicon{repeat}}
\def\faRefresh{\faicon{refresh}}
\def\faListAlt{\faicon{list-alt}}
\def\faLock{\faicon{lock}}
\def\faFlag{\faicon{flag}}
\def\faHeadphones{\faicon{headphones}}
\def\faVolumeOff{\faicon{volume-off}}
\def\faVolumeDown{\faicon{volume-down}}
\def\faVolumeUp{\faicon{volume-up}}
\def\faQrcode{\faicon{qrcode}}
\def\faBarcode{\faicon{barcode}}
\def\faTag{\faicon{tag}}
\def\faTags{\faicon{tags}}
\def\faBook{\faicon{book}}
\def\faBookmark{\faicon{bookmark}}
\def\faPrint{\faicon{print}}
\def\faCamera{\faicon{camera}}
\def\faFont{\faicon{font}}
\def\faBold{\faicon{bold}}
\def\faItalic{\faicon{italic}}
\def\faTextHeight{\faicon{text-height}}
\def\faTextWidth{\faicon{text-width}}
\def\faAlignLeft{\faicon{align-left}}
\def\faAlignCenter{\faicon{align-center}}
\def\faAlignRight{\faicon{align-right}}
\def\faAlignJustify{\faicon{align-justify}}
\def\faList{\faicon{list}}
\def\faOutdent{\faicon{outdent}}
\def\faIndent{\faicon{indent}}
\def\faVideoCamera{\faicon{video-camera}}
\def\faPictureO{\faicon{picture-o}}
\def\faPencil{\faicon{pencil}}
\def\faMapMarker{\faicon{map-marker}}
\def\faAdjust{\faicon{adjust}}
\def\faTint{\faicon{tint}}
\def\faPencilSquareO{\faicon{pencil-square-o}}
\def\faShareSquareO{\faicon{share-square-o}}
\def\faCheckSquareO{\faicon{check-square-o}}
\def\faArrows{\faicon{arrows}}
\def\faStepBackward{\faicon{step-backward}}
\def\faFastBackward{\faicon{fast-backward}}
\def\faBackward{\faicon{backward}}
\def\faPlay{\faicon{play}}
\def\faPause{\faicon{pause}}
\def\faStop{\faicon{stop}}
\def\faForward{\faicon{forward}}
\def\faFastForward{\faicon{fast-forward}}
\def\faStepForward{\faicon{step-forward}}
\def\faEject{\faicon{eject}}
\def\faChevronLeft{\faicon{chevron-left}}
\def\faChevronRight{\faicon{chevron-right}}
\def\faPlusCircle{\faicon{plus-circle}}
\def\faMinusCircle{\faicon{minus-circle}}
\def\faTimesCircle{\faicon{times-circle}}
\def\faCheckCircle{\faicon{check-circle}}
\def\faQuestionCircle{\faicon{question-circle}}
\def\faInfoCircle{\faicon{info-circle}}
\def\faCrosshairs{\faicon{crosshairs}}
\def\faTimesCircleO{\faicon{times-circle-o}}
\def\faCheckCircleO{\faicon{check-circle-o}}
\def\faBan{\faicon{ban}}
\def\faArrowLeft{\faicon{arrow-left}}
\def\faArrowRight{\faicon{arrow-right}}
\def\faArrowUp{\faicon{arrow-up}}
\def\faArrowDown{\faicon{arrow-down}}
\def\faShare{\faicon{share}}
\def\faExpand{\faicon{expand}}
\def\faCompress{\faicon{compress}}
\def\faPlus{\faicon{plus}}
\def\faMinus{\faicon{minus}}
\def\faAsterisk{\faicon{asterisk}}
\def\faExclamationCircle{\faicon{exclamation-circle}}
\def\faGift{\faicon{gift}}
\def\faLeaf{\faicon{leaf}}
\def\faFire{\faicon{fire}}
\def\faEye{\faicon{eye}}
\def\faEyeSlash{\faicon{eye-slash}}
\def\faExclamationTriangle{\faicon{exclamation-triangle}}
\def\faPlane{\faicon{plane}}
\def\faCalendar{\faicon{calendar}}
\def\faRandom{\faicon{random}}
\def\faComment{\faicon{comment}}
\def\faMagnet{\faicon{magnet}}
\def\faChevronUp{\faicon{chevron-up}}
\def\faChevronDown{\faicon{chevron-down}}
\def\faRetweet{\faicon{retweet}}
\def\faShoppingCart{\faicon{shopping-cart}}
\def\faFolder{\faicon{folder}}
\def\faFolderOpen{\faicon{folder-open}}
\def\faArrowsV{\faicon{arrows-v}}
\def\faArrowsH{\faicon{arrows-h}}
\def\faBarChart{\faicon{bar-chart}}
\def\faTwitterSquare{\faicon{twitter-square}}
\def\faFacebookSquare{\faicon{facebook-square}}
\def\faCameraRetro{\faicon{camera-retro}}
\def\faKey{\faicon{key}}
\def\faCogs{\faicon{cogs}}
\def\faComments{\faicon{comments}}
\def\faThumbsOUp{\faicon{thumbs-o-up}}
\def\faThumbsODown{\faicon{thumbs-o-down}}
\def\faStarHalf{\faicon{star-half}}
\def\faHeartO{\faicon{heart-o}}
\def\faSignOut{\faicon{sign-out}}
\def\faLinkedinSquare{\faicon{linkedin-square}}
\def\faThumbTack{\faicon{thumb-tack}}
\def\faExternalLink{\faicon{external-link}}
\def\faSignIn{\faicon{sign-in}}
\def\faTrophy{\faicon{trophy}}
\def\faGithubSquare{\faicon{github-square}}
\def\faUpload{\faicon{upload}}
\def\faLemonO{\faicon{lemon-o}}
\def\faPhone{\faicon{phone}}
\def\faSquareO{\faicon{square-o}}
\def\faBookmarkO{\faicon{bookmark-o}}
\def\faPhoneSquare{\faicon{phone-square}}
\def\faTwitter{\faicon{twitter}}
\def\faFacebook{\faicon{facebook}}
\def\faGithub{\faicon{github}}
\def\faUnlock{\faicon{unlock}}
\def\faCreditCard{\faicon{credit-card}}
\def\faRss{\faicon{rss}}
\def\faHddO{\faicon{hdd-o}}
\def\faBullhorn{\faicon{bullhorn}}
\def\faBell{\faicon{bell}}
\def\faCertificate{\faicon{certificate}}
\def\faHandORight{\faicon{hand-o-right}}
\def\faHandOLeft{\faicon{hand-o-left}}
\def\faHandOUp{\faicon{hand-o-up}}
\def\faHandODown{\faicon{hand-o-down}}
\def\faArrowCircleLeft{\faicon{arrow-circle-left}}
\def\faArrowCircleRight{\faicon{arrow-circle-right}}
\def\faArrowCircleUp{\faicon{arrow-circle-up}}
\def\faArrowCircleDown{\faicon{arrow-circle-down}}
\def\faGlobe{\faicon{globe}}
\def\faWrench{\faicon{wrench}}
\def\faTasks{\faicon{tasks}}
\def\faFilter{\faicon{filter}}
\def\faBriefcase{\faicon{briefcase}}
\def\faArrowsAlt{\faicon{arrows-alt}}
\def\faUsers{\faicon{users}}
\def\faLink{\faicon{link}}
\def\faCloud{\faicon{cloud}}
\def\faFlask{\faicon{flask}}
\def\faScissors{\faicon{scissors}}
\def\faFilesO{\faicon{files-o}}
\def\faPaperclip{\faicon{paperclip}}
\def\faFloppyO{\faicon{floppy-o}}
\def\faSquare{\faicon{square}}
\def\faBars{\faicon{bars}}
\def\faListUl{\faicon{list-ul}}
\def\faListOl{\faicon{list-ol}}
\def\faStrikethrough{\faicon{strikethrough}}
\def\faUnderline{\faicon{underline}}
\def\faTable{\faicon{table}}
\def\faMagic{\faicon{magic}}
\def\faTruck{\faicon{truck}}
\def\faPinterest{\faicon{pinterest}}
\def\faPinterestSquare{\faicon{pinterest-square}}
\def\faGooglePlusSquare{\faicon{google-plus-square}}
\def\faGooglePlus{\faicon{google-plus}}
\def\faMoney{\faicon{money}}
\def\faCaretDown{\faicon{caret-down}}
\def\faCaretUp{\faicon{caret-up}}
\def\faCaretLeft{\faicon{caret-left}}
\def\faCaretRight{\faicon{caret-right}}
\def\faColumns{\faicon{columns}}
\def\faSort{\faicon{sort}}
\def\faSortDesc{\faicon{sort-desc}}
\def\faSortAsc{\faicon{sort-asc}}
\def\faEnvelope{\faicon{envelope}}
\def\faLinkedin{\faicon{linkedin}}
\def\faUndo{\faicon{undo}}
\def\faGavel{\faicon{gavel}}
\def\faTachometer{\faicon{tachometer}}
\def\faCommentO{\faicon{comment-o}}
\def\faCommentsO{\faicon{comments-o}}
\def\faBolt{\faicon{bolt}}
\def\faSitemap{\faicon{sitemap}}
\def\faUmbrella{\faicon{umbrella}}
\def\faClipboard{\faicon{clipboard}}
\def\faLightbulbO{\faicon{lightbulb-o}}
\def\faExchange{\faicon{exchange}}
\def\faCloudDownload{\faicon{cloud-download}}
\def\faCloudUpload{\faicon{cloud-upload}}
\def\faUserMd{\faicon{user-md}}
\def\faStethoscope{\faicon{stethoscope}}
\def\faSuitcase{\faicon{suitcase}}
\def\faBellO{\faicon{bell-o}}
\def\faCoffee{\faicon{coffee}}
\def\faCutlery{\faicon{cutlery}}
\def\faFileTextO{\faicon{file-text-o}}
\def\faBuildingO{\faicon{building-o}}
\def\faHospitalO{\faicon{hospital-o}}
\def\faAmbulance{\faicon{ambulance}}
\def\faMedkit{\faicon{medkit}}
\def\faFighterJet{\faicon{fighter-jet}}
\def\faBeer{\faicon{beer}}
\def\faHSquare{\faicon{h-square}}
\def\faPlusSquare{\faicon{plus-square}}
\def\faAngleDoubleLeft{\faicon{angle-double-left}}
\def\faAngleDoubleRight{\faicon{angle-double-right}}
\def\faAngleDoubleUp{\faicon{angle-double-up}}
\def\faAngleDoubleDown{\faicon{angle-double-down}}
\def\faAngleLeft{\faicon{angle-left}}
\def\faAngleRight{\faicon{angle-right}}
\def\faAngleUp{\faicon{angle-up}}
\def\faAngleDown{\faicon{angle-down}}
\def\faDesktop{\faicon{desktop}}
\def\faLaptop{\faicon{laptop}}
\def\faTablet{\faicon{tablet}}
\def\faMobile{\faicon{mobile}}
\def\faCircleO{\faicon{circle-o}}
\def\faQuoteLeft{\faicon{quote-left}}
\def\faQuoteRight{\faicon{quote-right}}
\def\faSpinner{\faicon{spinner}}
\def\faCircle{\faicon{circle}}
\def\faReply{\faicon{reply}}
\def\faGithubAlt{\faicon{github-alt}}
\def\faFolderO{\faicon{folder-o}}
\def\faFolderOpenO{\faicon{folder-open-o}}
\def\faSmileO{\faicon{smile-o}}
\def\faFrownO{\faicon{frown-o}}
\def\faMehO{\faicon{meh-o}}
\def\faGamepad{\faicon{gamepad}}
\def\faKeyboardO{\faicon{keyboard-o}}
\def\faFlagO{\faicon{flag-o}}
\def\faFlagCheckered{\faicon{flag-checkered}}
\def\faTerminal{\faicon{terminal}}
\def\faCode{\faicon{code}}
\def\faReplyAll{\faicon{reply-all}}
\def\faStarHalfO{\faicon{star-half-o}}
\def\faLocationArrow{\faicon{location-arrow}}
\def\faCrop{\faicon{crop}}
\def\faCodeFork{\faicon{code-fork}}
\def\faChainBroken{\faicon{chain-broken}}
\def\faQuestion{\faicon{question}}
\def\faInfo{\faicon{info}}
\def\faExclamation{\faicon{exclamation}}
\def\faSuperscript{\faicon{superscript}}
\def\faSubscript{\faicon{subscript}}
\def\faEraser{\faicon{eraser}}
\def\faPuzzlePiece{\faicon{puzzle-piece}}
\def\faMicrophone{\faicon{microphone}}
\def\faMicrophoneSlash{\faicon{microphone-slash}}
\def\faShield{\faicon{shield}}
\def\faCalendarO{\faicon{calendar-o}}
\def\faFireExtinguisher{\faicon{fire-extinguisher}}
\def\faRocket{\faicon{rocket}}
\def\faMaxcdn{\faicon{maxcdn}}
\def\faChevronCircleLeft{\faicon{chevron-circle-left}}
\def\faChevronCircleRight{\faicon{chevron-circle-right}}
\def\faChevronCircleUp{\faicon{chevron-circle-up}}
\def\faChevronCircleDown{\faicon{chevron-circle-down}}
\def\faHtml5{\faicon{html5}}
\def\faCss3{\faicon{css3}}
\def\faAnchor{\faicon{anchor}}
\def\faUnlockAlt{\faicon{unlock-alt}}
\def\faBullseye{\faicon{bullseye}}
\def\faEllipsisH{\faicon{ellipsis-h}}
\def\faEllipsisV{\faicon{ellipsis-v}}
\def\faRssSquare{\faicon{rss-square}}
\def\faPlayCircle{\faicon{play-circle}}
\def\faTicket{\faicon{ticket}}
\def\faMinusSquare{\faicon{minus-square}}
\def\faMinusSquareO{\faicon{minus-square-o}}
\def\faLevelUp{\faicon{level-up}}
\def\faLevelDown{\faicon{level-down}}
\def\faCheckSquare{\faicon{check-square}}
\def\faPencilSquare{\faicon{pencil-square}}
\def\faExternalLinkSquare{\faicon{external-link-square}}
\def\faShareSquare{\faicon{share-square}}
\def\faCompass{\faicon{compass}}
\def\faCaretSquareODown{\faicon{caret-square-o-down}}
\def\faCaretSquareOUp{\faicon{caret-square-o-up}}
\def\faCaretSquareORight{\faicon{caret-square-o-right}}
\def\faEur{\faicon{eur}}
\def\faGbp{\faicon{gbp}}
\def\faUsd{\faicon{usd}}
\def\faInr{\faicon{inr}}
\def\faJpy{\faicon{jpy}}
\def\faRub{\faicon{rub}}
\def\faKrw{\faicon{krw}}
\def\faBtc{\faicon{btc}}
\def\faFile{\faicon{file}}
\def\faFileText{\faicon{file-text}}
\def\faSortAlphaAsc{\faicon{sort-alpha-asc}}
\def\faSortAlphaDesc{\faicon{sort-alpha-desc}}
\def\faSortAmountAsc{\faicon{sort-amount-asc}}
\def\faSortAmountDesc{\faicon{sort-amount-desc}}
\def\faSortNumericAsc{\faicon{sort-numeric-asc}}
\def\faSortNumericDesc{\faicon{sort-numeric-desc}}
\def\faThumbsUp{\faicon{thumbs-up}}
\def\faThumbsDown{\faicon{thumbs-down}}
\def\faYoutubeSquare{\faicon{youtube-square}}
\def\faYoutube{\faicon{youtube}}
\def\faXing{\faicon{xing}}
\def\faXingSquare{\faicon{xing-square}}
\def\faYoutubePlay{\faicon{youtube-play}}
\def\faDropbox{\faicon{dropbox}}
\def\faStackOverflow{\faicon{stack-overflow}}
\def\faInstagram{\faicon{instagram}}
\def\faFlickr{\faicon{flickr}}
\def\faAdn{\faicon{adn}}
\def\faBitbucket{\faicon{bitbucket}}
\def\faBitbucketSquare{\faicon{bitbucket-square}}
\def\faTumblr{\faicon{tumblr}}
\def\faTumblrSquare{\faicon{tumblr-square}}
\def\faLongArrowDown{\faicon{long-arrow-down}}
\def\faLongArrowUp{\faicon{long-arrow-up}}
\def\faLongArrowLeft{\faicon{long-arrow-left}}
\def\faLongArrowRight{\faicon{long-arrow-right}}
\def\faApple{\faicon{apple}}
\def\faWindows{\faicon{windows}}
\def\faAndroid{\faicon{android}}
\def\faLinux{\faicon{linux}}
\def\faDribbble{\faicon{dribbble}}
\def\faSkype{\faicon{skype}}
\def\faFoursquare{\faicon{foursquare}}
\def\faTrello{\faicon{trello}}
\def\faFemale{\faicon{female}}
\def\faMale{\faicon{male}}
\def\faGratipay{\faicon{gratipay}}
\def\faSunO{\faicon{sun-o}}
\def\faMoonO{\faicon{moon-o}}
\def\faArchive{\faicon{archive}}
\def\faBug{\faicon{bug}}
\def\faVk{\faicon{vk}}
\def\faWeibo{\faicon{weibo}}
\def\faRenren{\faicon{renren}}
\def\faPagelines{\faicon{pagelines}}
\def\faStackExchange{\faicon{stack-exchange}}
\def\faArrowCircleORight{\faicon{arrow-circle-o-right}}
\def\faArrowCircleOLeft{\faicon{arrow-circle-o-left}}
\def\faCaretSquareOLeft{\faicon{caret-square-o-left}}
\def\faDotCircleO{\faicon{dot-circle-o}}
\def\faWheelchair{\faicon{wheelchair}}
\def\faVimeoSquare{\faicon{vimeo-square}}
\def\faTry{\faicon{try}}
\def\faPlusSquareO{\faicon{plus-square-o}}
\def\faSpaceShuttle{\faicon{space-shuttle}}
\def\faSlack{\faicon{slack}}
\def\faEnvelopeSquare{\faicon{envelope-square}}
\def\faWordpress{\faicon{wordpress}}
\def\faOpenid{\faicon{openid}}
\def\faUniversity{\faicon{university}}
\def\faGraduationCap{\faicon{graduation-cap}}
\def\faYahoo{\faicon{yahoo}}
\def\faGoogle{\faicon{google}}
\def\faReddit{\faicon{reddit}}
\def\faRedditSquare{\faicon{reddit-square}}
\def\faStumbleuponCircle{\faicon{stumbleupon-circle}}
\def\faStumbleupon{\faicon{stumbleupon}}
\def\faDelicious{\faicon{delicious}}
\def\faDigg{\faicon{digg}}
\def\faPiedPiperPp{\faicon{pied-piper-pp}}
\def\faPiedPiperAlt{\faicon{pied-piper-alt}}
\def\faDrupal{\faicon{drupal}}
\def\faJoomla{\faicon{joomla}}
\def\faLanguage{\faicon{language}}
\def\faFax{\faicon{fax}}
\def\faBuilding{\faicon{building}}
\def\faChild{\faicon{child}}
\def\faPaw{\faicon{paw}}
\def\faSpoon{\faicon{spoon}}
\def\faCube{\faicon{cube}}
\def\faCubes{\faicon{cubes}}
\def\faBehance{\faicon{behance}}
\def\faBehanceSquare{\faicon{behance-square}}
\def\faSteam{\faicon{steam}}
\def\faSteamSquare{\faicon{steam-square}}
\def\faRecycle{\faicon{recycle}}
\def\faCar{\faicon{car}}
\def\faTaxi{\faicon{taxi}}
\def\faTree{\faicon{tree}}
\def\faSpotify{\faicon{spotify}}
\def\faDeviantart{\faicon{deviantart}}
\def\faSoundcloud{\faicon{soundcloud}}
\def\faDatabase{\faicon{database}}
\def\faFilePdfO{\faicon{file-pdf-o}}
\def\faFileWordO{\faicon{file-word-o}}
\def\faFileExcelO{\faicon{file-excel-o}}
\def\faFilePowerpointO{\faicon{file-powerpoint-o}}
\def\faFileImageO{\faicon{file-image-o}}
\def\faFileArchiveO{\faicon{file-archive-o}}
\def\faFileAudioO{\faicon{file-audio-o}}
\def\faFileVideoO{\faicon{file-video-o}}
\def\faFileCodeO{\faicon{file-code-o}}
\def\faVine{\faicon{vine}}
\def\faCodepen{\faicon{codepen}}
\def\faJsfiddle{\faicon{jsfiddle}}
\def\faLifeRing{\faicon{life-ring}}
\def\faCircleONotch{\faicon{circle-o-notch}}
\def\faRebel{\faicon{rebel}}
\def\faEmpire{\faicon{empire}}
\def\faGitSquare{\faicon{git-square}}
\def\faGit{\faicon{git}}
\def\faHackerNews{\faicon{hacker-news}}
\def\faTencentWeibo{\faicon{tencent-weibo}}
\def\faQq{\faicon{qq}}
\def\faWeixin{\faicon{weixin}}
\def\faPaperPlane{\faicon{paper-plane}}
\def\faPaperPlaneO{\faicon{paper-plane-o}}
\def\faHistory{\faicon{history}}
\def\faCircleThin{\faicon{circle-thin}}
\def\faHeader{\faicon{header}}
\def\faParagraph{\faicon{paragraph}}
\def\faSliders{\faicon{sliders}}
\def\faShareAlt{\faicon{share-alt}}
\def\faShareAltSquare{\faicon{share-alt-square}}
\def\faBomb{\faicon{bomb}}
\def\faFutbolO{\faicon{futbol-o}}
\def\faTty{\faicon{tty}}
\def\faBinoculars{\faicon{binoculars}}
\def\faPlug{\faicon{plug}}
\def\faSlideshare{\faicon{slideshare}}
\def\faTwitch{\faicon{twitch}}
\def\faYelp{\faicon{yelp}}
\def\faNewspaperO{\faicon{newspaper-o}}
\def\faWifi{\faicon{wifi}}
\def\faCalculator{\faicon{calculator}}
\def\faPaypal{\faicon{paypal}}
\def\faGoogleWallet{\faicon{google-wallet}}
\def\faCcVisa{\faicon{cc-visa}}
\def\faCcMastercard{\faicon{cc-mastercard}}
\def\faCcDiscover{\faicon{cc-discover}}
\def\faCcAmex{\faicon{cc-amex}}
\def\faCcPaypal{\faicon{cc-paypal}}
\def\faCcStripe{\faicon{cc-stripe}}
\def\faBellSlash{\faicon{bell-slash}}
\def\faBellSlashO{\faicon{bell-slash-o}}
\def\faTrash{\faicon{trash}}
\def\faCopyright{\faicon{copyright}}
\def\faAt{\faicon{at}}
\def\faEyedropper{\faicon{eyedropper}}
\def\faPaintBrush{\faicon{paint-brush}}
\def\faBirthdayCake{\faicon{birthday-cake}}
\def\faAreaChart{\faicon{area-chart}}
\def\faPieChart{\faicon{pie-chart}}
\def\faLineChart{\faicon{line-chart}}
\def\faLastfm{\faicon{lastfm}}
\def\faLastfmSquare{\faicon{lastfm-square}}
\def\faToggleOff{\faicon{toggle-off}}
\def\faToggleOn{\faicon{toggle-on}}
\def\faBicycle{\faicon{bicycle}}
\def\faBus{\faicon{bus}}
\def\faIoxhost{\faicon{ioxhost}}
\def\faAngellist{\faicon{angellist}}
\def\faCc{\faicon{cc}}
\def\faIls{\faicon{ils}}
\def\faMeanpath{\faicon{meanpath}}
\def\faBuysellads{\faicon{buysellads}}
\def\faConnectdevelop{\faicon{connectdevelop}}
\def\faDashcube{\faicon{dashcube}}
\def\faForumbee{\faicon{forumbee}}
\def\faLeanpub{\faicon{leanpub}}
\def\faSellsy{\faicon{sellsy}}
\def\faShirtsinbulk{\faicon{shirtsinbulk}}
\def\faSimplybuilt{\faicon{simplybuilt}}
\def\faSkyatlas{\faicon{skyatlas}}
\def\faCartPlus{\faicon{cart-plus}}
\def\faCartArrowDown{\faicon{cart-arrow-down}}
\def\faDiamond{\faicon{diamond}}
\def\faShip{\faicon{ship}}
\def\faUserSecret{\faicon{user-secret}}
\def\faMotorcycle{\faicon{motorcycle}}
\def\faStreetView{\faicon{street-view}}
\def\faHeartbeat{\faicon{heartbeat}}
\def\faVenus{\faicon{venus}}
\def\faMars{\faicon{mars}}
\def\faMercury{\faicon{mercury}}
\def\faTransgender{\faicon{transgender}}
\def\faTransgenderAlt{\faicon{transgender-alt}}
\def\faVenusDouble{\faicon{venus-double}}
\def\faMarsDouble{\faicon{mars-double}}
\def\faVenusMars{\faicon{venus-mars}}
\def\faMarsStroke{\faicon{mars-stroke}}
\def\faMarsStrokeV{\faicon{mars-stroke-v}}
\def\faMarsStrokeH{\faicon{mars-stroke-h}}
\def\faNeuter{\faicon{neuter}}
\def\faGenderless{\faicon{genderless}}
\def\faFacebookOfficial{\faicon{facebook-official}}
\def\faPinterestP{\faicon{pinterest-p}}
\def\faWhatsapp{\faicon{whatsapp}}
\def\faServer{\faicon{server}}
\def\faUserPlus{\faicon{user-plus}}
\def\faUserTimes{\faicon{user-times}}
\def\faBed{\faicon{bed}}
\def\faViacoin{\faicon{viacoin}}
\def\faTrain{\faicon{train}}
\def\faSubway{\faicon{subway}}
\def\faMedium{\faicon{medium}}
\def\faYCombinator{\faicon{y-combinator}}
\def\faOptinMonster{\faicon{optin-monster}}
\def\faOpencart{\faicon{opencart}}
\def\faExpeditedssl{\faicon{expeditedssl}}
\def\faBatteryFull{\faicon{battery-full}}
\def\faBatteryThreeQuarters{\faicon{battery-three-quarters}}
\def\faBatteryHalf{\faicon{battery-half}}
\def\faBatteryQuarter{\faicon{battery-quarter}}
\def\faBatteryEmpty{\faicon{battery-empty}}
\def\faMousePointer{\faicon{mouse-pointer}}
\def\faICursor{\faicon{i-cursor}}
\def\faObjectGroup{\faicon{object-group}}
\def\faObjectUngroup{\faicon{object-ungroup}}
\def\faStickyNote{\faicon{sticky-note}}
\def\faStickyNoteO{\faicon{sticky-note-o}}
\def\faCcJcb{\faicon{cc-jcb}}
\def\faCcDinersClub{\faicon{cc-diners-club}}
\def\faClone{\faicon{clone}}
\def\faBalanceScale{\faicon{balance-scale}}
\def\faHourglassO{\faicon{hourglass-o}}
\def\faHourglassStart{\faicon{hourglass-start}}
\def\faHourglassHalf{\faicon{hourglass-half}}
\def\faHourglassEnd{\faicon{hourglass-end}}
\def\faHourglass{\faicon{hourglass}}
\def\faHandRockO{\faicon{hand-rock-o}}
\def\faHandPaperO{\faicon{hand-paper-o}}
\def\faHandScissorsO{\faicon{hand-scissors-o}}
\def\faHandLizardO{\faicon{hand-lizard-o}}
\def\faHandSpockO{\faicon{hand-spock-o}}
\def\faHandPointerO{\faicon{hand-pointer-o}}
\def\faHandPeaceO{\faicon{hand-peace-o}}
\def\faTrademark{\faicon{trademark}}
\def\faRegistered{\faicon{registered}}
\def\faCreativeCommons{\faicon{creative-commons}}
\def\faGg{\faicon{gg}}
\def\faGgCircle{\faicon{gg-circle}}
\def\faTripadvisor{\faicon{tripadvisor}}
\def\faOdnoklassniki{\faicon{odnoklassniki}}
\def\faOdnoklassnikiSquare{\faicon{odnoklassniki-square}}
\def\faGetPocket{\faicon{get-pocket}}
\def\faWikipediaW{\faicon{wikipedia-w}}
\def\faSafari{\faicon{safari}}
\def\faChrome{\faicon{chrome}}
\def\faFirefox{\faicon{firefox}}
\def\faOpera{\faicon{opera}}
\def\faInternetExplorer{\faicon{internet-explorer}}
\def\faTelevision{\faicon{television}}
\def\faContao{\faicon{contao}}
\def\fa500Px{\faicon{500px}}
\def\faAmazon{\faicon{amazon}}
\def\faCalendarPlusO{\faicon{calendar-plus-o}}
\def\faCalendarMinusO{\faicon{calendar-minus-o}}
\def\faCalendarTimesO{\faicon{calendar-times-o}}
\def\faCalendarCheckO{\faicon{calendar-check-o}}
\def\faIndustry{\faicon{industry}}
\def\faMapPin{\faicon{map-pin}}
\def\faMapSigns{\faicon{map-signs}}
\def\faMapO{\faicon{map-o}}
\def\faMap{\faicon{map}}
\def\faCommenting{\faicon{commenting}}
\def\faCommentingO{\faicon{commenting-o}}
\def\faHouzz{\faicon{houzz}}
\def\faVimeo{\faicon{vimeo}}
\def\faBlackTie{\faicon{black-tie}}
\def\faFonticons{\faicon{fonticons}}
\def\faRedditAlien{\faicon{reddit-alien}}
\def\faEdge{\faicon{edge}}
\def\faCreditCardAlt{\faicon{credit-card-alt}}
\def\faCodiepie{\faicon{codiepie}}
\def\faModx{\faicon{modx}}
\def\faFortAwesome{\faicon{fort-awesome}}
\def\faUsb{\faicon{usb}}
\def\faProductHunt{\faicon{product-hunt}}
\def\faMixcloud{\faicon{mixcloud}}
\def\faScribd{\faicon{scribd}}
\def\faPauseCircle{\faicon{pause-circle}}
\def\faPauseCircleO{\faicon{pause-circle-o}}
\def\faStopCircle{\faicon{stop-circle}}
\def\faStopCircleO{\faicon{stop-circle-o}}
\def\faShoppingBag{\faicon{shopping-bag}}
\def\faShoppingBasket{\faicon{shopping-basket}}
\def\faHashtag{\faicon{hashtag}}
\def\faBluetooth{\faicon{bluetooth}}
\def\faBluetoothB{\faicon{bluetooth-b}}
\def\faPercent{\faicon{percent}}
\def\faGitlab{\faicon{gitlab}}
\def\faWpbeginner{\faicon{wpbeginner}}
\def\faWpforms{\faicon{wpforms}}
\def\faEnvira{\faicon{envira}}
\def\faUniversalAccess{\faicon{universal-access}}
\def\faWheelchairAlt{\faicon{wheelchair-alt}}
\def\faQuestionCircleO{\faicon{question-circle-o}}
\def\faBlind{\faicon{blind}}
\def\faAudioDescription{\faicon{audio-description}}
\def\faVolumeControlPhone{\faicon{volume-control-phone}}
\def\faBraille{\faicon{braille}}
\def\faAssistiveListeningSystems{\faicon{assistive-listening-systems}}
\def\faAmericanSignLanguageInterpreting{\faicon{american-sign-language-interpreting}}
\def\faDeaf{\faicon{deaf}}
\def\faGlide{\faicon{glide}}
\def\faGlideG{\faicon{glide-g}}
\def\faSignLanguage{\faicon{sign-language}}
\def\faLowVision{\faicon{low-vision}}
\def\faViadeo{\faicon{viadeo}}
\def\faViadeoSquare{\faicon{viadeo-square}}
\def\faSnapchat{\faicon{snapchat}}
\def\faSnapchatGhost{\faicon{snapchat-ghost}}
\def\faSnapchatSquare{\faicon{snapchat-square}}
\def\faPiedPiper{\faicon{pied-piper}}
\def\faFirstOrder{\faicon{first-order}}
\def\faYoast{\faicon{yoast}}
\def\faThemeisle{\faicon{themeisle}}
\def\faGooglePlusOfficial{\faicon{google-plus-official}}
\def\faFontAwesome{\faicon{font-awesome}}
% aliases
\def\faCny{\faicon{cny}}\expandafter\def\csname faicon@cny\endcsname{\faicon{jpy}}
\def\faYCombinatorSquare{\faicon{y-combinator-square}}\expandafter\def\csname faicon@y-combinator-square\endcsname{\faicon{hacker-news}}
\def\faCab{\faicon{cab}}\expandafter\def\csname faicon@cab\endcsname{\faicon{taxi}}
\def\faToggleUp{\faicon{toggle-up}}\expandafter\def\csname faicon@toggle-up\endcsname{\faicon{caret-square-o-up}}
\def\faLifeBuoy{\faicon{life-buoy}}\expandafter\def\csname faicon@life-buoy\endcsname{\faicon{life-ring}}
\def\faFileZipO{\faicon{file-zip-o}}\expandafter\def\csname faicon@file-zip-o\endcsname{\faicon{file-archive-o}}
\def\faBitcoin{\faicon{bitcoin}}\expandafter\def\csname faicon@bitcoin\endcsname{\faicon{btc}}
\def\faAutomobile{\faicon{automobile}}\expandafter\def\csname faicon@automobile\endcsname{\faicon{car}}
\def\faPaste{\faicon{paste}}\expandafter\def\csname faicon@paste\endcsname{\faicon{clipboard}}
\def\faResistance{\faicon{resistance}}\expandafter\def\csname faicon@resistance\endcsname{\faicon{rebel}}
\def\faCopy{\faicon{copy}}\expandafter\def\csname faicon@copy\endcsname{\faicon{files-o}}
\def\faIntersex{\faicon{intersex}}\expandafter\def\csname faicon@intersex\endcsname{\faicon{transgender}}
\def\faHardOfHearing{\faicon{hard-of-hearing}}\expandafter\def\csname faicon@hard-of-hearing\endcsname{\faicon{deaf}}
\def\faMailReply{\faicon{mail-reply}}\expandafter\def\csname faicon@mail-reply\endcsname{\faicon{reply}}
\def\faSortDown{\faicon{sort-down}}\expandafter\def\csname faicon@sort-down\endcsname{\faicon{sort-desc}}
\def\faGe{\faicon{ge}}\expandafter\def\csname faicon@ge\endcsname{\faicon{empire}}
\def\faBattery2{\faicon{battery-2}}\expandafter\def\csname faicon@battery-2\endcsname{\faicon{battery-half}}
\def\faHandStopO{\faicon{hand-stop-o}}\expandafter\def\csname faicon@hand-stop-o\endcsname{\faicon{hand-paper-o}}
\def\faGroup{\faicon{group}}\expandafter\def\csname faicon@group\endcsname{\faicon{users}}
\def\faRotateRight{\faicon{rotate-right}}\expandafter\def\csname faicon@rotate-right\endcsname{\faicon{repeat}}
\def\faWon{\faicon{won}}\expandafter\def\csname faicon@won\endcsname{\faicon{krw}}
\def\faFa{\faicon{fa}}\expandafter\def\csname faicon@fa\endcsname{\faicon{font-awesome}}
\def\faHourglass3{\faicon{hourglass-3}}\expandafter\def\csname faicon@hourglass-3\endcsname{\faicon{hourglass-end}}
\def\faStarHalfEmpty{\faicon{star-half-empty}}\expandafter\def\csname faicon@star-half-empty\endcsname{\faicon{star-half-o}}
\def\faCut{\faicon{cut}}\expandafter\def\csname faicon@cut\endcsname{\faicon{scissors}}
\def\faToggleDown{\faicon{toggle-down}}\expandafter\def\csname faicon@toggle-down\endcsname{\faicon{caret-square-o-down}}
\def\faGooglePlusCircle{\faicon{google-plus-circle}}\expandafter\def\csname faicon@google-plus-circle\endcsname{\faicon{google-plus-official}}
\def\faSheqel{\faicon{sheqel}}\expandafter\def\csname faicon@sheqel\endcsname{\faicon{ils}}
\def\faDashboard{\faicon{dashboard}}\expandafter\def\csname faicon@dashboard\endcsname{\faicon{tachometer}}
\def\faSend{\faicon{send}}\expandafter\def\csname faicon@send\endcsname{\faicon{paper-plane}}
\def\faYc{\faicon{yc}}\expandafter\def\csname faicon@yc\endcsname{\faicon{y-combinator}}
\def\faToggleLeft{\faicon{toggle-left}}\expandafter\def\csname faicon@toggle-left\endcsname{\faicon{caret-square-o-left}}
\def\faWarning{\faicon{warning}}\expandafter\def\csname faicon@warning\endcsname{\faicon{exclamation-triangle}}
\def\faImage{\faicon{image}}\expandafter\def\csname faicon@image\endcsname{\faicon{picture-o}}
\def\faInstitution{\faicon{institution}}\expandafter\def\csname faicon@institution\endcsname{\faicon{university}}
\def\faFileMovieO{\faicon{file-movie-o}}\expandafter\def\csname faicon@file-movie-o\endcsname{\faicon{file-video-o}}
\def\faPhoto{\faicon{photo}}\expandafter\def\csname faicon@photo\endcsname{\faicon{picture-o}}
\def\faFileSoundO{\faicon{file-sound-o}}\expandafter\def\csname faicon@file-sound-o\endcsname{\faicon{file-audio-o}}
\def\faMortarBoard{\faicon{mortar-board}}\expandafter\def\csname faicon@mortar-board\endcsname{\faicon{graduation-cap}}
\def\faGittip{\faicon{gittip}}\expandafter\def\csname faicon@gittip\endcsname{\faicon{gratipay}}
\def\faHourglass2{\faicon{hourglass-2}}\expandafter\def\csname faicon@hourglass-2\endcsname{\faicon{hourglass-half}}
\def\faSupport{\faicon{support}}\expandafter\def\csname faicon@support\endcsname{\faicon{life-ring}}
\def\faEdit{\faicon{edit}}\expandafter\def\csname faicon@edit\endcsname{\faicon{pencil-square-o}}
\def\faHotel{\faicon{hotel}}\expandafter\def\csname faicon@hotel\endcsname{\faicon{bed}}
\def\faSoccerBallO{\faicon{soccer-ball-o}}\expandafter\def\csname faicon@soccer-ball-o\endcsname{\faicon{futbol-o}}
\def\faFilePictureO{\faicon{file-picture-o}}\expandafter\def\csname faicon@file-picture-o\endcsname{\faicon{file-image-o}}
\def\faClose{\faicon{close}}\expandafter\def\csname faicon@close\endcsname{\faicon{times}}
\def\faYcSquare{\faicon{yc-square}}\expandafter\def\csname faicon@yc-square\endcsname{\faicon{hacker-news}}
\def\faShekel{\faicon{shekel}}\expandafter\def\csname faicon@shekel\endcsname{\faicon{ils}}
\def\faDollar{\faicon{dollar}}\expandafter\def\csname faicon@dollar\endcsname{\faicon{usd}}
\def\faUnsorted{\faicon{unsorted}}\expandafter\def\csname faicon@unsorted\endcsname{\faicon{sort}}
\def\faReorder{\faicon{reorder}}\expandafter\def\csname faicon@reorder\endcsname{\faicon{bars}}
\def\faBattery3{\faicon{battery-3}}\expandafter\def\csname faicon@battery-3\endcsname{\faicon{battery-three-quarters}}
\def\faRupee{\faicon{rupee}}\expandafter\def\csname faicon@rupee\endcsname{\faicon{inr}}
\def\faRouble{\faicon{rouble}}\expandafter\def\csname faicon@rouble\endcsname{\faicon{rub}}
\def\faHourglass1{\faicon{hourglass-1}}\expandafter\def\csname faicon@hourglass-1\endcsname{\faicon{hourglass-start}}
\def\faAslInterpreting{\faicon{asl-interpreting}}\expandafter\def\csname faicon@asl-interpreting\endcsname{\faicon{american-sign-language-interpreting}}
\def\faTv{\faicon{tv}}\expandafter\def\csname faicon@tv\endcsname{\faicon{television}}
\def\faSave{\faicon{save}}\expandafter\def\csname faicon@save\endcsname{\faicon{floppy-o}}
\def\faToggleRight{\faicon{toggle-right}}\expandafter\def\csname faicon@toggle-right\endcsname{\faicon{caret-square-o-right}}
\def\faDedent{\faicon{dedent}}\expandafter\def\csname faicon@dedent\endcsname{\faicon{outdent}}
\def\faGear{\faicon{gear}}\expandafter\def\csname faicon@gear\endcsname{\faicon{cog}}
\def\faLegal{\faicon{legal}}\expandafter\def\csname faicon@legal\endcsname{\faicon{gavel}}
\def\faWechat{\faicon{wechat}}\expandafter\def\csname faicon@wechat\endcsname{\faicon{weixin}}
\def\faFacebookF{\faicon{facebook-f}}\expandafter\def\csname faicon@facebook-f\endcsname{\faicon{facebook}}
\def\faFeed{\faicon{feed}}\expandafter\def\csname faicon@feed\endcsname{\faicon{rss}}
\def\faBank{\faicon{bank}}\expandafter\def\csname faicon@bank\endcsname{\faicon{university}}
\def\faTurkishLira{\faicon{turkish-lira}}\expandafter\def\csname faicon@turkish-lira\endcsname{\faicon{try}}
\def\faUnlink{\faicon{unlink}}\expandafter\def\csname faicon@unlink\endcsname{\faicon{chain-broken}}
\def\faChain{\faicon{chain}}\expandafter\def\csname faicon@chain\endcsname{\faicon{link}}
\def\faGears{\faicon{gears}}\expandafter\def\csname faicon@gears\endcsname{\faicon{cogs}}
\def\faRmb{\faicon{rmb}}\expandafter\def\csname faicon@rmb\endcsname{\faicon{jpy}}
\def\faBattery1{\faicon{battery-1}}\expandafter\def\csname faicon@battery-1\endcsname{\faicon{battery-quarter}}
\def\faLifeBouy{\faicon{life-bouy}}\expandafter\def\csname faicon@life-bouy\endcsname{\faicon{life-ring}}
\def\faYen{\faicon{yen}}\expandafter\def\csname faicon@yen\endcsname{\faicon{jpy}}
\def\faBattery4{\faicon{battery-4}}\expandafter\def\csname faicon@battery-4\endcsname{\faicon{battery-full}}
\def\faBattery0{\faicon{battery-0}}\expandafter\def\csname faicon@battery-0\endcsname{\faicon{battery-empty}}
\def\faHandGrabO{\faicon{hand-grab-o}}\expandafter\def\csname faicon@hand-grab-o\endcsname{\faicon{hand-rock-o}}
\def\faMailReplyAll{\faicon{mail-reply-all}}\expandafter\def\csname faicon@mail-reply-all\endcsname{\faicon{reply-all}}
\def\faMobilePhone{\faicon{mobile-phone}}\expandafter\def\csname faicon@mobile-phone\endcsname{\faicon{mobile}}
\def\faRotateLeft{\faicon{rotate-left}}\expandafter\def\csname faicon@rotate-left\endcsname{\faicon{undo}}
\def\faEuro{\faicon{euro}}\expandafter\def\csname faicon@euro\endcsname{\faicon{eur}}
\def\faRuble{\faicon{ruble}}\expandafter\def\csname faicon@ruble\endcsname{\faicon{rub}}
\def\faRa{\faicon{ra}}\expandafter\def\csname faicon@ra\endcsname{\faicon{rebel}}
\def\faStarHalfFull{\faicon{star-half-full}}\expandafter\def\csname faicon@star-half-full\endcsname{\faicon{star-half-o}}
\def\faSortUp{\faicon{sort-up}}\expandafter\def\csname faicon@sort-up\endcsname{\faicon{sort-asc}}
\def\faMailForward{\faicon{mail-forward}}\expandafter\def\csname faicon@mail-forward\endcsname{\faicon{share}}
\def\faSigning{\faicon{signing}}\expandafter\def\csname faicon@signing\endcsname{\faicon{sign-language}}
\def\faFlash{\faicon{flash}}\expandafter\def\csname faicon@flash\endcsname{\faicon{bolt}}
\def\faLifeSaver{\faicon{life-saver}}\expandafter\def\csname faicon@life-saver\endcsname{\faicon{life-ring}}
\def\faFilePhotoO{\faicon{file-photo-o}}\expandafter\def\csname faicon@file-photo-o\endcsname{\faicon{file-image-o}}
\def\faDeafness{\faicon{deafness}}\expandafter\def\csname faicon@deafness\endcsname{\faicon{deaf}}
\def\faBarChartO{\faicon{bar-chart-o}}\expandafter\def\csname faicon@bar-chart-o\endcsname{\faicon{bar-chart}}
\def\faSendO{\faicon{send-o}}\expandafter\def\csname faicon@send-o\endcsname{\faicon{paper-plane-o}}
\def\faNavicon{\faicon{navicon}}\expandafter\def\csname faicon@navicon\endcsname{\faicon{bars}}
\def\faRemove{\faicon{remove}}\expandafter\def\csname faicon@remove\endcsname{\faicon{times}}
+637
View File
@@ -0,0 +1,637 @@
%% start of file `fontawesomesymbols-pdftex.tex'.
\expandafter\def\csname faicon@info\endcsname{{\FAone\symbol{0}}}
\expandafter\def\csname faicon@eraser\endcsname{{\FAone\symbol{1}}}
\expandafter\def\csname faicon@rss-square\endcsname{{\FAone\symbol{2}}}
\expandafter\def\csname faicon@external-link-square\endcsname{{\FAone\symbol{3}}}
\expandafter\def\csname faicon@caret-square-o-right\endcsname{{\FAone\symbol{4}}}
\expandafter\def\csname faicon@sort-alpha-desc\endcsname{{\FAone\symbol{5}}}
\expandafter\def\csname faicon@thumbs-up\endcsname{{\FAone\symbol{6}}}
\expandafter\def\csname faicon@thumbs-down\endcsname{{\FAone\symbol{7}}}
\expandafter\def\csname faicon@moon-o\endcsname{{\FAone\symbol{8}}}
\expandafter\def\csname faicon@pagelines\endcsname{{\FAone\symbol{9}}}
\expandafter\def\csname faicon@arrow-circle-o-right\endcsname{{\FAone\symbol{10}}}
\expandafter\def\csname faicon@caret-square-o-left\endcsname{{\FAone\symbol{11}}}
\expandafter\def\csname faicon@wheelchair\endcsname{{\FAone\symbol{12}}}
\expandafter\def\csname faicon@try\endcsname{{\FAone\symbol{13}}}
\expandafter\def\csname faicon@space-shuttle\endcsname{{\FAone\symbol{14}}}
\expandafter\def\csname faicon@slack\endcsname{{\FAone\symbol{15}}}
\expandafter\def\csname faicon@envelope-square\endcsname{{\FAone\symbol{16}}}
\expandafter\def\csname faicon@wordpress\endcsname{{\FAone\symbol{17}}}
\expandafter\def\csname faicon@openid\endcsname{{\FAone\symbol{18}}}
\expandafter\def\csname faicon@university\endcsname{{\FAone\symbol{19}}}
\expandafter\def\csname faicon@graduation-cap\endcsname{{\FAone\symbol{20}}}
\expandafter\def\csname faicon@yahoo\endcsname{{\FAone\symbol{21}}}
\expandafter\def\csname faicon@reddit-square\endcsname{{\FAone\symbol{22}}}
\expandafter\def\csname faicon@stumbleupon-circle\endcsname{{\FAone\symbol{23}}}
\expandafter\def\csname faicon@delicious\endcsname{{\FAone\symbol{24}}}
\expandafter\def\csname faicon@digg\endcsname{{\FAone\symbol{25}}}
\expandafter\def\csname faicon@pied-piper-pp\endcsname{{\FAone\symbol{26}}}
\expandafter\def\csname faicon@pied-piper-alt\endcsname{{\FAone\symbol{27}}}
\expandafter\def\csname faicon@drupal\endcsname{{\FAone\symbol{28}}}
\expandafter\def\csname faicon@joomla\endcsname{{\FAone\symbol{29}}}
\expandafter\def\csname faicon@fax\endcsname{{\FAone\symbol{30}}}
\expandafter\def\csname faicon@building\endcsname{{\FAone\symbol{31}}}
\expandafter\def\csname faicon@child\endcsname{{\FAone\symbol{32}}}
\expandafter\def\csname faicon@spoon\endcsname{{\FAone\symbol{33}}}
\expandafter\def\csname faicon@cube\endcsname{{\FAone\symbol{34}}}
\expandafter\def\csname faicon@cubes\endcsname{{\FAone\symbol{35}}}
\expandafter\def\csname faicon@behance\endcsname{{\FAone\symbol{36}}}
\expandafter\def\csname faicon@behance-square\endcsname{{\FAone\symbol{37}}}
\expandafter\def\csname faicon@steam\endcsname{{\FAone\symbol{38}}}
\expandafter\def\csname faicon@steam-square\endcsname{{\FAone\symbol{39}}}
\expandafter\def\csname faicon@recycle\endcsname{{\FAone\symbol{40}}}
\expandafter\def\csname faicon@car\endcsname{{\FAone\symbol{41}}}
\expandafter\def\csname faicon@taxi\endcsname{{\FAone\symbol{42}}}
\expandafter\def\csname faicon@tree\endcsname{{\FAone\symbol{43}}}
\expandafter\def\csname faicon@spotify\endcsname{{\FAone\symbol{44}}}
\expandafter\def\csname faicon@deviantart\endcsname{{\FAone\symbol{45}}}
\expandafter\def\csname faicon@soundcloud\endcsname{{\FAone\symbol{46}}}
\expandafter\def\csname faicon@file-word-o\endcsname{{\FAone\symbol{47}}}
\expandafter\def\csname faicon@file-excel-o\endcsname{{\FAone\symbol{48}}}
\expandafter\def\csname faicon@file-powerpoint-o\endcsname{{\FAone\symbol{49}}}
\expandafter\def\csname faicon@file-image-o\endcsname{{\FAone\symbol{50}}}
\expandafter\def\csname faicon@file-archive-o\endcsname{{\FAone\symbol{51}}}
\expandafter\def\csname faicon@file-audio-o\endcsname{{\FAone\symbol{52}}}
\expandafter\def\csname faicon@file-video-o\endcsname{{\FAone\symbol{53}}}
\expandafter\def\csname faicon@file-code-o\endcsname{{\FAone\symbol{54}}}
\expandafter\def\csname faicon@vine\endcsname{{\FAone\symbol{55}}}
\expandafter\def\csname faicon@codepen\endcsname{{\FAone\symbol{56}}}
\expandafter\def\csname faicon@jsfiddle\endcsname{{\FAone\symbol{57}}}
\expandafter\def\csname faicon@life-ring\endcsname{{\FAone\symbol{58}}}
\expandafter\def\csname faicon@circle-o-notch\endcsname{{\FAone\symbol{59}}}
\expandafter\def\csname faicon@git\endcsname{{\FAone\symbol{60}}}
\expandafter\def\csname faicon@hacker-news\endcsname{{\FAone\symbol{61}}}
\expandafter\def\csname faicon@paper-plane\endcsname{{\FAone\symbol{62}}}
\expandafter\def\csname faicon@paper-plane-o\endcsname{{\FAone\symbol{63}}}
\expandafter\def\csname faicon@history\endcsname{{\FAone\symbol{64}}}
\expandafter\def\csname faicon@circle-thin\endcsname{{\FAone\symbol{65}}}
\expandafter\def\csname faicon@header\endcsname{{\FAone\symbol{66}}}
\expandafter\def\csname faicon@paragraph\endcsname{{\FAone\symbol{67}}}
\expandafter\def\csname faicon@sliders\endcsname{{\FAone\symbol{68}}}
\expandafter\def\csname faicon@share-alt-square\endcsname{{\FAone\symbol{69}}}
\expandafter\def\csname faicon@bomb\endcsname{{\FAone\symbol{70}}}
\expandafter\def\csname faicon@futbol-o\endcsname{{\FAone\symbol{71}}}
\expandafter\def\csname faicon@tty\endcsname{{\FAone\symbol{72}}}
\expandafter\def\csname faicon@binoculars\endcsname{{\FAone\symbol{73}}}
\expandafter\def\csname faicon@plug\endcsname{{\FAone\symbol{74}}}
\expandafter\def\csname faicon@slideshare\endcsname{{\FAone\symbol{75}}}
\expandafter\def\csname faicon@twitch\endcsname{{\FAone\symbol{76}}}
\expandafter\def\csname faicon@yelp\endcsname{{\FAone\symbol{77}}}
\expandafter\def\csname faicon@newspaper-o\endcsname{{\FAone\symbol{78}}}
\expandafter\def\csname faicon@wifi\endcsname{{\FAone\symbol{79}}}
\expandafter\def\csname faicon@calculator\endcsname{{\FAone\symbol{80}}}
\expandafter\def\csname faicon@paypal\endcsname{{\FAone\symbol{81}}}
\expandafter\def\csname faicon@google-wallet\endcsname{{\FAone\symbol{82}}}
\expandafter\def\csname faicon@cc-mastercard\endcsname{{\FAone\symbol{83}}}
\expandafter\def\csname faicon@cc-discover\endcsname{{\FAone\symbol{84}}}
\expandafter\def\csname faicon@cc-paypal\endcsname{{\FAone\symbol{85}}}
\expandafter\def\csname faicon@cc-stripe\endcsname{{\FAone\symbol{86}}}
\expandafter\def\csname faicon@bell-slash\endcsname{{\FAone\symbol{87}}}
\expandafter\def\csname faicon@bell-slash-o\endcsname{{\FAone\symbol{88}}}
\expandafter\def\csname faicon@trash\endcsname{{\FAone\symbol{89}}}
\expandafter\def\csname faicon@copyright\endcsname{{\FAone\symbol{90}}}
\expandafter\def\csname faicon@at\endcsname{{\FAone\symbol{91}}}
\expandafter\def\csname faicon@eyedropper\endcsname{{\FAone\symbol{92}}}
\expandafter\def\csname faicon@birthday-cake\endcsname{{\FAone\symbol{93}}}
\expandafter\def\csname faicon@area-chart\endcsname{{\FAone\symbol{94}}}
\expandafter\def\csname faicon@pie-chart\endcsname{{\FAone\symbol{95}}}
\expandafter\def\csname faicon@line-chart\endcsname{{\FAone\symbol{96}}}
\expandafter\def\csname faicon@lastfm\endcsname{{\FAone\symbol{97}}}
\expandafter\def\csname faicon@lastfm-square\endcsname{{\FAone\symbol{98}}}
\expandafter\def\csname faicon@toggle-off\endcsname{{\FAone\symbol{99}}}
\expandafter\def\csname faicon@toggle-on\endcsname{{\FAone\symbol{100}}}
\expandafter\def\csname faicon@bicycle\endcsname{{\FAone\symbol{101}}}
\expandafter\def\csname faicon@bus\endcsname{{\FAone\symbol{102}}}
\expandafter\def\csname faicon@ioxhost\endcsname{{\FAone\symbol{103}}}
\expandafter\def\csname faicon@angellist\endcsname{{\FAone\symbol{104}}}
\expandafter\def\csname faicon@cc\endcsname{{\FAone\symbol{105}}}
\expandafter\def\csname faicon@ils\endcsname{{\FAone\symbol{106}}}
\expandafter\def\csname faicon@meanpath\endcsname{{\FAone\symbol{107}}}
\expandafter\def\csname faicon@buysellads\endcsname{{\FAone\symbol{108}}}
\expandafter\def\csname faicon@connectdevelop\endcsname{{\FAone\symbol{109}}}
\expandafter\def\csname faicon@forumbee\endcsname{{\FAone\symbol{110}}}
\expandafter\def\csname faicon@sellsy\endcsname{{\FAone\symbol{111}}}
\expandafter\def\csname faicon@shirtsinbulk\endcsname{{\FAone\symbol{112}}}
\expandafter\def\csname faicon@simplybuilt\endcsname{{\FAone\symbol{113}}}
\expandafter\def\csname faicon@skyatlas\endcsname{{\FAone\symbol{114}}}
\expandafter\def\csname faicon@cart-plus\endcsname{{\FAone\symbol{115}}}
\expandafter\def\csname faicon@cart-arrow-down\endcsname{{\FAone\symbol{116}}}
\expandafter\def\csname faicon@diamond\endcsname{{\FAone\symbol{117}}}
\expandafter\def\csname faicon@ship\endcsname{{\FAone\symbol{118}}}
\expandafter\def\csname faicon@user-secret\endcsname{{\FAone\symbol{119}}}
\expandafter\def\csname faicon@motorcycle\endcsname{{\FAone\symbol{120}}}
\expandafter\def\csname faicon@street-view\endcsname{{\FAone\symbol{121}}}
\expandafter\def\csname faicon@heartbeat\endcsname{{\FAone\symbol{122}}}
\expandafter\def\csname faicon@mars\endcsname{{\FAone\symbol{123}}}
\expandafter\def\csname faicon@mercury\endcsname{{\FAone\symbol{124}}}
\expandafter\def\csname faicon@transgender\endcsname{{\FAone\symbol{125}}}
\expandafter\def\csname faicon@transgender-alt\endcsname{{\FAone\symbol{126}}}
\expandafter\def\csname faicon@venus-double\endcsname{{\FAone\symbol{127}}}
\expandafter\def\csname faicon@mars-double\endcsname{{\FAone\symbol{128}}}
\expandafter\def\csname faicon@venus-mars\endcsname{{\FAone\symbol{129}}}
\expandafter\def\csname faicon@mars-stroke\endcsname{{\FAone\symbol{130}}}
\expandafter\def\csname faicon@mars-stroke-v\endcsname{{\FAone\symbol{131}}}
\expandafter\def\csname faicon@mars-stroke-h\endcsname{{\FAone\symbol{132}}}
\expandafter\def\csname faicon@neuter\endcsname{{\FAone\symbol{133}}}
\expandafter\def\csname faicon@genderless\endcsname{{\FAone\symbol{134}}}
\expandafter\def\csname faicon@facebook-official\endcsname{{\FAone\symbol{135}}}
\expandafter\def\csname faicon@pinterest-p\endcsname{{\FAone\symbol{136}}}
\expandafter\def\csname faicon@whatsapp\endcsname{{\FAone\symbol{137}}}
\expandafter\def\csname faicon@server\endcsname{{\FAone\symbol{138}}}
\expandafter\def\csname faicon@user-plus\endcsname{{\FAone\symbol{139}}}
\expandafter\def\csname faicon@user-times\endcsname{{\FAone\symbol{140}}}
\expandafter\def\csname faicon@bed\endcsname{{\FAone\symbol{141}}}
\expandafter\def\csname faicon@viacoin\endcsname{{\FAone\symbol{142}}}
\expandafter\def\csname faicon@train\endcsname{{\FAone\symbol{143}}}
\expandafter\def\csname faicon@subway\endcsname{{\FAone\symbol{144}}}
\expandafter\def\csname faicon@medium\endcsname{{\FAone\symbol{145}}}
\expandafter\def\csname faicon@y-combinator\endcsname{{\FAone\symbol{146}}}
\expandafter\def\csname faicon@optin-monster\endcsname{{\FAone\symbol{147}}}
\expandafter\def\csname faicon@opencart\endcsname{{\FAone\symbol{148}}}
\expandafter\def\csname faicon@expeditedssl\endcsname{{\FAone\symbol{149}}}
\expandafter\def\csname faicon@battery-full\endcsname{{\FAone\symbol{150}}}
\expandafter\def\csname faicon@battery-three-quarters\endcsname{{\FAone\symbol{151}}}
\expandafter\def\csname faicon@battery-half\endcsname{{\FAone\symbol{152}}}
\expandafter\def\csname faicon@battery-quarter\endcsname{{\FAone\symbol{153}}}
\expandafter\def\csname faicon@battery-empty\endcsname{{\FAone\symbol{154}}}
\expandafter\def\csname faicon@mouse-pointer\endcsname{{\FAone\symbol{155}}}
\expandafter\def\csname faicon@i-cursor\endcsname{{\FAone\symbol{156}}}
\expandafter\def\csname faicon@object-group\endcsname{{\FAone\symbol{157}}}
\expandafter\def\csname faicon@object-ungroup\endcsname{{\FAone\symbol{158}}}
\expandafter\def\csname faicon@sticky-note\endcsname{{\FAone\symbol{159}}}
\expandafter\def\csname faicon@sticky-note-o\endcsname{{\FAone\symbol{160}}}
\expandafter\def\csname faicon@cc-jcb\endcsname{{\FAone\symbol{161}}}
\expandafter\def\csname faicon@cc-diners-club\endcsname{{\FAone\symbol{162}}}
\expandafter\def\csname faicon@clone\endcsname{{\FAone\symbol{163}}}
\expandafter\def\csname faicon@balance-scale\endcsname{{\FAone\symbol{164}}}
\expandafter\def\csname faicon@hourglass-o\endcsname{{\FAone\symbol{165}}}
\expandafter\def\csname faicon@hourglass-start\endcsname{{\FAone\symbol{166}}}
\expandafter\def\csname faicon@hourglass-half\endcsname{{\FAone\symbol{167}}}
\expandafter\def\csname faicon@hourglass-end\endcsname{{\FAone\symbol{168}}}
\expandafter\def\csname faicon@hourglass\endcsname{{\FAone\symbol{169}}}
\expandafter\def\csname faicon@hand-rock-o\endcsname{{\FAone\symbol{170}}}
\expandafter\def\csname faicon@hand-paper-o\endcsname{{\FAone\symbol{171}}}
\expandafter\def\csname faicon@hand-scissors-o\endcsname{{\FAone\symbol{172}}}
\expandafter\def\csname faicon@hand-lizard-o\endcsname{{\FAone\symbol{173}}}
\expandafter\def\csname faicon@hand-spock-o\endcsname{{\FAone\symbol{174}}}
\expandafter\def\csname faicon@hand-pointer-o\endcsname{{\FAone\symbol{175}}}
\expandafter\def\csname faicon@hand-peace-o\endcsname{{\FAone\symbol{176}}}
\expandafter\def\csname faicon@trademark\endcsname{{\FAone\symbol{177}}}
\expandafter\def\csname faicon@registered\endcsname{{\FAone\symbol{178}}}
\expandafter\def\csname faicon@creative-commons\endcsname{{\FAone\symbol{179}}}
\expandafter\def\csname faicon@tripadvisor\endcsname{{\FAone\symbol{180}}}
\expandafter\def\csname faicon@odnoklassniki-square\endcsname{{\FAone\symbol{181}}}
\expandafter\def\csname faicon@get-pocket\endcsname{{\FAone\symbol{182}}}
\expandafter\def\csname faicon@wikipedia-w\endcsname{{\FAone\symbol{183}}}
\expandafter\def\csname faicon@safari\endcsname{{\FAone\symbol{184}}}
\expandafter\def\csname faicon@chrome\endcsname{{\FAone\symbol{185}}}
\expandafter\def\csname faicon@firefox\endcsname{{\FAone\symbol{186}}}
\expandafter\def\csname faicon@opera\endcsname{{\FAone\symbol{187}}}
\expandafter\def\csname faicon@internet-explorer\endcsname{{\FAone\symbol{188}}}
\expandafter\def\csname faicon@television\endcsname{{\FAone\symbol{189}}}
\expandafter\def\csname faicon@contao\endcsname{{\FAone\symbol{190}}}
\expandafter\def\csname faicon@500px\endcsname{{\FAone\symbol{191}}}
\expandafter\def\csname faicon@amazon\endcsname{{\FAone\symbol{192}}}
\expandafter\def\csname faicon@calendar-plus-o\endcsname{{\FAone\symbol{193}}}
\expandafter\def\csname faicon@calendar-minus-o\endcsname{{\FAone\symbol{194}}}
\expandafter\def\csname faicon@calendar-times-o\endcsname{{\FAone\symbol{195}}}
\expandafter\def\csname faicon@calendar-check-o\endcsname{{\FAone\symbol{196}}}
\expandafter\def\csname faicon@industry\endcsname{{\FAone\symbol{197}}}
\expandafter\def\csname faicon@map-pin\endcsname{{\FAone\symbol{198}}}
\expandafter\def\csname faicon@map-signs\endcsname{{\FAone\symbol{199}}}
\expandafter\def\csname faicon@map-o\endcsname{{\FAone\symbol{200}}}
\expandafter\def\csname faicon@map\endcsname{{\FAone\symbol{201}}}
\expandafter\def\csname faicon@commenting\endcsname{{\FAone\symbol{202}}}
\expandafter\def\csname faicon@commenting-o\endcsname{{\FAone\symbol{203}}}
\expandafter\def\csname faicon@houzz\endcsname{{\FAone\symbol{204}}}
\expandafter\def\csname faicon@vimeo\endcsname{{\FAone\symbol{205}}}
\expandafter\def\csname faicon@edge\endcsname{{\FAone\symbol{206}}}
\expandafter\def\csname faicon@credit-card-alt\endcsname{{\FAone\symbol{207}}}
\expandafter\def\csname faicon@codiepie\endcsname{{\FAone\symbol{208}}}
\expandafter\def\csname faicon@usb\endcsname{{\FAone\symbol{209}}}
\expandafter\def\csname faicon@product-hunt\endcsname{{\FAone\symbol{210}}}
\expandafter\def\csname faicon@mixcloud\endcsname{{\FAone\symbol{211}}}
\expandafter\def\csname faicon@scribd\endcsname{{\FAone\symbol{212}}}
\expandafter\def\csname faicon@pause-circle\endcsname{{\FAone\symbol{213}}}
\expandafter\def\csname faicon@pause-circle-o\endcsname{{\FAone\symbol{214}}}
\expandafter\def\csname faicon@stop-circle\endcsname{{\FAone\symbol{215}}}
\expandafter\def\csname faicon@stop-circle-o\endcsname{{\FAone\symbol{216}}}
\expandafter\def\csname faicon@shopping-bag\endcsname{{\FAone\symbol{217}}}
\expandafter\def\csname faicon@shopping-basket\endcsname{{\FAone\symbol{218}}}
\expandafter\def\csname faicon@hashtag\endcsname{{\FAone\symbol{219}}}
\expandafter\def\csname faicon@bluetooth\endcsname{{\FAone\symbol{220}}}
\expandafter\def\csname faicon@bluetooth-b\endcsname{{\FAone\symbol{221}}}
\expandafter\def\csname faicon@percent\endcsname{{\FAone\symbol{222}}}
\expandafter\def\csname faicon@gitlab\endcsname{{\FAone\symbol{223}}}
\expandafter\def\csname faicon@wpbeginner\endcsname{{\FAone\symbol{224}}}
\expandafter\def\csname faicon@wpforms\endcsname{{\FAone\symbol{225}}}
\expandafter\def\csname faicon@envira\endcsname{{\FAone\symbol{226}}}
\expandafter\def\csname faicon@universal-access\endcsname{{\FAone\symbol{227}}}
\expandafter\def\csname faicon@wheelchair-alt\endcsname{{\FAone\symbol{228}}}
\expandafter\def\csname faicon@question-circle-o\endcsname{{\FAone\symbol{229}}}
\expandafter\def\csname faicon@blind\endcsname{{\FAone\symbol{230}}}
\expandafter\def\csname faicon@audio-description\endcsname{{\FAone\symbol{231}}}
\expandafter\def\csname faicon@adjust\endcsname{{\FAone\symbol{232}}}
\expandafter\def\csname faicon@adn\endcsname{{\FAone\symbol{233}}}
\expandafter\def\csname faicon@align-center\endcsname{{\FAone\symbol{234}}}
\expandafter\def\csname faicon@align-justify\endcsname{{\FAone\symbol{235}}}
\expandafter\def\csname faicon@align-left\endcsname{{\FAone\symbol{236}}}
\expandafter\def\csname faicon@align-right\endcsname{{\FAone\symbol{237}}}
\expandafter\def\csname faicon@ambulance\endcsname{{\FAone\symbol{238}}}
\expandafter\def\csname faicon@anchor\endcsname{{\FAone\symbol{239}}}
\expandafter\def\csname faicon@android\endcsname{{\FAone\symbol{240}}}
\expandafter\def\csname faicon@angle-down\endcsname{{\FAone\symbol{241}}}
\expandafter\def\csname faicon@angle-left\endcsname{{\FAone\symbol{242}}}
\expandafter\def\csname faicon@angle-right\endcsname{{\FAone\symbol{243}}}
\expandafter\def\csname faicon@angle-up\endcsname{{\FAone\symbol{244}}}
\expandafter\def\csname faicon@apple\endcsname{{\FAone\symbol{245}}}
\expandafter\def\csname faicon@archive\endcsname{{\FAone\symbol{246}}}
\expandafter\def\csname faicon@arrow-circle-o-left\endcsname{{\FAone\symbol{247}}}
\expandafter\def\csname faicon@arrow-down\endcsname{{\FAone\symbol{248}}}
\expandafter\def\csname faicon@arrow-left\endcsname{{\FAone\symbol{249}}}
\expandafter\def\csname faicon@arrow-right\endcsname{{\FAone\symbol{250}}}
\expandafter\def\csname faicon@arrow-up\endcsname{{\FAone\symbol{251}}}
\expandafter\def\csname faicon@asterisk\endcsname{{\FAone\symbol{252}}}
\expandafter\def\csname faicon@backward\endcsname{{\FAone\symbol{253}}}
\expandafter\def\csname faicon@ban\endcsname{{\FAone\symbol{254}}}
\expandafter\def\csname faicon@bar-chart\endcsname{{\FAone\symbol{255}}}
\expandafter\def\csname faicon@barcode\endcsname{{\FAtwo\symbol{0}}}
\expandafter\def\csname faicon@flask\endcsname{{\FAtwo\symbol{1}}}
\expandafter\def\csname faicon@beer\endcsname{{\FAtwo\symbol{2}}}
\expandafter\def\csname faicon@bell-o\endcsname{{\FAtwo\symbol{3}}}
\expandafter\def\csname faicon@bell\endcsname{{\FAtwo\symbol{4}}}
\expandafter\def\csname faicon@bitbucket-square\endcsname{{\FAtwo\symbol{5}}}
\expandafter\def\csname faicon@bold\endcsname{{\FAtwo\symbol{6}}}
\expandafter\def\csname faicon@bolt\endcsname{{\FAtwo\symbol{7}}}
\expandafter\def\csname faicon@book\endcsname{{\FAtwo\symbol{8}}}
\expandafter\def\csname faicon@bookmark\endcsname{{\FAtwo\symbol{9}}}
\expandafter\def\csname faicon@bookmark-o\endcsname{{\FAtwo\symbol{10}}}
\expandafter\def\csname faicon@briefcase\endcsname{{\FAtwo\symbol{11}}}
\expandafter\def\csname faicon@btc\endcsname{{\FAtwo\symbol{12}}}
\expandafter\def\csname faicon@bug\endcsname{{\FAtwo\symbol{13}}}
\expandafter\def\csname faicon@building-o\endcsname{{\FAtwo\symbol{14}}}
\expandafter\def\csname faicon@bullhorn\endcsname{{\FAtwo\symbol{15}}}
\expandafter\def\csname faicon@bullseye\endcsname{{\FAtwo\symbol{16}}}
\expandafter\def\csname faicon@calendar\endcsname{{\FAtwo\symbol{17}}}
\expandafter\def\csname faicon@calendar-o\endcsname{{\FAtwo\symbol{18}}}
\expandafter\def\csname faicon@camera\endcsname{{\FAtwo\symbol{19}}}
\expandafter\def\csname faicon@camera-retro\endcsname{{\FAtwo\symbol{20}}}
\expandafter\def\csname faicon@caret-down\endcsname{{\FAtwo\symbol{21}}}
\expandafter\def\csname faicon@caret-left\endcsname{{\FAtwo\symbol{22}}}
\expandafter\def\csname faicon@caret-right\endcsname{{\FAtwo\symbol{23}}}
\expandafter\def\csname faicon@caret-up\endcsname{{\FAtwo\symbol{24}}}
\expandafter\def\csname faicon@certificate\endcsname{{\FAtwo\symbol{25}}}
\expandafter\def\csname faicon@check-square-o\endcsname{{\FAtwo\symbol{26}}}
\expandafter\def\csname faicon@square-o\endcsname{{\FAtwo\symbol{27}}}
\expandafter\def\csname faicon@minus-square-o\endcsname{{\FAtwo\symbol{28}}}
\expandafter\def\csname faicon@check-square\endcsname{{\FAtwo\symbol{29}}}
\expandafter\def\csname faicon@chevron-down\endcsname{{\FAtwo\symbol{30}}}
\expandafter\def\csname faicon@chevron-left\endcsname{{\FAtwo\symbol{31}}}
\expandafter\def\csname faicon@chevron-right\endcsname{{\FAtwo\symbol{32}}}
\expandafter\def\csname faicon@chevron-circle-down\endcsname{{\FAtwo\symbol{33}}}
\expandafter\def\csname faicon@chevron-circle-left\endcsname{{\FAtwo\symbol{34}}}
\expandafter\def\csname faicon@chevron-circle-right\endcsname{{\FAtwo\symbol{35}}}
\expandafter\def\csname faicon@chevron-circle-up\endcsname{{\FAtwo\symbol{36}}}
\expandafter\def\csname faicon@chevron-up\endcsname{{\FAtwo\symbol{37}}}
\expandafter\def\csname faicon@circle\endcsname{{\FAtwo\symbol{38}}}
\expandafter\def\csname faicon@arrow-circle-down\endcsname{{\FAtwo\symbol{39}}}
\expandafter\def\csname faicon@arrow-circle-left\endcsname{{\FAtwo\symbol{40}}}
\expandafter\def\csname faicon@arrow-circle-right\endcsname{{\FAtwo\symbol{41}}}
\expandafter\def\csname faicon@arrow-circle-up\endcsname{{\FAtwo\symbol{42}}}
\expandafter\def\csname faicon@circle-o\endcsname{{\FAtwo\symbol{43}}}
\expandafter\def\csname faicon@cloud\endcsname{{\FAtwo\symbol{44}}}
\expandafter\def\csname faicon@cloud-download\endcsname{{\FAtwo\symbol{45}}}
\expandafter\def\csname faicon@cloud-upload\endcsname{{\FAtwo\symbol{46}}}
\expandafter\def\csname faicon@code\endcsname{{\FAtwo\symbol{47}}}
\expandafter\def\csname faicon@code-fork\endcsname{{\FAtwo\symbol{48}}}
\expandafter\def\csname faicon@coffee\endcsname{{\FAtwo\symbol{49}}}
\expandafter\def\csname faicon@cog\endcsname{{\FAtwo\symbol{50}}}
\expandafter\def\csname faicon@cogs\endcsname{{\FAtwo\symbol{51}}}
\expandafter\def\csname faicon@caret-square-o-down\endcsname{{\FAtwo\symbol{52}}}
\expandafter\def\csname faicon@caret-square-o-up\endcsname{{\FAtwo\symbol{53}}}
\expandafter\def\csname faicon@columns\endcsname{{\FAtwo\symbol{54}}}
\expandafter\def\csname faicon@comment\endcsname{{\FAtwo\symbol{55}}}
\expandafter\def\csname faicon@comment-o\endcsname{{\FAtwo\symbol{56}}}
\expandafter\def\csname faicon@comments\endcsname{{\FAtwo\symbol{57}}}
\expandafter\def\csname faicon@comments-o\endcsname{{\FAtwo\symbol{58}}}
\expandafter\def\csname faicon@compass\endcsname{{\FAtwo\symbol{59}}}
\expandafter\def\csname faicon@files-o\endcsname{{\FAtwo\symbol{60}}}
\expandafter\def\csname faicon@credit-card\endcsname{{\FAtwo\symbol{61}}}
\expandafter\def\csname faicon@crop\endcsname{{\FAtwo\symbol{62}}}
\expandafter\def\csname faicon@css3\endcsname{{\FAtwo\symbol{63}}}
\expandafter\def\csname faicon@scissors\endcsname{{\FAtwo\symbol{64}}}
\expandafter\def\csname faicon@tachometer\endcsname{{\FAtwo\symbol{65}}}
\expandafter\def\csname faicon@desktop\endcsname{{\FAtwo\symbol{66}}}
\expandafter\def\csname faicon@dot-circle-o\endcsname{{\FAtwo\symbol{67}}}
\expandafter\def\csname faicon@angle-double-down\endcsname{{\FAtwo\symbol{68}}}
\expandafter\def\csname faicon@angle-double-left\endcsname{{\FAtwo\symbol{69}}}
\expandafter\def\csname faicon@angle-double-right\endcsname{{\FAtwo\symbol{70}}}
\expandafter\def\csname faicon@angle-double-up\endcsname{{\FAtwo\symbol{71}}}
\expandafter\def\csname faicon@arrow-circle-o-down\endcsname{{\FAtwo\symbol{72}}}
\expandafter\def\csname faicon@download\endcsname{{\FAtwo\symbol{73}}}
\expandafter\def\csname faicon@dribbble\endcsname{{\FAtwo\symbol{74}}}
\expandafter\def\csname faicon@dropbox\endcsname{{\FAtwo\symbol{75}}}
\expandafter\def\csname faicon@pencil-square-o\endcsname{{\FAtwo\symbol{76}}}
\expandafter\def\csname faicon@pencil-square\endcsname{{\FAtwo\symbol{77}}}
\expandafter\def\csname faicon@eject\endcsname{{\FAtwo\symbol{78}}}
\expandafter\def\csname faicon@ellipsis-h\endcsname{{\FAtwo\symbol{79}}}
\expandafter\def\csname faicon@ellipsis-v\endcsname{{\FAtwo\symbol{80}}}
\expandafter\def\csname faicon@envelope-o\endcsname{{\FAtwo\symbol{81}}}
\expandafter\def\csname faicon@envelope\endcsname{{\FAtwo\symbol{82}}}
\expandafter\def\csname faicon@eur\endcsname{{\FAtwo\symbol{83}}}
\expandafter\def\csname faicon@exchange\endcsname{{\FAtwo\symbol{84}}}
\expandafter\def\csname faicon@exclamation\endcsname{{\FAtwo\symbol{85}}}
\expandafter\def\csname faicon@exclamation-circle\endcsname{{\FAtwo\symbol{86}}}
\expandafter\def\csname faicon@external-link\endcsname{{\FAtwo\symbol{87}}}
\expandafter\def\csname faicon@eye-slash\endcsname{{\FAtwo\symbol{88}}}
\expandafter\def\csname faicon@eye\endcsname{{\FAtwo\symbol{89}}}
\expandafter\def\csname faicon@plus-square\endcsname{{\FAtwo\symbol{90}}}
\expandafter\def\csname faicon@bitbucket\endcsname{{\FAtwo\symbol{91}}}
\expandafter\def\csname faicon@reddit\endcsname{{\FAtwo\symbol{92}}}
\expandafter\def\csname faicon@stumbleupon\endcsname{{\FAtwo\symbol{93}}}
\expandafter\def\csname faicon@language\endcsname{{\FAtwo\symbol{94}}}
\expandafter\def\csname faicon@cc-amex\endcsname{{\FAtwo\symbol{95}}}
\expandafter\def\csname faicon@paint-brush\endcsname{{\FAtwo\symbol{96}}}
\expandafter\def\csname faicon@dashcube\endcsname{{\FAtwo\symbol{97}}}
\expandafter\def\csname faicon@leanpub\endcsname{{\FAtwo\symbol{98}}}
\expandafter\def\csname faicon@gg\endcsname{{\FAtwo\symbol{99}}}
\expandafter\def\csname faicon@gg-circle\endcsname{{\FAtwo\symbol{100}}}
\expandafter\def\csname faicon@odnoklassniki\endcsname{{\FAtwo\symbol{101}}}
\expandafter\def\csname faicon@black-tie\endcsname{{\FAtwo\symbol{102}}}
\expandafter\def\csname faicon@facebook\endcsname{{\FAtwo\symbol{103}}}
\expandafter\def\csname faicon@facebook-square\endcsname{{\FAtwo\symbol{104}}}
\expandafter\def\csname faicon@video-camera\endcsname{{\FAtwo\symbol{105}}}
\expandafter\def\csname faicon@fast-backward\endcsname{{\FAtwo\symbol{106}}}
\expandafter\def\csname faicon@fast-forward\endcsname{{\FAtwo\symbol{107}}}
\expandafter\def\csname faicon@female\endcsname{{\FAtwo\symbol{108}}}
\expandafter\def\csname faicon@fighter-jet\endcsname{{\FAtwo\symbol{109}}}
\expandafter\def\csname faicon@file\endcsname{{\FAtwo\symbol{110}}}
\expandafter\def\csname faicon@file-o\endcsname{{\FAtwo\symbol{111}}}
\expandafter\def\csname faicon@file-text\endcsname{{\FAtwo\symbol{112}}}
\expandafter\def\csname faicon@file-text-o\endcsname{{\FAtwo\symbol{113}}}
\expandafter\def\csname faicon@film\endcsname{{\FAtwo\symbol{114}}}
\expandafter\def\csname faicon@filter\endcsname{{\FAtwo\symbol{115}}}
\expandafter\def\csname faicon@fire\endcsname{{\FAtwo\symbol{116}}}
\expandafter\def\csname faicon@fire-extinguisher\endcsname{{\FAtwo\symbol{117}}}
\expandafter\def\csname faicon@flag\endcsname{{\FAtwo\symbol{118}}}
\expandafter\def\csname faicon@flag-o\endcsname{{\FAtwo\symbol{119}}}
\expandafter\def\csname faicon@flag-checkered\endcsname{{\FAtwo\symbol{120}}}
\expandafter\def\csname faicon@flickr\endcsname{{\FAtwo\symbol{121}}}
\expandafter\def\csname faicon@folder\endcsname{{\FAtwo\symbol{122}}}
\expandafter\def\csname faicon@folder-o\endcsname{{\FAtwo\symbol{123}}}
\expandafter\def\csname faicon@folder-open\endcsname{{\FAtwo\symbol{124}}}
\expandafter\def\csname faicon@folder-open-o\endcsname{{\FAtwo\symbol{125}}}
\expandafter\def\csname faicon@font\endcsname{{\FAtwo\symbol{126}}}
\expandafter\def\csname faicon@cutlery\endcsname{{\FAtwo\symbol{127}}}
\expandafter\def\csname faicon@forward\endcsname{{\FAtwo\symbol{128}}}
\expandafter\def\csname faicon@foursquare\endcsname{{\FAtwo\symbol{129}}}
\expandafter\def\csname faicon@frown-o\endcsname{{\FAtwo\symbol{130}}}
\expandafter\def\csname faicon@arrows-alt\endcsname{{\FAtwo\symbol{131}}}
\expandafter\def\csname faicon@gamepad\endcsname{{\FAtwo\symbol{132}}}
\expandafter\def\csname faicon@gbp\endcsname{{\FAtwo\symbol{133}}}
\expandafter\def\csname faicon@gift\endcsname{{\FAtwo\symbol{134}}}
\expandafter\def\csname faicon@github\endcsname{{\FAtwo\symbol{135}}}
\expandafter\def\csname faicon@github-alt\endcsname{{\FAtwo\symbol{136}}}
\expandafter\def\csname faicon@github-square\endcsname{{\FAtwo\symbol{137}}}
\expandafter\def\csname faicon@gratipay\endcsname{{\FAtwo\symbol{138}}}
\expandafter\def\csname faicon@glass\endcsname{{\FAtwo\symbol{139}}}
\expandafter\def\csname faicon@globe\endcsname{{\FAtwo\symbol{140}}}
\expandafter\def\csname faicon@google-plus\endcsname{{\FAtwo\symbol{141}}}
\expandafter\def\csname faicon@google-plus-square\endcsname{{\FAtwo\symbol{142}}}
\expandafter\def\csname faicon@users\endcsname{{\FAtwo\symbol{143}}}
\expandafter\def\csname faicon@h-square\endcsname{{\FAtwo\symbol{144}}}
\expandafter\def\csname faicon@hand-o-down\endcsname{{\FAtwo\symbol{145}}}
\expandafter\def\csname faicon@hand-o-left\endcsname{{\FAtwo\symbol{146}}}
\expandafter\def\csname faicon@hand-o-right\endcsname{{\FAtwo\symbol{147}}}
\expandafter\def\csname faicon@hand-o-up\endcsname{{\FAtwo\symbol{148}}}
\expandafter\def\csname faicon@hdd-o\endcsname{{\FAtwo\symbol{149}}}
\expandafter\def\csname faicon@headphones\endcsname{{\FAtwo\symbol{150}}}
\expandafter\def\csname faicon@heart\endcsname{{\FAtwo\symbol{151}}}
\expandafter\def\csname faicon@heart-o\endcsname{{\FAtwo\symbol{152}}}
\expandafter\def\csname faicon@home\endcsname{{\FAtwo\symbol{153}}}
\expandafter\def\csname faicon@hospital-o\endcsname{{\FAtwo\symbol{154}}}
\expandafter\def\csname faicon@html5\endcsname{{\FAtwo\symbol{155}}}
\expandafter\def\csname faicon@inbox\endcsname{{\FAtwo\symbol{156}}}
\expandafter\def\csname faicon@outdent\endcsname{{\FAtwo\symbol{157}}}
\expandafter\def\csname faicon@indent\endcsname{{\FAtwo\symbol{158}}}
\expandafter\def\csname faicon@info-circle\endcsname{{\FAtwo\symbol{159}}}
\expandafter\def\csname faicon@inr\endcsname{{\FAtwo\symbol{160}}}
\expandafter\def\csname faicon@instagram\endcsname{{\FAtwo\symbol{161}}}
\expandafter\def\csname faicon@italic\endcsname{{\FAtwo\symbol{162}}}
\expandafter\def\csname faicon@jpy\endcsname{{\FAtwo\symbol{163}}}
\expandafter\def\csname faicon@key\endcsname{{\FAtwo\symbol{164}}}
\expandafter\def\csname faicon@keyboard-o\endcsname{{\FAtwo\symbol{165}}}
\expandafter\def\csname faicon@krw\endcsname{{\FAtwo\symbol{166}}}
\expandafter\def\csname faicon@laptop\endcsname{{\FAtwo\symbol{167}}}
\expandafter\def\csname faicon@leaf\endcsname{{\FAtwo\symbol{168}}}
\expandafter\def\csname faicon@gavel\endcsname{{\FAtwo\symbol{169}}}
\expandafter\def\csname faicon@lemon-o\endcsname{{\FAtwo\symbol{170}}}
\expandafter\def\csname faicon@level-down\endcsname{{\FAtwo\symbol{171}}}
\expandafter\def\csname faicon@level-up\endcsname{{\FAtwo\symbol{172}}}
\expandafter\def\csname faicon@lightbulb-o\endcsname{{\FAtwo\symbol{173}}}
\expandafter\def\csname faicon@link\endcsname{{\FAtwo\symbol{174}}}
\expandafter\def\csname faicon@linkedin\endcsname{{\FAtwo\symbol{175}}}
\expandafter\def\csname faicon@linkedin-square\endcsname{{\FAtwo\symbol{176}}}
\expandafter\def\csname faicon@linux\endcsname{{\FAtwo\symbol{177}}}
\expandafter\def\csname faicon@list\endcsname{{\FAtwo\symbol{178}}}
\expandafter\def\csname faicon@list-alt\endcsname{{\FAtwo\symbol{179}}}
\expandafter\def\csname faicon@location-arrow\endcsname{{\FAtwo\symbol{180}}}
\expandafter\def\csname faicon@lock\endcsname{{\FAtwo\symbol{181}}}
\expandafter\def\csname faicon@long-arrow-down\endcsname{{\FAtwo\symbol{182}}}
\expandafter\def\csname faicon@long-arrow-left\endcsname{{\FAtwo\symbol{183}}}
\expandafter\def\csname faicon@long-arrow-right\endcsname{{\FAtwo\symbol{184}}}
\expandafter\def\csname faicon@long-arrow-up\endcsname{{\FAtwo\symbol{185}}}
\expandafter\def\csname faicon@magic\endcsname{{\FAtwo\symbol{186}}}
\expandafter\def\csname faicon@magnet\endcsname{{\FAtwo\symbol{187}}}
\expandafter\def\csname faicon@male\endcsname{{\FAtwo\symbol{188}}}
\expandafter\def\csname faicon@map-marker\endcsname{{\FAtwo\symbol{189}}}
\expandafter\def\csname faicon@maxcdn\endcsname{{\FAtwo\symbol{190}}}
\expandafter\def\csname faicon@medkit\endcsname{{\FAtwo\symbol{191}}}
\expandafter\def\csname faicon@meh-o\endcsname{{\FAtwo\symbol{192}}}
\expandafter\def\csname faicon@microphone\endcsname{{\FAtwo\symbol{193}}}
\expandafter\def\csname faicon@microphone-slash\endcsname{{\FAtwo\symbol{194}}}
\expandafter\def\csname faicon@minus\endcsname{{\FAtwo\symbol{195}}}
\expandafter\def\csname faicon@minus-circle\endcsname{{\FAtwo\symbol{196}}}
\expandafter\def\csname faicon@minus-square\endcsname{{\FAtwo\symbol{197}}}
\expandafter\def\csname faicon@mobile\endcsname{{\FAtwo\symbol{198}}}
\expandafter\def\csname faicon@money\endcsname{{\FAtwo\symbol{199}}}
\expandafter\def\csname faicon@arrows\endcsname{{\FAtwo\symbol{200}}}
\expandafter\def\csname faicon@music\endcsname{{\FAtwo\symbol{201}}}
\expandafter\def\csname faicon@power-off\endcsname{{\FAtwo\symbol{202}}}
\expandafter\def\csname faicon@check\endcsname{{\FAtwo\symbol{203}}}
\expandafter\def\csname faicon@check-circle-o\endcsname{{\FAtwo\symbol{204}}}
\expandafter\def\csname faicon@check-circle\endcsname{{\FAtwo\symbol{205}}}
\expandafter\def\csname faicon@list-ol\endcsname{{\FAtwo\symbol{206}}}
\expandafter\def\csname faicon@paperclip\endcsname{{\FAtwo\symbol{207}}}
\expandafter\def\csname faicon@clipboard\endcsname{{\FAtwo\symbol{208}}}
\expandafter\def\csname faicon@pause\endcsname{{\FAtwo\symbol{209}}}
\expandafter\def\csname faicon@pencil\endcsname{{\FAtwo\symbol{210}}}
\expandafter\def\csname faicon@phone\endcsname{{\FAtwo\symbol{211}}}
\expandafter\def\csname faicon@phone-square\endcsname{{\FAtwo\symbol{212}}}
\expandafter\def\csname faicon@picture-o\endcsname{{\FAtwo\symbol{213}}}
\expandafter\def\csname faicon@pinterest\endcsname{{\FAtwo\symbol{214}}}
\expandafter\def\csname faicon@pinterest-square\endcsname{{\FAtwo\symbol{215}}}
\expandafter\def\csname faicon@plane\endcsname{{\FAtwo\symbol{216}}}
\expandafter\def\csname faicon@play\endcsname{{\FAtwo\symbol{217}}}
\expandafter\def\csname faicon@play-circle-o\endcsname{{\FAtwo\symbol{218}}}
\expandafter\def\csname faicon@play-circle\endcsname{{\FAtwo\symbol{219}}}
\expandafter\def\csname faicon@plus\endcsname{{\FAtwo\symbol{220}}}
\expandafter\def\csname faicon@plus-circle\endcsname{{\FAtwo\symbol{221}}}
\expandafter\def\csname faicon@plus-square-o\endcsname{{\FAtwo\symbol{222}}}
\expandafter\def\csname faicon@print\endcsname{{\FAtwo\symbol{223}}}
\expandafter\def\csname faicon@thumb-tack\endcsname{{\FAtwo\symbol{224}}}
\expandafter\def\csname faicon@puzzle-piece\endcsname{{\FAtwo\symbol{225}}}
\expandafter\def\csname faicon@qrcode\endcsname{{\FAtwo\symbol{226}}}
\expandafter\def\csname faicon@question\endcsname{{\FAtwo\symbol{227}}}
\expandafter\def\csname faicon@question-circle\endcsname{{\FAtwo\symbol{228}}}
\expandafter\def\csname faicon@quote-left\endcsname{{\FAtwo\symbol{229}}}
\expandafter\def\csname faicon@quote-right\endcsname{{\FAtwo\symbol{230}}}
\expandafter\def\csname faicon@random\endcsname{{\FAtwo\symbol{231}}}
\expandafter\def\csname faicon@refresh\endcsname{{\FAtwo\symbol{232}}}
\expandafter\def\csname faicon@times\endcsname{{\FAtwo\symbol{233}}}
\expandafter\def\csname faicon@times-circle-o\endcsname{{\FAtwo\symbol{234}}}
\expandafter\def\csname faicon@times-circle\endcsname{{\FAtwo\symbol{235}}}
\expandafter\def\csname faicon@renren\endcsname{{\FAtwo\symbol{236}}}
\expandafter\def\csname faicon@bars\endcsname{{\FAtwo\symbol{237}}}
\expandafter\def\csname faicon@repeat\endcsname{{\FAtwo\symbol{238}}}
\expandafter\def\csname faicon@reply\endcsname{{\FAtwo\symbol{239}}}
\expandafter\def\csname faicon@reply-all\endcsname{{\FAtwo\symbol{240}}}
\expandafter\def\csname faicon@expand\endcsname{{\FAtwo\symbol{241}}}
\expandafter\def\csname faicon@arrows-h\endcsname{{\FAtwo\symbol{242}}}
\expandafter\def\csname faicon@compress\endcsname{{\FAtwo\symbol{243}}}
\expandafter\def\csname faicon@arrows-v\endcsname{{\FAtwo\symbol{244}}}
\expandafter\def\csname faicon@retweet\endcsname{{\FAtwo\symbol{245}}}
\expandafter\def\csname faicon@road\endcsname{{\FAtwo\symbol{246}}}
\expandafter\def\csname faicon@rocket\endcsname{{\FAtwo\symbol{247}}}
\expandafter\def\csname faicon@rss\endcsname{{\FAtwo\symbol{248}}}
\expandafter\def\csname faicon@rub\endcsname{{\FAtwo\symbol{249}}}
\expandafter\def\csname faicon@floppy-o\endcsname{{\FAtwo\symbol{250}}}
\expandafter\def\csname faicon@crosshairs\endcsname{{\FAtwo\symbol{251}}}
\expandafter\def\csname faicon@search\endcsname{{\FAtwo\symbol{252}}}
\expandafter\def\csname faicon@share-square-o\endcsname{{\FAtwo\symbol{253}}}
\expandafter\def\csname faicon@share\endcsname{{\FAtwo\symbol{254}}}
\expandafter\def\csname faicon@share-square\endcsname{{\FAtwo\symbol{255}}}
\expandafter\def\csname faicon@shield\endcsname{{\FAthree\symbol{0}}}
\expandafter\def\csname faicon@shopping-cart\endcsname{{\FAthree\symbol{1}}}
\expandafter\def\csname faicon@square\endcsname{{\FAthree\symbol{2}}}
\expandafter\def\csname faicon@signal\endcsname{{\FAthree\symbol{3}}}
\expandafter\def\csname faicon@sign-in\endcsname{{\FAthree\symbol{4}}}
\expandafter\def\csname faicon@sign-out\endcsname{{\FAthree\symbol{5}}}
\expandafter\def\csname faicon@sitemap\endcsname{{\FAthree\symbol{6}}}
\expandafter\def\csname faicon@skype\endcsname{{\FAthree\symbol{7}}}
\expandafter\def\csname faicon@smile-o\endcsname{{\FAthree\symbol{8}}}
\expandafter\def\csname faicon@sort\endcsname{{\FAthree\symbol{9}}}
\expandafter\def\csname faicon@sort-alpha-asc\endcsname{{\FAthree\symbol{10}}}
\expandafter\def\csname faicon@sort-amount-asc\endcsname{{\FAthree\symbol{11}}}
\expandafter\def\csname faicon@sort-amount-desc\endcsname{{\FAthree\symbol{12}}}
\expandafter\def\csname faicon@sort-numeric-asc\endcsname{{\FAthree\symbol{13}}}
\expandafter\def\csname faicon@sort-numeric-desc\endcsname{{\FAthree\symbol{14}}}
\expandafter\def\csname faicon@sort-desc\endcsname{{\FAthree\symbol{15}}}
\expandafter\def\csname faicon@sort-asc\endcsname{{\FAthree\symbol{16}}}
\expandafter\def\csname faicon@spinner\endcsname{{\FAthree\symbol{17}}}
\expandafter\def\csname faicon@stack-exchange\endcsname{{\FAthree\symbol{18}}}
\expandafter\def\csname faicon@stack-overflow\endcsname{{\FAthree\symbol{19}}}
\expandafter\def\csname faicon@star\endcsname{{\FAthree\symbol{20}}}
\expandafter\def\csname faicon@star-o\endcsname{{\FAthree\symbol{21}}}
\expandafter\def\csname faicon@star-half\endcsname{{\FAthree\symbol{22}}}
\expandafter\def\csname faicon@star-half-o\endcsname{{\FAthree\symbol{23}}}
\expandafter\def\csname faicon@step-backward\endcsname{{\FAthree\symbol{24}}}
\expandafter\def\csname faicon@step-forward\endcsname{{\FAthree\symbol{25}}}
\expandafter\def\csname faicon@stethoscope\endcsname{{\FAthree\symbol{26}}}
\expandafter\def\csname faicon@stop\endcsname{{\FAthree\symbol{27}}}
\expandafter\def\csname faicon@strikethrough\endcsname{{\FAthree\symbol{28}}}
\expandafter\def\csname faicon@subscript\endcsname{{\FAthree\symbol{29}}}
\expandafter\def\csname faicon@suitcase\endcsname{{\FAthree\symbol{30}}}
\expandafter\def\csname faicon@sun-o\endcsname{{\FAthree\symbol{31}}}
\expandafter\def\csname faicon@superscript\endcsname{{\FAthree\symbol{32}}}
\expandafter\def\csname faicon@table\endcsname{{\FAthree\symbol{33}}}
\expandafter\def\csname faicon@tablet\endcsname{{\FAthree\symbol{34}}}
\expandafter\def\csname faicon@tag\endcsname{{\FAthree\symbol{35}}}
\expandafter\def\csname faicon@tags\endcsname{{\FAthree\symbol{36}}}
\expandafter\def\csname faicon@tasks\endcsname{{\FAthree\symbol{37}}}
\expandafter\def\csname faicon@terminal\endcsname{{\FAthree\symbol{38}}}
\expandafter\def\csname faicon@text-height\endcsname{{\FAthree\symbol{39}}}
\expandafter\def\csname faicon@text-width\endcsname{{\FAthree\symbol{40}}}
\expandafter\def\csname faicon@th\endcsname{{\FAthree\symbol{41}}}
\expandafter\def\csname faicon@th-large\endcsname{{\FAthree\symbol{42}}}
\expandafter\def\csname faicon@th-list\endcsname{{\FAthree\symbol{43}}}
\expandafter\def\csname faicon@thumbs-o-down\endcsname{{\FAthree\symbol{44}}}
\expandafter\def\csname faicon@thumbs-o-up\endcsname{{\FAthree\symbol{45}}}
\expandafter\def\csname faicon@ticket\endcsname{{\FAthree\symbol{46}}}
\expandafter\def\csname faicon@clock-o\endcsname{{\FAthree\symbol{47}}}
\expandafter\def\csname faicon@tint\endcsname{{\FAthree\symbol{48}}}
\expandafter\def\csname faicon@trash-o\endcsname{{\FAthree\symbol{49}}}
\expandafter\def\csname faicon@trello\endcsname{{\FAthree\symbol{50}}}
\expandafter\def\csname faicon@trophy\endcsname{{\FAthree\symbol{51}}}
\expandafter\def\csname faicon@truck\endcsname{{\FAthree\symbol{52}}}
\expandafter\def\csname faicon@tumblr\endcsname{{\FAthree\symbol{53}}}
\expandafter\def\csname faicon@tumblr-square\endcsname{{\FAthree\symbol{54}}}
\expandafter\def\csname faicon@twitter\endcsname{{\FAthree\symbol{55}}}
\expandafter\def\csname faicon@twitter-square\endcsname{{\FAthree\symbol{56}}}
\expandafter\def\csname faicon@list-ul\endcsname{{\FAthree\symbol{57}}}
\expandafter\def\csname faicon@umbrella\endcsname{{\FAthree\symbol{58}}}
\expandafter\def\csname faicon@underline\endcsname{{\FAthree\symbol{59}}}
\expandafter\def\csname faicon@undo\endcsname{{\FAthree\symbol{60}}}
\expandafter\def\csname faicon@google\endcsname{{\FAthree\symbol{61}}}
\expandafter\def\csname faicon@paw\endcsname{{\FAthree\symbol{62}}}
\expandafter\def\csname faicon@database\endcsname{{\FAthree\symbol{63}}}
\expandafter\def\csname faicon@file-pdf-o\endcsname{{\FAthree\symbol{64}}}
\expandafter\def\csname faicon@rebel\endcsname{{\FAthree\symbol{65}}}
\expandafter\def\csname faicon@empire\endcsname{{\FAthree\symbol{66}}}
\expandafter\def\csname faicon@git-square\endcsname{{\FAthree\symbol{67}}}
\expandafter\def\csname faicon@tencent-weibo\endcsname{{\FAthree\symbol{68}}}
\expandafter\def\csname faicon@qq\endcsname{{\FAthree\symbol{69}}}
\expandafter\def\csname faicon@weixin\endcsname{{\FAthree\symbol{70}}}
\expandafter\def\csname faicon@share-alt\endcsname{{\FAthree\symbol{71}}}
\expandafter\def\csname faicon@cc-visa\endcsname{{\FAthree\symbol{72}}}
\expandafter\def\csname faicon@fonticons\endcsname{{\FAthree\symbol{73}}}
\expandafter\def\csname faicon@reddit-alien\endcsname{{\FAthree\symbol{74}}}
\expandafter\def\csname faicon@modx\endcsname{{\FAthree\symbol{75}}}
\expandafter\def\csname faicon@fort-awesome\endcsname{{\FAthree\symbol{76}}}
\expandafter\def\csname faicon@volume-control-phone\endcsname{{\FAthree\symbol{77}}}
\expandafter\def\csname faicon@braille\endcsname{{\FAthree\symbol{78}}}
\expandafter\def\csname faicon@assistive-listening-systems\endcsname{{\FAthree\symbol{79}}}
\expandafter\def\csname faicon@american-sign-language-interpreting\endcsname{{\FAthree\symbol{80}}}
\expandafter\def\csname faicon@deaf\endcsname{{\FAthree\symbol{81}}}
\expandafter\def\csname faicon@glide\endcsname{{\FAthree\symbol{82}}}
\expandafter\def\csname faicon@glide-g\endcsname{{\FAthree\symbol{83}}}
\expandafter\def\csname faicon@sign-language\endcsname{{\FAthree\symbol{84}}}
\expandafter\def\csname faicon@low-vision\endcsname{{\FAthree\symbol{85}}}
\expandafter\def\csname faicon@viadeo\endcsname{{\FAthree\symbol{86}}}
\expandafter\def\csname faicon@viadeo-square\endcsname{{\FAthree\symbol{87}}}
\expandafter\def\csname faicon@snapchat\endcsname{{\FAthree\symbol{88}}}
\expandafter\def\csname faicon@snapchat-ghost\endcsname{{\FAthree\symbol{89}}}
\expandafter\def\csname faicon@snapchat-square\endcsname{{\FAthree\symbol{90}}}
\expandafter\def\csname faicon@pied-piper\endcsname{{\FAthree\symbol{91}}}
\expandafter\def\csname faicon@first-order\endcsname{{\FAthree\symbol{92}}}
\expandafter\def\csname faicon@yoast\endcsname{{\FAthree\symbol{93}}}
\expandafter\def\csname faicon@themeisle\endcsname{{\FAthree\symbol{94}}}
\expandafter\def\csname faicon@google-plus-official\endcsname{{\FAthree\symbol{95}}}
\expandafter\def\csname faicon@font-awesome\endcsname{{\FAthree\symbol{96}}}
\expandafter\def\csname faicon@chain-broken\endcsname{{\FAthree\symbol{97}}}
\expandafter\def\csname faicon@unlock\endcsname{{\FAthree\symbol{98}}}
\expandafter\def\csname faicon@unlock-alt\endcsname{{\FAthree\symbol{99}}}
\expandafter\def\csname faicon@arrow-circle-o-up\endcsname{{\FAthree\symbol{100}}}
\expandafter\def\csname faicon@upload\endcsname{{\FAthree\symbol{101}}}
\expandafter\def\csname faicon@usd\endcsname{{\FAthree\symbol{102}}}
\expandafter\def\csname faicon@user\endcsname{{\FAthree\symbol{103}}}
\expandafter\def\csname faicon@user-md\endcsname{{\FAthree\symbol{104}}}
\expandafter\def\csname faicon@venus\endcsname{{\FAthree\symbol{105}}}
\expandafter\def\csname faicon@vimeo-square\endcsname{{\FAthree\symbol{106}}}
\expandafter\def\csname faicon@vk\endcsname{{\FAthree\symbol{107}}}
\expandafter\def\csname faicon@volume-down\endcsname{{\FAthree\symbol{108}}}
\expandafter\def\csname faicon@volume-off\endcsname{{\FAthree\symbol{109}}}
\expandafter\def\csname faicon@volume-up\endcsname{{\FAthree\symbol{110}}}
\expandafter\def\csname faicon@exclamation-triangle\endcsname{{\FAthree\symbol{111}}}
\expandafter\def\csname faicon@weibo\endcsname{{\FAthree\symbol{112}}}
\expandafter\def\csname faicon@windows\endcsname{{\FAthree\symbol{113}}}
\expandafter\def\csname faicon@wrench\endcsname{{\FAthree\symbol{114}}}
\expandafter\def\csname faicon@xing\endcsname{{\FAthree\symbol{115}}}
\expandafter\def\csname faicon@xing-square\endcsname{{\FAthree\symbol{116}}}
\expandafter\def\csname faicon@youtube\endcsname{{\FAthree\symbol{117}}}
\expandafter\def\csname faicon@youtube-play\endcsname{{\FAthree\symbol{118}}}
\expandafter\def\csname faicon@youtube-square\endcsname{{\FAthree\symbol{119}}}
\expandafter\def\csname faicon@search-plus\endcsname{{\FAthree\symbol{120}}}
\expandafter\def\csname faicon@search-minus\endcsname{{\FAthree\symbol{121}}}
%% end of file `fontawesomesymbols-pdftex.tex'.
+634
View File
@@ -0,0 +1,634 @@
\expandafter\def\csname faicon@glass\endcsname{{\FA\symbol{"F000}}}
\expandafter\def\csname faicon@music\endcsname{{\FA\symbol{"F001}}}
\expandafter\def\csname faicon@search\endcsname{{\FA\symbol{"F002}}}
\expandafter\def\csname faicon@envelope-o\endcsname{{\FA\symbol{"F003}}}
\expandafter\def\csname faicon@heart\endcsname{{\FA\symbol{"F004}}}
\expandafter\def\csname faicon@star\endcsname{{\FA\symbol{"F005}}}
\expandafter\def\csname faicon@star-o\endcsname{{\FA\symbol{"F006}}}
\expandafter\def\csname faicon@user\endcsname{{\FA\symbol{"F007}}}
\expandafter\def\csname faicon@film\endcsname{{\FA\symbol{"F008}}}
\expandafter\def\csname faicon@th-large\endcsname{{\FA\symbol{"F009}}}
\expandafter\def\csname faicon@th\endcsname{{\FA\symbol{"F00A}}}
\expandafter\def\csname faicon@th-list\endcsname{{\FA\symbol{"F00B}}}
\expandafter\def\csname faicon@check\endcsname{{\FA\symbol{"F00C}}}
\expandafter\def\csname faicon@times\endcsname{{\FA\symbol{"F00D}}}
\expandafter\def\csname faicon@search-plus\endcsname{{\FA\symbol{"F00E}}}
\expandafter\def\csname faicon@search-minus\endcsname{{\FA\symbol{"F010}}}
\expandafter\def\csname faicon@power-off\endcsname{{\FA\symbol{"F011}}}
\expandafter\def\csname faicon@signal\endcsname{{\FA\symbol{"F012}}}
\expandafter\def\csname faicon@cog\endcsname{{\FA\symbol{"F013}}}
\expandafter\def\csname faicon@trash-o\endcsname{{\FA\symbol{"F014}}}
\expandafter\def\csname faicon@home\endcsname{{\FA\symbol{"F015}}}
\expandafter\def\csname faicon@file-o\endcsname{{\FA\symbol{"F016}}}
\expandafter\def\csname faicon@clock-o\endcsname{{\FA\symbol{"F017}}}
\expandafter\def\csname faicon@road\endcsname{{\FA\symbol{"F018}}}
\expandafter\def\csname faicon@download\endcsname{{\FA\symbol{"F019}}}
\expandafter\def\csname faicon@arrow-circle-o-down\endcsname{{\FA\symbol{"F01A}}}
\expandafter\def\csname faicon@arrow-circle-o-up\endcsname{{\FA\symbol{"F01B}}}
\expandafter\def\csname faicon@inbox\endcsname{{\FA\symbol{"F01C}}}
\expandafter\def\csname faicon@play-circle-o\endcsname{{\FA\symbol{"F01D}}}
\expandafter\def\csname faicon@repeat\endcsname{{\FA\symbol{"F01E}}}
\expandafter\def\csname faicon@refresh\endcsname{{\FA\symbol{"F021}}}
\expandafter\def\csname faicon@list-alt\endcsname{{\FA\symbol{"F022}}}
\expandafter\def\csname faicon@lock\endcsname{{\FA\symbol{"F023}}}
\expandafter\def\csname faicon@flag\endcsname{{\FA\symbol{"F024}}}
\expandafter\def\csname faicon@headphones\endcsname{{\FA\symbol{"F025}}}
\expandafter\def\csname faicon@volume-off\endcsname{{\FA\symbol{"F026}}}
\expandafter\def\csname faicon@volume-down\endcsname{{\FA\symbol{"F027}}}
\expandafter\def\csname faicon@volume-up\endcsname{{\FA\symbol{"F028}}}
\expandafter\def\csname faicon@qrcode\endcsname{{\FA\symbol{"F029}}}
\expandafter\def\csname faicon@barcode\endcsname{{\FA\symbol{"F02A}}}
\expandafter\def\csname faicon@tag\endcsname{{\FA\symbol{"F02B}}}
\expandafter\def\csname faicon@tags\endcsname{{\FA\symbol{"F02C}}}
\expandafter\def\csname faicon@book\endcsname{{\FA\symbol{"F02D}}}
\expandafter\def\csname faicon@bookmark\endcsname{{\FA\symbol{"F02E}}}
\expandafter\def\csname faicon@print\endcsname{{\FA\symbol{"F02F}}}
\expandafter\def\csname faicon@camera\endcsname{{\FA\symbol{"F030}}}
\expandafter\def\csname faicon@font\endcsname{{\FA\symbol{"F031}}}
\expandafter\def\csname faicon@bold\endcsname{{\FA\symbol{"F032}}}
\expandafter\def\csname faicon@italic\endcsname{{\FA\symbol{"F033}}}
\expandafter\def\csname faicon@text-height\endcsname{{\FA\symbol{"F034}}}
\expandafter\def\csname faicon@text-width\endcsname{{\FA\symbol{"F035}}}
\expandafter\def\csname faicon@align-left\endcsname{{\FA\symbol{"F036}}}
\expandafter\def\csname faicon@align-center\endcsname{{\FA\symbol{"F037}}}
\expandafter\def\csname faicon@align-right\endcsname{{\FA\symbol{"F038}}}
\expandafter\def\csname faicon@align-justify\endcsname{{\FA\symbol{"F039}}}
\expandafter\def\csname faicon@list\endcsname{{\FA\symbol{"F03A}}}
\expandafter\def\csname faicon@outdent\endcsname{{\FA\symbol{"F03B}}}
\expandafter\def\csname faicon@indent\endcsname{{\FA\symbol{"F03C}}}
\expandafter\def\csname faicon@video-camera\endcsname{{\FA\symbol{"F03D}}}
\expandafter\def\csname faicon@picture-o\endcsname{{\FA\symbol{"F03E}}}
\expandafter\def\csname faicon@pencil\endcsname{{\FA\symbol{"F040}}}
\expandafter\def\csname faicon@map-marker\endcsname{{\FA\symbol{"F041}}}
\expandafter\def\csname faicon@adjust\endcsname{{\FA\symbol{"F042}}}
\expandafter\def\csname faicon@tint\endcsname{{\FA\symbol{"F043}}}
\expandafter\def\csname faicon@pencil-square-o\endcsname{{\FA\symbol{"F044}}}
\expandafter\def\csname faicon@share-square-o\endcsname{{\FA\symbol{"F045}}}
\expandafter\def\csname faicon@check-square-o\endcsname{{\FA\symbol{"F046}}}
\expandafter\def\csname faicon@arrows\endcsname{{\FA\symbol{"F047}}}
\expandafter\def\csname faicon@step-backward\endcsname{{\FA\symbol{"F048}}}
\expandafter\def\csname faicon@fast-backward\endcsname{{\FA\symbol{"F049}}}
\expandafter\def\csname faicon@backward\endcsname{{\FA\symbol{"F04A}}}
\expandafter\def\csname faicon@play\endcsname{{\FA\symbol{"F04B}}}
\expandafter\def\csname faicon@pause\endcsname{{\FA\symbol{"F04C}}}
\expandafter\def\csname faicon@stop\endcsname{{\FA\symbol{"F04D}}}
\expandafter\def\csname faicon@forward\endcsname{{\FA\symbol{"F04E}}}
\expandafter\def\csname faicon@fast-forward\endcsname{{\FA\symbol{"F050}}}
\expandafter\def\csname faicon@step-forward\endcsname{{\FA\symbol{"F051}}}
\expandafter\def\csname faicon@eject\endcsname{{\FA\symbol{"F052}}}
\expandafter\def\csname faicon@chevron-left\endcsname{{\FA\symbol{"F053}}}
\expandafter\def\csname faicon@chevron-right\endcsname{{\FA\symbol{"F054}}}
\expandafter\def\csname faicon@plus-circle\endcsname{{\FA\symbol{"F055}}}
\expandafter\def\csname faicon@minus-circle\endcsname{{\FA\symbol{"F056}}}
\expandafter\def\csname faicon@times-circle\endcsname{{\FA\symbol{"F057}}}
\expandafter\def\csname faicon@check-circle\endcsname{{\FA\symbol{"F058}}}
\expandafter\def\csname faicon@question-circle\endcsname{{\FA\symbol{"F059}}}
\expandafter\def\csname faicon@info-circle\endcsname{{\FA\symbol{"F05A}}}
\expandafter\def\csname faicon@crosshairs\endcsname{{\FA\symbol{"F05B}}}
\expandafter\def\csname faicon@times-circle-o\endcsname{{\FA\symbol{"F05C}}}
\expandafter\def\csname faicon@check-circle-o\endcsname{{\FA\symbol{"F05D}}}
\expandafter\def\csname faicon@ban\endcsname{{\FA\symbol{"F05E}}}
\expandafter\def\csname faicon@arrow-left\endcsname{{\FA\symbol{"F060}}}
\expandafter\def\csname faicon@arrow-right\endcsname{{\FA\symbol{"F061}}}
\expandafter\def\csname faicon@arrow-up\endcsname{{\FA\symbol{"F062}}}
\expandafter\def\csname faicon@arrow-down\endcsname{{\FA\symbol{"F063}}}
\expandafter\def\csname faicon@share\endcsname{{\FA\symbol{"F064}}}
\expandafter\def\csname faicon@expand\endcsname{{\FA\symbol{"F065}}}
\expandafter\def\csname faicon@compress\endcsname{{\FA\symbol{"F066}}}
\expandafter\def\csname faicon@plus\endcsname{{\FA\symbol{"F067}}}
\expandafter\def\csname faicon@minus\endcsname{{\FA\symbol{"F068}}}
\expandafter\def\csname faicon@asterisk\endcsname{{\FA\symbol{"F069}}}
\expandafter\def\csname faicon@exclamation-circle\endcsname{{\FA\symbol{"F06A}}}
\expandafter\def\csname faicon@gift\endcsname{{\FA\symbol{"F06B}}}
\expandafter\def\csname faicon@leaf\endcsname{{\FA\symbol{"F06C}}}
\expandafter\def\csname faicon@fire\endcsname{{\FA\symbol{"F06D}}}
\expandafter\def\csname faicon@eye\endcsname{{\FA\symbol{"F06E}}}
\expandafter\def\csname faicon@eye-slash\endcsname{{\FA\symbol{"F070}}}
\expandafter\def\csname faicon@exclamation-triangle\endcsname{{\FA\symbol{"F071}}}
\expandafter\def\csname faicon@plane\endcsname{{\FA\symbol{"F072}}}
\expandafter\def\csname faicon@calendar\endcsname{{\FA\symbol{"F073}}}
\expandafter\def\csname faicon@random\endcsname{{\FA\symbol{"F074}}}
\expandafter\def\csname faicon@comment\endcsname{{\FA\symbol{"F075}}}
\expandafter\def\csname faicon@magnet\endcsname{{\FA\symbol{"F076}}}
\expandafter\def\csname faicon@chevron-up\endcsname{{\FA\symbol{"F077}}}
\expandafter\def\csname faicon@chevron-down\endcsname{{\FA\symbol{"F078}}}
\expandafter\def\csname faicon@retweet\endcsname{{\FA\symbol{"F079}}}
\expandafter\def\csname faicon@shopping-cart\endcsname{{\FA\symbol{"F07A}}}
\expandafter\def\csname faicon@folder\endcsname{{\FA\symbol{"F07B}}}
\expandafter\def\csname faicon@folder-open\endcsname{{\FA\symbol{"F07C}}}
\expandafter\def\csname faicon@arrows-v\endcsname{{\FA\symbol{"F07D}}}
\expandafter\def\csname faicon@arrows-h\endcsname{{\FA\symbol{"F07E}}}
\expandafter\def\csname faicon@bar-chart\endcsname{{\FA\symbol{"F080}}}
\expandafter\def\csname faicon@twitter-square\endcsname{{\FA\symbol{"F081}}}
\expandafter\def\csname faicon@facebook-square\endcsname{{\FA\symbol{"F082}}}
\expandafter\def\csname faicon@camera-retro\endcsname{{\FA\symbol{"F083}}}
\expandafter\def\csname faicon@key\endcsname{{\FA\symbol{"F084}}}
\expandafter\def\csname faicon@cogs\endcsname{{\FA\symbol{"F085}}}
\expandafter\def\csname faicon@comments\endcsname{{\FA\symbol{"F086}}}
\expandafter\def\csname faicon@thumbs-o-up\endcsname{{\FA\symbol{"F087}}}
\expandafter\def\csname faicon@thumbs-o-down\endcsname{{\FA\symbol{"F088}}}
\expandafter\def\csname faicon@star-half\endcsname{{\FA\symbol{"F089}}}
\expandafter\def\csname faicon@heart-o\endcsname{{\FA\symbol{"F08A}}}
\expandafter\def\csname faicon@sign-out\endcsname{{\FA\symbol{"F08B}}}
\expandafter\def\csname faicon@linkedin-square\endcsname{{\FA\symbol{"F08C}}}
\expandafter\def\csname faicon@thumb-tack\endcsname{{\FA\symbol{"F08D}}}
\expandafter\def\csname faicon@external-link\endcsname{{\FA\symbol{"F08E}}}
\expandafter\def\csname faicon@sign-in\endcsname{{\FA\symbol{"F090}}}
\expandafter\def\csname faicon@trophy\endcsname{{\FA\symbol{"F091}}}
\expandafter\def\csname faicon@github-square\endcsname{{\FA\symbol{"F092}}}
\expandafter\def\csname faicon@upload\endcsname{{\FA\symbol{"F093}}}
\expandafter\def\csname faicon@lemon-o\endcsname{{\FA\symbol{"F094}}}
\expandafter\def\csname faicon@phone\endcsname{{\FA\symbol{"F095}}}
\expandafter\def\csname faicon@square-o\endcsname{{\FA\symbol{"F096}}}
\expandafter\def\csname faicon@bookmark-o\endcsname{{\FA\symbol{"F097}}}
\expandafter\def\csname faicon@phone-square\endcsname{{\FA\symbol{"F098}}}
\expandafter\def\csname faicon@twitter\endcsname{{\FA\symbol{"F099}}}
\expandafter\def\csname faicon@facebook\endcsname{{\FA\symbol{"F09A}}}
\expandafter\def\csname faicon@github\endcsname{{\FA\symbol{"F09B}}}
\expandafter\def\csname faicon@unlock\endcsname{{\FA\symbol{"F09C}}}
\expandafter\def\csname faicon@credit-card\endcsname{{\FA\symbol{"F09D}}}
\expandafter\def\csname faicon@rss\endcsname{{\FA\symbol{"F09E}}}
\expandafter\def\csname faicon@hdd-o\endcsname{{\FA\symbol{"F0A0}}}
\expandafter\def\csname faicon@bullhorn\endcsname{{\FA\symbol{"F0A1}}}
\expandafter\def\csname faicon@bell\endcsname{{\FA\symbol{"F0F3}}}
\expandafter\def\csname faicon@certificate\endcsname{{\FA\symbol{"F0A3}}}
\expandafter\def\csname faicon@hand-o-right\endcsname{{\FA\symbol{"F0A4}}}
\expandafter\def\csname faicon@hand-o-left\endcsname{{\FA\symbol{"F0A5}}}
\expandafter\def\csname faicon@hand-o-up\endcsname{{\FA\symbol{"F0A6}}}
\expandafter\def\csname faicon@hand-o-down\endcsname{{\FA\symbol{"F0A7}}}
\expandafter\def\csname faicon@arrow-circle-left\endcsname{{\FA\symbol{"F0A8}}}
\expandafter\def\csname faicon@arrow-circle-right\endcsname{{\FA\symbol{"F0A9}}}
\expandafter\def\csname faicon@arrow-circle-up\endcsname{{\FA\symbol{"F0AA}}}
\expandafter\def\csname faicon@arrow-circle-down\endcsname{{\FA\symbol{"F0AB}}}
\expandafter\def\csname faicon@globe\endcsname{{\FA\symbol{"F0AC}}}
\expandafter\def\csname faicon@wrench\endcsname{{\FA\symbol{"F0AD}}}
\expandafter\def\csname faicon@tasks\endcsname{{\FA\symbol{"F0AE}}}
\expandafter\def\csname faicon@filter\endcsname{{\FA\symbol{"F0B0}}}
\expandafter\def\csname faicon@briefcase\endcsname{{\FA\symbol{"F0B1}}}
\expandafter\def\csname faicon@arrows-alt\endcsname{{\FA\symbol{"F0B2}}}
\expandafter\def\csname faicon@users\endcsname{{\FA\symbol{"F0C0}}}
\expandafter\def\csname faicon@link\endcsname{{\FA\symbol{"F0C1}}}
\expandafter\def\csname faicon@cloud\endcsname{{\FA\symbol{"F0C2}}}
\expandafter\def\csname faicon@flask\endcsname{{\FA\symbol{"F0C3}}}
\expandafter\def\csname faicon@scissors\endcsname{{\FA\symbol{"F0C4}}}
\expandafter\def\csname faicon@files-o\endcsname{{\FA\symbol{"F0C5}}}
\expandafter\def\csname faicon@paperclip\endcsname{{\FA\symbol{"F0C6}}}
\expandafter\def\csname faicon@floppy-o\endcsname{{\FA\symbol{"F0C7}}}
\expandafter\def\csname faicon@square\endcsname{{\FA\symbol{"F0C8}}}
\expandafter\def\csname faicon@bars\endcsname{{\FA\symbol{"F0C9}}}
\expandafter\def\csname faicon@list-ul\endcsname{{\FA\symbol{"F0CA}}}
\expandafter\def\csname faicon@list-ol\endcsname{{\FA\symbol{"F0CB}}}
\expandafter\def\csname faicon@strikethrough\endcsname{{\FA\symbol{"F0CC}}}
\expandafter\def\csname faicon@underline\endcsname{{\FA\symbol{"F0CD}}}
\expandafter\def\csname faicon@table\endcsname{{\FA\symbol{"F0CE}}}
\expandafter\def\csname faicon@magic\endcsname{{\FA\symbol{"F0D0}}}
\expandafter\def\csname faicon@truck\endcsname{{\FA\symbol{"F0D1}}}
\expandafter\def\csname faicon@pinterest\endcsname{{\FA\symbol{"F0D2}}}
\expandafter\def\csname faicon@pinterest-square\endcsname{{\FA\symbol{"F0D3}}}
\expandafter\def\csname faicon@google-plus-square\endcsname{{\FA\symbol{"F0D4}}}
\expandafter\def\csname faicon@google-plus\endcsname{{\FA\symbol{"F0D5}}}
\expandafter\def\csname faicon@money\endcsname{{\FA\symbol{"F0D6}}}
\expandafter\def\csname faicon@caret-down\endcsname{{\FA\symbol{"F0D7}}}
\expandafter\def\csname faicon@caret-up\endcsname{{\FA\symbol{"F0D8}}}
\expandafter\def\csname faicon@caret-left\endcsname{{\FA\symbol{"F0D9}}}
\expandafter\def\csname faicon@caret-right\endcsname{{\FA\symbol{"F0DA}}}
\expandafter\def\csname faicon@columns\endcsname{{\FA\symbol{"F0DB}}}
\expandafter\def\csname faicon@sort\endcsname{{\FA\symbol{"F0DC}}}
\expandafter\def\csname faicon@sort-desc\endcsname{{\FA\symbol{"F0DD}}}
\expandafter\def\csname faicon@sort-asc\endcsname{{\FA\symbol{"F0DE}}}
\expandafter\def\csname faicon@envelope\endcsname{{\FA\symbol{"F0E0}}}
\expandafter\def\csname faicon@linkedin\endcsname{{\FA\symbol{"F0E1}}}
\expandafter\def\csname faicon@undo\endcsname{{\FA\symbol{"F0E2}}}
\expandafter\def\csname faicon@gavel\endcsname{{\FA\symbol{"F0E3}}}
\expandafter\def\csname faicon@tachometer\endcsname{{\FA\symbol{"F0E4}}}
\expandafter\def\csname faicon@comment-o\endcsname{{\FA\symbol{"F0E5}}}
\expandafter\def\csname faicon@comments-o\endcsname{{\FA\symbol{"F0E6}}}
\expandafter\def\csname faicon@bolt\endcsname{{\FA\symbol{"F0E7}}}
\expandafter\def\csname faicon@sitemap\endcsname{{\FA\symbol{"F0E8}}}
\expandafter\def\csname faicon@umbrella\endcsname{{\FA\symbol{"F0E9}}}
\expandafter\def\csname faicon@clipboard\endcsname{{\FA\symbol{"F0EA}}}
\expandafter\def\csname faicon@lightbulb-o\endcsname{{\FA\symbol{"F0EB}}}
\expandafter\def\csname faicon@exchange\endcsname{{\FA\symbol{"F0EC}}}
\expandafter\def\csname faicon@cloud-download\endcsname{{\FA\symbol{"F0ED}}}
\expandafter\def\csname faicon@cloud-upload\endcsname{{\FA\symbol{"F0EE}}}
\expandafter\def\csname faicon@user-md\endcsname{{\FA\symbol{"F0F0}}}
\expandafter\def\csname faicon@stethoscope\endcsname{{\FA\symbol{"F0F1}}}
\expandafter\def\csname faicon@suitcase\endcsname{{\FA\symbol{"F0F2}}}
\expandafter\def\csname faicon@bell-o\endcsname{{\FA\symbol{"F0A2}}}
\expandafter\def\csname faicon@coffee\endcsname{{\FA\symbol{"F0F4}}}
\expandafter\def\csname faicon@cutlery\endcsname{{\FA\symbol{"F0F5}}}
\expandafter\def\csname faicon@file-text-o\endcsname{{\FA\symbol{"F0F6}}}
\expandafter\def\csname faicon@building-o\endcsname{{\FA\symbol{"F0F7}}}
\expandafter\def\csname faicon@hospital-o\endcsname{{\FA\symbol{"F0F8}}}
\expandafter\def\csname faicon@ambulance\endcsname{{\FA\symbol{"F0F9}}}
\expandafter\def\csname faicon@medkit\endcsname{{\FA\symbol{"F0FA}}}
\expandafter\def\csname faicon@fighter-jet\endcsname{{\FA\symbol{"F0FB}}}
\expandafter\def\csname faicon@beer\endcsname{{\FA\symbol{"F0FC}}}
\expandafter\def\csname faicon@h-square\endcsname{{\FA\symbol{"F0FD}}}
\expandafter\def\csname faicon@plus-square\endcsname{{\FA\symbol{"F0FE}}}
\expandafter\def\csname faicon@angle-double-left\endcsname{{\FA\symbol{"F100}}}
\expandafter\def\csname faicon@angle-double-right\endcsname{{\FA\symbol{"F101}}}
\expandafter\def\csname faicon@angle-double-up\endcsname{{\FA\symbol{"F102}}}
\expandafter\def\csname faicon@angle-double-down\endcsname{{\FA\symbol{"F103}}}
\expandafter\def\csname faicon@angle-left\endcsname{{\FA\symbol{"F104}}}
\expandafter\def\csname faicon@angle-right\endcsname{{\FA\symbol{"F105}}}
\expandafter\def\csname faicon@angle-up\endcsname{{\FA\symbol{"F106}}}
\expandafter\def\csname faicon@angle-down\endcsname{{\FA\symbol{"F107}}}
\expandafter\def\csname faicon@desktop\endcsname{{\FA\symbol{"F108}}}
\expandafter\def\csname faicon@laptop\endcsname{{\FA\symbol{"F109}}}
\expandafter\def\csname faicon@tablet\endcsname{{\FA\symbol{"F10A}}}
\expandafter\def\csname faicon@mobile\endcsname{{\FA\symbol{"F10B}}}
\expandafter\def\csname faicon@circle-o\endcsname{{\FA\symbol{"F10C}}}
\expandafter\def\csname faicon@quote-left\endcsname{{\FA\symbol{"F10D}}}
\expandafter\def\csname faicon@quote-right\endcsname{{\FA\symbol{"F10E}}}
\expandafter\def\csname faicon@spinner\endcsname{{\FA\symbol{"F110}}}
\expandafter\def\csname faicon@circle\endcsname{{\FA\symbol{"F111}}}
\expandafter\def\csname faicon@reply\endcsname{{\FA\symbol{"F112}}}
\expandafter\def\csname faicon@github-alt\endcsname{{\FA\symbol{"F113}}}
\expandafter\def\csname faicon@folder-o\endcsname{{\FA\symbol{"F114}}}
\expandafter\def\csname faicon@folder-open-o\endcsname{{\FA\symbol{"F115}}}
\expandafter\def\csname faicon@smile-o\endcsname{{\FA\symbol{"F118}}}
\expandafter\def\csname faicon@frown-o\endcsname{{\FA\symbol{"F119}}}
\expandafter\def\csname faicon@meh-o\endcsname{{\FA\symbol{"F11A}}}
\expandafter\def\csname faicon@gamepad\endcsname{{\FA\symbol{"F11B}}}
\expandafter\def\csname faicon@keyboard-o\endcsname{{\FA\symbol{"F11C}}}
\expandafter\def\csname faicon@flag-o\endcsname{{\FA\symbol{"F11D}}}
\expandafter\def\csname faicon@flag-checkered\endcsname{{\FA\symbol{"F11E}}}
\expandafter\def\csname faicon@terminal\endcsname{{\FA\symbol{"F120}}}
\expandafter\def\csname faicon@code\endcsname{{\FA\symbol{"F121}}}
\expandafter\def\csname faicon@reply-all\endcsname{{\FA\symbol{"F122}}}
\expandafter\def\csname faicon@star-half-o\endcsname{{\FA\symbol{"F123}}}
\expandafter\def\csname faicon@location-arrow\endcsname{{\FA\symbol{"F124}}}
\expandafter\def\csname faicon@crop\endcsname{{\FA\symbol{"F125}}}
\expandafter\def\csname faicon@code-fork\endcsname{{\FA\symbol{"F126}}}
\expandafter\def\csname faicon@chain-broken\endcsname{{\FA\symbol{"F127}}}
\expandafter\def\csname faicon@question\endcsname{{\FA\symbol{"F128}}}
\expandafter\def\csname faicon@info\endcsname{{\FA\symbol{"F129}}}
\expandafter\def\csname faicon@exclamation\endcsname{{\FA\symbol{"F12A}}}
\expandafter\def\csname faicon@superscript\endcsname{{\FA\symbol{"F12B}}}
\expandafter\def\csname faicon@subscript\endcsname{{\FA\symbol{"F12C}}}
\expandafter\def\csname faicon@eraser\endcsname{{\FA\symbol{"F12D}}}
\expandafter\def\csname faicon@puzzle-piece\endcsname{{\FA\symbol{"F12E}}}
\expandafter\def\csname faicon@microphone\endcsname{{\FA\symbol{"F130}}}
\expandafter\def\csname faicon@microphone-slash\endcsname{{\FA\symbol{"F131}}}
\expandafter\def\csname faicon@shield\endcsname{{\FA\symbol{"F132}}}
\expandafter\def\csname faicon@calendar-o\endcsname{{\FA\symbol{"F133}}}
\expandafter\def\csname faicon@fire-extinguisher\endcsname{{\FA\symbol{"F134}}}
\expandafter\def\csname faicon@rocket\endcsname{{\FA\symbol{"F135}}}
\expandafter\def\csname faicon@maxcdn\endcsname{{\FA\symbol{"F136}}}
\expandafter\def\csname faicon@chevron-circle-left\endcsname{{\FA\symbol{"F137}}}
\expandafter\def\csname faicon@chevron-circle-right\endcsname{{\FA\symbol{"F138}}}
\expandafter\def\csname faicon@chevron-circle-up\endcsname{{\FA\symbol{"F139}}}
\expandafter\def\csname faicon@chevron-circle-down\endcsname{{\FA\symbol{"F13A}}}
\expandafter\def\csname faicon@html5\endcsname{{\FA\symbol{"F13B}}}
\expandafter\def\csname faicon@css3\endcsname{{\FA\symbol{"F13C}}}
\expandafter\def\csname faicon@anchor\endcsname{{\FA\symbol{"F13D}}}
\expandafter\def\csname faicon@unlock-alt\endcsname{{\FA\symbol{"F13E}}}
\expandafter\def\csname faicon@bullseye\endcsname{{\FA\symbol{"F140}}}
\expandafter\def\csname faicon@ellipsis-h\endcsname{{\FA\symbol{"F141}}}
\expandafter\def\csname faicon@ellipsis-v\endcsname{{\FA\symbol{"F142}}}
\expandafter\def\csname faicon@rss-square\endcsname{{\FA\symbol{"F143}}}
\expandafter\def\csname faicon@play-circle\endcsname{{\FA\symbol{"F144}}}
\expandafter\def\csname faicon@ticket\endcsname{{\FA\symbol{"F145}}}
\expandafter\def\csname faicon@minus-square\endcsname{{\FA\symbol{"F146}}}
\expandafter\def\csname faicon@minus-square-o\endcsname{{\FA\symbol{"F147}}}
\expandafter\def\csname faicon@level-up\endcsname{{\FA\symbol{"F148}}}
\expandafter\def\csname faicon@level-down\endcsname{{\FA\symbol{"F149}}}
\expandafter\def\csname faicon@check-square\endcsname{{\FA\symbol{"F14A}}}
\expandafter\def\csname faicon@pencil-square\endcsname{{\FA\symbol{"F14B}}}
\expandafter\def\csname faicon@external-link-square\endcsname{{\FA\symbol{"F14C}}}
\expandafter\def\csname faicon@share-square\endcsname{{\FA\symbol{"F14D}}}
\expandafter\def\csname faicon@compass\endcsname{{\FA\symbol{"F14E}}}
\expandafter\def\csname faicon@caret-square-o-down\endcsname{{\FA\symbol{"F150}}}
\expandafter\def\csname faicon@caret-square-o-up\endcsname{{\FA\symbol{"F151}}}
\expandafter\def\csname faicon@caret-square-o-right\endcsname{{\FA\symbol{"F152}}}
\expandafter\def\csname faicon@eur\endcsname{{\FA\symbol{"F153}}}
\expandafter\def\csname faicon@gbp\endcsname{{\FA\symbol{"F154}}}
\expandafter\def\csname faicon@usd\endcsname{{\FA\symbol{"F155}}}
\expandafter\def\csname faicon@inr\endcsname{{\FA\symbol{"F156}}}
\expandafter\def\csname faicon@jpy\endcsname{{\FA\symbol{"F157}}}
\expandafter\def\csname faicon@rub\endcsname{{\FA\symbol{"F158}}}
\expandafter\def\csname faicon@krw\endcsname{{\FA\symbol{"F159}}}
\expandafter\def\csname faicon@btc\endcsname{{\FA\symbol{"F15A}}}
\expandafter\def\csname faicon@file\endcsname{{\FA\symbol{"F15B}}}
\expandafter\def\csname faicon@file-text\endcsname{{\FA\symbol{"F15C}}}
\expandafter\def\csname faicon@sort-alpha-asc\endcsname{{\FA\symbol{"F15D}}}
\expandafter\def\csname faicon@sort-alpha-desc\endcsname{{\FA\symbol{"F15E}}}
\expandafter\def\csname faicon@sort-amount-asc\endcsname{{\FA\symbol{"F160}}}
\expandafter\def\csname faicon@sort-amount-desc\endcsname{{\FA\symbol{"F161}}}
\expandafter\def\csname faicon@sort-numeric-asc\endcsname{{\FA\symbol{"F162}}}
\expandafter\def\csname faicon@sort-numeric-desc\endcsname{{\FA\symbol{"F163}}}
\expandafter\def\csname faicon@thumbs-up\endcsname{{\FA\symbol{"F164}}}
\expandafter\def\csname faicon@thumbs-down\endcsname{{\FA\symbol{"F165}}}
\expandafter\def\csname faicon@youtube-square\endcsname{{\FA\symbol{"F166}}}
\expandafter\def\csname faicon@youtube\endcsname{{\FA\symbol{"F167}}}
\expandafter\def\csname faicon@xing\endcsname{{\FA\symbol{"F168}}}
\expandafter\def\csname faicon@xing-square\endcsname{{\FA\symbol{"F169}}}
\expandafter\def\csname faicon@youtube-play\endcsname{{\FA\symbol{"F16A}}}
\expandafter\def\csname faicon@dropbox\endcsname{{\FA\symbol{"F16B}}}
\expandafter\def\csname faicon@stack-overflow\endcsname{{\FA\symbol{"F16C}}}
\expandafter\def\csname faicon@instagram\endcsname{{\FA\symbol{"F16D}}}
\expandafter\def\csname faicon@flickr\endcsname{{\FA\symbol{"F16E}}}
\expandafter\def\csname faicon@adn\endcsname{{\FA\symbol{"F170}}}
\expandafter\def\csname faicon@bitbucket\endcsname{{\FA\symbol{"F171}}}
\expandafter\def\csname faicon@bitbucket-square\endcsname{{\FA\symbol{"F172}}}
\expandafter\def\csname faicon@tumblr\endcsname{{\FA\symbol{"F173}}}
\expandafter\def\csname faicon@tumblr-square\endcsname{{\FA\symbol{"F174}}}
\expandafter\def\csname faicon@long-arrow-down\endcsname{{\FA\symbol{"F175}}}
\expandafter\def\csname faicon@long-arrow-up\endcsname{{\FA\symbol{"F176}}}
\expandafter\def\csname faicon@long-arrow-left\endcsname{{\FA\symbol{"F177}}}
\expandafter\def\csname faicon@long-arrow-right\endcsname{{\FA\symbol{"F178}}}
\expandafter\def\csname faicon@apple\endcsname{{\FA\symbol{"F179}}}
\expandafter\def\csname faicon@windows\endcsname{{\FA\symbol{"F17A}}}
\expandafter\def\csname faicon@android\endcsname{{\FA\symbol{"F17B}}}
\expandafter\def\csname faicon@linux\endcsname{{\FA\symbol{"F17C}}}
\expandafter\def\csname faicon@dribbble\endcsname{{\FA\symbol{"F17D}}}
\expandafter\def\csname faicon@skype\endcsname{{\FA\symbol{"F17E}}}
\expandafter\def\csname faicon@foursquare\endcsname{{\FA\symbol{"F180}}}
\expandafter\def\csname faicon@trello\endcsname{{\FA\symbol{"F181}}}
\expandafter\def\csname faicon@female\endcsname{{\FA\symbol{"F182}}}
\expandafter\def\csname faicon@male\endcsname{{\FA\symbol{"F183}}}
\expandafter\def\csname faicon@gratipay\endcsname{{\FA\symbol{"F184}}}
\expandafter\def\csname faicon@sun-o\endcsname{{\FA\symbol{"F185}}}
\expandafter\def\csname faicon@moon-o\endcsname{{\FA\symbol{"F186}}}
\expandafter\def\csname faicon@archive\endcsname{{\FA\symbol{"F187}}}
\expandafter\def\csname faicon@bug\endcsname{{\FA\symbol{"F188}}}
\expandafter\def\csname faicon@vk\endcsname{{\FA\symbol{"F189}}}
\expandafter\def\csname faicon@weibo\endcsname{{\FA\symbol{"F18A}}}
\expandafter\def\csname faicon@renren\endcsname{{\FA\symbol{"F18B}}}
\expandafter\def\csname faicon@pagelines\endcsname{{\FA\symbol{"F18C}}}
\expandafter\def\csname faicon@stack-exchange\endcsname{{\FA\symbol{"F18D}}}
\expandafter\def\csname faicon@arrow-circle-o-right\endcsname{{\FA\symbol{"F18E}}}
\expandafter\def\csname faicon@arrow-circle-o-left\endcsname{{\FA\symbol{"F190}}}
\expandafter\def\csname faicon@caret-square-o-left\endcsname{{\FA\symbol{"F191}}}
\expandafter\def\csname faicon@dot-circle-o\endcsname{{\FA\symbol{"F192}}}
\expandafter\def\csname faicon@wheelchair\endcsname{{\FA\symbol{"F193}}}
\expandafter\def\csname faicon@vimeo-square\endcsname{{\FA\symbol{"F194}}}
\expandafter\def\csname faicon@try\endcsname{{\FA\symbol{"F195}}}
\expandafter\def\csname faicon@plus-square-o\endcsname{{\FA\symbol{"F196}}}
\expandafter\def\csname faicon@space-shuttle\endcsname{{\FA\symbol{"F197}}}
\expandafter\def\csname faicon@slack\endcsname{{\FA\symbol{"F198}}}
\expandafter\def\csname faicon@envelope-square\endcsname{{\FA\symbol{"F199}}}
\expandafter\def\csname faicon@wordpress\endcsname{{\FA\symbol{"F19A}}}
\expandafter\def\csname faicon@openid\endcsname{{\FA\symbol{"F19B}}}
\expandafter\def\csname faicon@university\endcsname{{\FA\symbol{"F19C}}}
\expandafter\def\csname faicon@graduation-cap\endcsname{{\FA\symbol{"F19D}}}
\expandafter\def\csname faicon@yahoo\endcsname{{\FA\symbol{"F19E}}}
\expandafter\def\csname faicon@google\endcsname{{\FA\symbol{"F1A0}}}
\expandafter\def\csname faicon@reddit\endcsname{{\FA\symbol{"F1A1}}}
\expandafter\def\csname faicon@reddit-square\endcsname{{\FA\symbol{"F1A2}}}
\expandafter\def\csname faicon@stumbleupon-circle\endcsname{{\FA\symbol{"F1A3}}}
\expandafter\def\csname faicon@stumbleupon\endcsname{{\FA\symbol{"F1A4}}}
\expandafter\def\csname faicon@delicious\endcsname{{\FA\symbol{"F1A5}}}
\expandafter\def\csname faicon@digg\endcsname{{\FA\symbol{"F1A6}}}
\expandafter\def\csname faicon@pied-piper-pp\endcsname{{\FA\symbol{"F1A7}}}
\expandafter\def\csname faicon@pied-piper-alt\endcsname{{\FA\symbol{"F1A8}}}
\expandafter\def\csname faicon@drupal\endcsname{{\FA\symbol{"F1A9}}}
\expandafter\def\csname faicon@joomla\endcsname{{\FA\symbol{"F1AA}}}
\expandafter\def\csname faicon@language\endcsname{{\FA\symbol{"F1AB}}}
\expandafter\def\csname faicon@fax\endcsname{{\FA\symbol{"F1AC}}}
\expandafter\def\csname faicon@building\endcsname{{\FA\symbol{"F1AD}}}
\expandafter\def\csname faicon@child\endcsname{{\FA\symbol{"F1AE}}}
\expandafter\def\csname faicon@paw\endcsname{{\FA\symbol{"F1B0}}}
\expandafter\def\csname faicon@spoon\endcsname{{\FA\symbol{"F1B1}}}
\expandafter\def\csname faicon@cube\endcsname{{\FA\symbol{"F1B2}}}
\expandafter\def\csname faicon@cubes\endcsname{{\FA\symbol{"F1B3}}}
\expandafter\def\csname faicon@behance\endcsname{{\FA\symbol{"F1B4}}}
\expandafter\def\csname faicon@behance-square\endcsname{{\FA\symbol{"F1B5}}}
\expandafter\def\csname faicon@steam\endcsname{{\FA\symbol{"F1B6}}}
\expandafter\def\csname faicon@steam-square\endcsname{{\FA\symbol{"F1B7}}}
\expandafter\def\csname faicon@recycle\endcsname{{\FA\symbol{"F1B8}}}
\expandafter\def\csname faicon@car\endcsname{{\FA\symbol{"F1B9}}}
\expandafter\def\csname faicon@taxi\endcsname{{\FA\symbol{"F1BA}}}
\expandafter\def\csname faicon@tree\endcsname{{\FA\symbol{"F1BB}}}
\expandafter\def\csname faicon@spotify\endcsname{{\FA\symbol{"F1BC}}}
\expandafter\def\csname faicon@deviantart\endcsname{{\FA\symbol{"F1BD}}}
\expandafter\def\csname faicon@soundcloud\endcsname{{\FA\symbol{"F1BE}}}
\expandafter\def\csname faicon@database\endcsname{{\FA\symbol{"F1C0}}}
\expandafter\def\csname faicon@file-pdf-o\endcsname{{\FA\symbol{"F1C1}}}
\expandafter\def\csname faicon@file-word-o\endcsname{{\FA\symbol{"F1C2}}}
\expandafter\def\csname faicon@file-excel-o\endcsname{{\FA\symbol{"F1C3}}}
\expandafter\def\csname faicon@file-powerpoint-o\endcsname{{\FA\symbol{"F1C4}}}
\expandafter\def\csname faicon@file-image-o\endcsname{{\FA\symbol{"F1C5}}}
\expandafter\def\csname faicon@file-archive-o\endcsname{{\FA\symbol{"F1C6}}}
\expandafter\def\csname faicon@file-audio-o\endcsname{{\FA\symbol{"F1C7}}}
\expandafter\def\csname faicon@file-video-o\endcsname{{\FA\symbol{"F1C8}}}
\expandafter\def\csname faicon@file-code-o\endcsname{{\FA\symbol{"F1C9}}}
\expandafter\def\csname faicon@vine\endcsname{{\FA\symbol{"F1CA}}}
\expandafter\def\csname faicon@codepen\endcsname{{\FA\symbol{"F1CB}}}
\expandafter\def\csname faicon@jsfiddle\endcsname{{\FA\symbol{"F1CC}}}
\expandafter\def\csname faicon@life-ring\endcsname{{\FA\symbol{"F1CD}}}
\expandafter\def\csname faicon@circle-o-notch\endcsname{{\FA\symbol{"F1CE}}}
\expandafter\def\csname faicon@rebel\endcsname{{\FA\symbol{"F1D0}}}
\expandafter\def\csname faicon@empire\endcsname{{\FA\symbol{"F1D1}}}
\expandafter\def\csname faicon@git-square\endcsname{{\FA\symbol{"F1D2}}}
\expandafter\def\csname faicon@git\endcsname{{\FA\symbol{"F1D3}}}
\expandafter\def\csname faicon@hacker-news\endcsname{{\FA\symbol{"F1D4}}}
\expandafter\def\csname faicon@tencent-weibo\endcsname{{\FA\symbol{"F1D5}}}
\expandafter\def\csname faicon@qq\endcsname{{\FA\symbol{"F1D6}}}
\expandafter\def\csname faicon@weixin\endcsname{{\FA\symbol{"F1D7}}}
\expandafter\def\csname faicon@paper-plane\endcsname{{\FA\symbol{"F1D8}}}
\expandafter\def\csname faicon@paper-plane-o\endcsname{{\FA\symbol{"F1D9}}}
\expandafter\def\csname faicon@history\endcsname{{\FA\symbol{"F1DA}}}
\expandafter\def\csname faicon@circle-thin\endcsname{{\FA\symbol{"F1DB}}}
\expandafter\def\csname faicon@header\endcsname{{\FA\symbol{"F1DC}}}
\expandafter\def\csname faicon@paragraph\endcsname{{\FA\symbol{"F1DD}}}
\expandafter\def\csname faicon@sliders\endcsname{{\FA\symbol{"F1DE}}}
\expandafter\def\csname faicon@share-alt\endcsname{{\FA\symbol{"F1E0}}}
\expandafter\def\csname faicon@share-alt-square\endcsname{{\FA\symbol{"F1E1}}}
\expandafter\def\csname faicon@bomb\endcsname{{\FA\symbol{"F1E2}}}
\expandafter\def\csname faicon@futbol-o\endcsname{{\FA\symbol{"F1E3}}}
\expandafter\def\csname faicon@tty\endcsname{{\FA\symbol{"F1E4}}}
\expandafter\def\csname faicon@binoculars\endcsname{{\FA\symbol{"F1E5}}}
\expandafter\def\csname faicon@plug\endcsname{{\FA\symbol{"F1E6}}}
\expandafter\def\csname faicon@slideshare\endcsname{{\FA\symbol{"F1E7}}}
\expandafter\def\csname faicon@twitch\endcsname{{\FA\symbol{"F1E8}}}
\expandafter\def\csname faicon@yelp\endcsname{{\FA\symbol{"F1E9}}}
\expandafter\def\csname faicon@newspaper-o\endcsname{{\FA\symbol{"F1EA}}}
\expandafter\def\csname faicon@wifi\endcsname{{\FA\symbol{"F1EB}}}
\expandafter\def\csname faicon@calculator\endcsname{{\FA\symbol{"F1EC}}}
\expandafter\def\csname faicon@paypal\endcsname{{\FA\symbol{"F1ED}}}
\expandafter\def\csname faicon@google-wallet\endcsname{{\FA\symbol{"F1EE}}}
\expandafter\def\csname faicon@cc-visa\endcsname{{\FA\symbol{"F1F0}}}
\expandafter\def\csname faicon@cc-mastercard\endcsname{{\FA\symbol{"F1F1}}}
\expandafter\def\csname faicon@cc-discover\endcsname{{\FA\symbol{"F1F2}}}
\expandafter\def\csname faicon@cc-amex\endcsname{{\FA\symbol{"F1F3}}}
\expandafter\def\csname faicon@cc-paypal\endcsname{{\FA\symbol{"F1F4}}}
\expandafter\def\csname faicon@cc-stripe\endcsname{{\FA\symbol{"F1F5}}}
\expandafter\def\csname faicon@bell-slash\endcsname{{\FA\symbol{"F1F6}}}
\expandafter\def\csname faicon@bell-slash-o\endcsname{{\FA\symbol{"F1F7}}}
\expandafter\def\csname faicon@trash\endcsname{{\FA\symbol{"F1F8}}}
\expandafter\def\csname faicon@copyright\endcsname{{\FA\symbol{"F1F9}}}
\expandafter\def\csname faicon@at\endcsname{{\FA\symbol{"F1FA}}}
\expandafter\def\csname faicon@eyedropper\endcsname{{\FA\symbol{"F1FB}}}
\expandafter\def\csname faicon@paint-brush\endcsname{{\FA\symbol{"F1FC}}}
\expandafter\def\csname faicon@birthday-cake\endcsname{{\FA\symbol{"F1FD}}}
\expandafter\def\csname faicon@area-chart\endcsname{{\FA\symbol{"F1FE}}}
\expandafter\def\csname faicon@pie-chart\endcsname{{\FA\symbol{"F200}}}
\expandafter\def\csname faicon@line-chart\endcsname{{\FA\symbol{"F201}}}
\expandafter\def\csname faicon@lastfm\endcsname{{\FA\symbol{"F202}}}
\expandafter\def\csname faicon@lastfm-square\endcsname{{\FA\symbol{"F203}}}
\expandafter\def\csname faicon@toggle-off\endcsname{{\FA\symbol{"F204}}}
\expandafter\def\csname faicon@toggle-on\endcsname{{\FA\symbol{"F205}}}
\expandafter\def\csname faicon@bicycle\endcsname{{\FA\symbol{"F206}}}
\expandafter\def\csname faicon@bus\endcsname{{\FA\symbol{"F207}}}
\expandafter\def\csname faicon@ioxhost\endcsname{{\FA\symbol{"F208}}}
\expandafter\def\csname faicon@angellist\endcsname{{\FA\symbol{"F209}}}
\expandafter\def\csname faicon@cc\endcsname{{\FA\symbol{"F20A}}}
\expandafter\def\csname faicon@ils\endcsname{{\FA\symbol{"F20B}}}
\expandafter\def\csname faicon@meanpath\endcsname{{\FA\symbol{"F20C}}}
\expandafter\def\csname faicon@buysellads\endcsname{{\FA\symbol{"F20D}}}
\expandafter\def\csname faicon@connectdevelop\endcsname{{\FA\symbol{"F20E}}}
\expandafter\def\csname faicon@dashcube\endcsname{{\FA\symbol{"F210}}}
\expandafter\def\csname faicon@forumbee\endcsname{{\FA\symbol{"F211}}}
\expandafter\def\csname faicon@leanpub\endcsname{{\FA\symbol{"F212}}}
\expandafter\def\csname faicon@sellsy\endcsname{{\FA\symbol{"F213}}}
\expandafter\def\csname faicon@shirtsinbulk\endcsname{{\FA\symbol{"F214}}}
\expandafter\def\csname faicon@simplybuilt\endcsname{{\FA\symbol{"F215}}}
\expandafter\def\csname faicon@skyatlas\endcsname{{\FA\symbol{"F216}}}
\expandafter\def\csname faicon@cart-plus\endcsname{{\FA\symbol{"F217}}}
\expandafter\def\csname faicon@cart-arrow-down\endcsname{{\FA\symbol{"F218}}}
\expandafter\def\csname faicon@diamond\endcsname{{\FA\symbol{"F219}}}
\expandafter\def\csname faicon@ship\endcsname{{\FA\symbol{"F21A}}}
\expandafter\def\csname faicon@user-secret\endcsname{{\FA\symbol{"F21B}}}
\expandafter\def\csname faicon@motorcycle\endcsname{{\FA\symbol{"F21C}}}
\expandafter\def\csname faicon@street-view\endcsname{{\FA\symbol{"F21D}}}
\expandafter\def\csname faicon@heartbeat\endcsname{{\FA\symbol{"F21E}}}
\expandafter\def\csname faicon@venus\endcsname{{\FA\symbol{"F221}}}
\expandafter\def\csname faicon@mars\endcsname{{\FA\symbol{"F222}}}
\expandafter\def\csname faicon@mercury\endcsname{{\FA\symbol{"F223}}}
\expandafter\def\csname faicon@transgender\endcsname{{\FA\symbol{"F224}}}
\expandafter\def\csname faicon@transgender-alt\endcsname{{\FA\symbol{"F225}}}
\expandafter\def\csname faicon@venus-double\endcsname{{\FA\symbol{"F226}}}
\expandafter\def\csname faicon@mars-double\endcsname{{\FA\symbol{"F227}}}
\expandafter\def\csname faicon@venus-mars\endcsname{{\FA\symbol{"F228}}}
\expandafter\def\csname faicon@mars-stroke\endcsname{{\FA\symbol{"F229}}}
\expandafter\def\csname faicon@mars-stroke-v\endcsname{{\FA\symbol{"F22A}}}
\expandafter\def\csname faicon@mars-stroke-h\endcsname{{\FA\symbol{"F22B}}}
\expandafter\def\csname faicon@neuter\endcsname{{\FA\symbol{"F22C}}}
\expandafter\def\csname faicon@genderless\endcsname{{\FA\symbol{"F22D}}}
\expandafter\def\csname faicon@facebook-official\endcsname{{\FA\symbol{"F230}}}
\expandafter\def\csname faicon@pinterest-p\endcsname{{\FA\symbol{"F231}}}
\expandafter\def\csname faicon@whatsapp\endcsname{{\FA\symbol{"F232}}}
\expandafter\def\csname faicon@server\endcsname{{\FA\symbol{"F233}}}
\expandafter\def\csname faicon@user-plus\endcsname{{\FA\symbol{"F234}}}
\expandafter\def\csname faicon@user-times\endcsname{{\FA\symbol{"F235}}}
\expandafter\def\csname faicon@bed\endcsname{{\FA\symbol{"F236}}}
\expandafter\def\csname faicon@viacoin\endcsname{{\FA\symbol{"F237}}}
\expandafter\def\csname faicon@train\endcsname{{\FA\symbol{"F238}}}
\expandafter\def\csname faicon@subway\endcsname{{\FA\symbol{"F239}}}
\expandafter\def\csname faicon@medium\endcsname{{\FA\symbol{"F23A}}}
\expandafter\def\csname faicon@y-combinator\endcsname{{\FA\symbol{"F23B}}}
\expandafter\def\csname faicon@optin-monster\endcsname{{\FA\symbol{"F23C}}}
\expandafter\def\csname faicon@opencart\endcsname{{\FA\symbol{"F23D}}}
\expandafter\def\csname faicon@expeditedssl\endcsname{{\FA\symbol{"F23E}}}
\expandafter\def\csname faicon@battery-full\endcsname{{\FA\symbol{"F240}}}
\expandafter\def\csname faicon@battery-three-quarters\endcsname{{\FA\symbol{"F241}}}
\expandafter\def\csname faicon@battery-half\endcsname{{\FA\symbol{"F242}}}
\expandafter\def\csname faicon@battery-quarter\endcsname{{\FA\symbol{"F243}}}
\expandafter\def\csname faicon@battery-empty\endcsname{{\FA\symbol{"F244}}}
\expandafter\def\csname faicon@mouse-pointer\endcsname{{\FA\symbol{"F245}}}
\expandafter\def\csname faicon@i-cursor\endcsname{{\FA\symbol{"F246}}}
\expandafter\def\csname faicon@object-group\endcsname{{\FA\symbol{"F247}}}
\expandafter\def\csname faicon@object-ungroup\endcsname{{\FA\symbol{"F248}}}
\expandafter\def\csname faicon@sticky-note\endcsname{{\FA\symbol{"F249}}}
\expandafter\def\csname faicon@sticky-note-o\endcsname{{\FA\symbol{"F24A}}}
\expandafter\def\csname faicon@cc-jcb\endcsname{{\FA\symbol{"F24B}}}
\expandafter\def\csname faicon@cc-diners-club\endcsname{{\FA\symbol{"F24C}}}
\expandafter\def\csname faicon@clone\endcsname{{\FA\symbol{"F24D}}}
\expandafter\def\csname faicon@balance-scale\endcsname{{\FA\symbol{"F24E}}}
\expandafter\def\csname faicon@hourglass-o\endcsname{{\FA\symbol{"F250}}}
\expandafter\def\csname faicon@hourglass-start\endcsname{{\FA\symbol{"F251}}}
\expandafter\def\csname faicon@hourglass-half\endcsname{{\FA\symbol{"F252}}}
\expandafter\def\csname faicon@hourglass-end\endcsname{{\FA\symbol{"F253}}}
\expandafter\def\csname faicon@hourglass\endcsname{{\FA\symbol{"F254}}}
\expandafter\def\csname faicon@hand-rock-o\endcsname{{\FA\symbol{"F255}}}
\expandafter\def\csname faicon@hand-paper-o\endcsname{{\FA\symbol{"F256}}}
\expandafter\def\csname faicon@hand-scissors-o\endcsname{{\FA\symbol{"F257}}}
\expandafter\def\csname faicon@hand-lizard-o\endcsname{{\FA\symbol{"F258}}}
\expandafter\def\csname faicon@hand-spock-o\endcsname{{\FA\symbol{"F259}}}
\expandafter\def\csname faicon@hand-pointer-o\endcsname{{\FA\symbol{"F25A}}}
\expandafter\def\csname faicon@hand-peace-o\endcsname{{\FA\symbol{"F25B}}}
\expandafter\def\csname faicon@trademark\endcsname{{\FA\symbol{"F25C}}}
\expandafter\def\csname faicon@registered\endcsname{{\FA\symbol{"F25D}}}
\expandafter\def\csname faicon@creative-commons\endcsname{{\FA\symbol{"F25E}}}
\expandafter\def\csname faicon@gg\endcsname{{\FA\symbol{"F260}}}
\expandafter\def\csname faicon@gg-circle\endcsname{{\FA\symbol{"F261}}}
\expandafter\def\csname faicon@tripadvisor\endcsname{{\FA\symbol{"F262}}}
\expandafter\def\csname faicon@odnoklassniki\endcsname{{\FA\symbol{"F263}}}
\expandafter\def\csname faicon@odnoklassniki-square\endcsname{{\FA\symbol{"F264}}}
\expandafter\def\csname faicon@get-pocket\endcsname{{\FA\symbol{"F265}}}
\expandafter\def\csname faicon@wikipedia-w\endcsname{{\FA\symbol{"F266}}}
\expandafter\def\csname faicon@safari\endcsname{{\FA\symbol{"F267}}}
\expandafter\def\csname faicon@chrome\endcsname{{\FA\symbol{"F268}}}
\expandafter\def\csname faicon@firefox\endcsname{{\FA\symbol{"F269}}}
\expandafter\def\csname faicon@opera\endcsname{{\FA\symbol{"F26A}}}
\expandafter\def\csname faicon@internet-explorer\endcsname{{\FA\symbol{"F26B}}}
\expandafter\def\csname faicon@television\endcsname{{\FA\symbol{"F26C}}}
\expandafter\def\csname faicon@contao\endcsname{{\FA\symbol{"F26D}}}
\expandafter\def\csname faicon@500px\endcsname{{\FA\symbol{"F26E}}}
\expandafter\def\csname faicon@amazon\endcsname{{\FA\symbol{"F270}}}
\expandafter\def\csname faicon@calendar-plus-o\endcsname{{\FA\symbol{"F271}}}
\expandafter\def\csname faicon@calendar-minus-o\endcsname{{\FA\symbol{"F272}}}
\expandafter\def\csname faicon@calendar-times-o\endcsname{{\FA\symbol{"F273}}}
\expandafter\def\csname faicon@calendar-check-o\endcsname{{\FA\symbol{"F274}}}
\expandafter\def\csname faicon@industry\endcsname{{\FA\symbol{"F275}}}
\expandafter\def\csname faicon@map-pin\endcsname{{\FA\symbol{"F276}}}
\expandafter\def\csname faicon@map-signs\endcsname{{\FA\symbol{"F277}}}
\expandafter\def\csname faicon@map-o\endcsname{{\FA\symbol{"F278}}}
\expandafter\def\csname faicon@map\endcsname{{\FA\symbol{"F279}}}
\expandafter\def\csname faicon@commenting\endcsname{{\FA\symbol{"F27A}}}
\expandafter\def\csname faicon@commenting-o\endcsname{{\FA\symbol{"F27B}}}
\expandafter\def\csname faicon@houzz\endcsname{{\FA\symbol{"F27C}}}
\expandafter\def\csname faicon@vimeo\endcsname{{\FA\symbol{"F27D}}}
\expandafter\def\csname faicon@black-tie\endcsname{{\FA\symbol{"F27E}}}
\expandafter\def\csname faicon@fonticons\endcsname{{\FA\symbol{"F280}}}
\expandafter\def\csname faicon@reddit-alien\endcsname{{\FA\symbol{"F281}}}
\expandafter\def\csname faicon@edge\endcsname{{\FA\symbol{"F282}}}
\expandafter\def\csname faicon@credit-card-alt\endcsname{{\FA\symbol{"F283}}}
\expandafter\def\csname faicon@codiepie\endcsname{{\FA\symbol{"F284}}}
\expandafter\def\csname faicon@modx\endcsname{{\FA\symbol{"F285}}}
\expandafter\def\csname faicon@fort-awesome\endcsname{{\FA\symbol{"F286}}}
\expandafter\def\csname faicon@usb\endcsname{{\FA\symbol{"F287}}}
\expandafter\def\csname faicon@product-hunt\endcsname{{\FA\symbol{"F288}}}
\expandafter\def\csname faicon@mixcloud\endcsname{{\FA\symbol{"F289}}}
\expandafter\def\csname faicon@scribd\endcsname{{\FA\symbol{"F28A}}}
\expandafter\def\csname faicon@pause-circle\endcsname{{\FA\symbol{"F28B}}}
\expandafter\def\csname faicon@pause-circle-o\endcsname{{\FA\symbol{"F28C}}}
\expandafter\def\csname faicon@stop-circle\endcsname{{\FA\symbol{"F28D}}}
\expandafter\def\csname faicon@stop-circle-o\endcsname{{\FA\symbol{"F28E}}}
\expandafter\def\csname faicon@shopping-bag\endcsname{{\FA\symbol{"F290}}}
\expandafter\def\csname faicon@shopping-basket\endcsname{{\FA\symbol{"F291}}}
\expandafter\def\csname faicon@hashtag\endcsname{{\FA\symbol{"F292}}}
\expandafter\def\csname faicon@bluetooth\endcsname{{\FA\symbol{"F293}}}
\expandafter\def\csname faicon@bluetooth-b\endcsname{{\FA\symbol{"F294}}}
\expandafter\def\csname faicon@percent\endcsname{{\FA\symbol{"F295}}}
\expandafter\def\csname faicon@gitlab\endcsname{{\FA\symbol{"F296}}}
\expandafter\def\csname faicon@wpbeginner\endcsname{{\FA\symbol{"F297}}}
\expandafter\def\csname faicon@wpforms\endcsname{{\FA\symbol{"F298}}}
\expandafter\def\csname faicon@envira\endcsname{{\FA\symbol{"F299}}}
\expandafter\def\csname faicon@universal-access\endcsname{{\FA\symbol{"F29A}}}
\expandafter\def\csname faicon@wheelchair-alt\endcsname{{\FA\symbol{"F29B}}}
\expandafter\def\csname faicon@question-circle-o\endcsname{{\FA\symbol{"F29C}}}
\expandafter\def\csname faicon@blind\endcsname{{\FA\symbol{"F29D}}}
\expandafter\def\csname faicon@audio-description\endcsname{{\FA\symbol{"F29E}}}
\expandafter\def\csname faicon@volume-control-phone\endcsname{{\FA\symbol{"F2A0}}}
\expandafter\def\csname faicon@braille\endcsname{{\FA\symbol{"F2A1}}}
\expandafter\def\csname faicon@assistive-listening-systems\endcsname{{\FA\symbol{"F2A2}}}
\expandafter\def\csname faicon@american-sign-language-interpreting\endcsname{{\FA\symbol{"F2A3}}}
\expandafter\def\csname faicon@deaf\endcsname{{\FA\symbol{"F2A4}}}
\expandafter\def\csname faicon@glide\endcsname{{\FA\symbol{"F2A5}}}
\expandafter\def\csname faicon@glide-g\endcsname{{\FA\symbol{"F2A6}}}
\expandafter\def\csname faicon@sign-language\endcsname{{\FA\symbol{"F2A7}}}
\expandafter\def\csname faicon@low-vision\endcsname{{\FA\symbol{"F2A8}}}
\expandafter\def\csname faicon@viadeo\endcsname{{\FA\symbol{"F2A9}}}
\expandafter\def\csname faicon@viadeo-square\endcsname{{\FA\symbol{"F2AA}}}
\expandafter\def\csname faicon@snapchat\endcsname{{\FA\symbol{"F2AB}}}
\expandafter\def\csname faicon@snapchat-ghost\endcsname{{\FA\symbol{"F2AC}}}
\expandafter\def\csname faicon@snapchat-square\endcsname{{\FA\symbol{"F2AD}}}
\expandafter\def\csname faicon@pied-piper\endcsname{{\FA\symbol{"F2AE}}}
\expandafter\def\csname faicon@first-order\endcsname{{\FA\symbol{"F2B0}}}
\expandafter\def\csname faicon@yoast\endcsname{{\FA\symbol{"F2B1}}}
\expandafter\def\csname faicon@themeisle\endcsname{{\FA\symbol{"F2B2}}}
\expandafter\def\csname faicon@google-plus-official\endcsname{{\FA\symbol{"F2B3}}}
\expandafter\def\csname faicon@font-awesome\endcsname{{\FA\symbol{"F2B4}}}
Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

+38
View File
@@ -0,0 +1,38 @@
% 简历 / 个人简介
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**(人物「张远航」及成果均系编造),仅演示版式。
%
% 写法要点:\par{...} 包住,段首的 \textbf{姓名,} 与正文连排。
% 这段是整份简历最长的连续文字,行距与断行在这里最能看出问题,
% 改动字号 / 行距后先看这一段。
%
% ⚠️⚠️ 成果数字全部用 \cvnum 取,**不要手写**。
% \cvnum{类别} = 该类在正文里被 \cvmark / \cvtagcount 标记了几次
% \cvnum*{A,B} = 多类求和
% 增删一条论文/专利/项目,这里的数字自动跟着变,不用回来改。
% 类别与标记位置的对应关系:
% SCI / EI / 核心 ← section_04 的 \cvtagcount{...}
% 专利 / 第一发明人 ← section_05 的 \cvmark{...}
% 软著 ← section_06
% 科研项目 / 主持 / 负责 ← section_07
% 转化 ← section_08
% 教研 ← section_09
% ⚠️ 编译要跑两遍,第一遍概述会显示 0(读到的是上一遍的统计)。
%
% ⚠️ 例外:项目总经费**仍是手写**。\experience 的参数里没有经费字段,
% 没法从条目里自动求和。若想自动,得给 \experience 加一个经费参数,
% 改动较大,故这里保留手填。
\par{
{\textbf{张远航,}}
男,1985 年 3 月生,山东青岛人。工学博士,中国海洋大学信息科学与工程学部
计算机科学与技术学院教授、博士生导师。主要研究方向为海洋遥感信息处理、
机器学习与海洋大数据、多源观测数据同化及海洋数值模式智能订正,发表相关论文
\cvnum*{SCI,EI,核心} 篇(SCI \cvnum{SCI} 篇、EI \cvnum{EI} 篇、
中文核心 \cvnum{核心} 篇),获授权发明专利 \cvnum{专利} 项
(第一发明人 \cvnum{第一发明人} 项),完成专利成果转化 \cvnum{转化} 项,
登记软件著作权 \cvnum{软著} 项,主持各级科研项目 \cvnum{主持} 项、
作为负责人承担 \cvnum{负责} 项,项目总经费 1200 余万元,
主持教研项目 \cvnum{教研} 项。
}
+15
View File
@@ -0,0 +1,15 @@
% 简历 / 工作经历
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**(人物「张远航」及履历均系编造),仅演示版式。
%
% 版式:两列 tabular,左列时间用 \textsc(小型大写,数字不受影响),
% 右列职位 + 单位。表格是 rl 两列,宽度按内容自适应。
\sectionTitle{工作经历}{\faUniversity}
\begin{tabular}{rl}
\textsc{2021年12月 --至今} & \textbf{教授},信息科学与工程学部,计算机科学与技术学院,中国海洋大学,中国青岛\\
\textsc{2016年09月 --2021年11月} & \textbf{副教授},信息科学与工程学部,计算机科学与技术学院,中国海洋大学,中国青岛\\
\textsc{2013年07月 --2016年08月} & \textbf{博士后},海洋科学博士后流动站,中国海洋大学,中国青岛
\end{tabular}
+17
View File
@@ -0,0 +1,17 @@
% 简历 / 教育经历
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**(人物「张远航」及学历均系编造),仅演示版式。
%
% 版式:两列 tabular。注意「学校」那一段用 \\ & 另起一行续排,
% 这样一条经历占两行(学位/专业一行,学校一行),比挤成一行清楚。
% 不需要第二行时直接删掉 \\ & 那一句即可。
\sectionTitle{教育经历}{\faMortarBoard}
\begin{tabular}{rl}
\textsc{2009年09月 --2013年06月} & \textbf{博士,工学博士学位},计算机应用技术专业,信息科学与工程学院\\ & 中国海洋大学,中国青岛\\
\textsc{2011年09月 --2012年09月} & \textbf{联合培养博士},Computational Oceanography,College of Marine Science\\ & 南安普顿大学(UNIVERSITY OF SOUTHAMPTON),英国南安普顿\\
\textsc{2006年09月 --2009年06月} & \textbf{硕士,工学硕士学位},计算机软件与理论专业,信息科学与工程学院\\ & 中国海洋大学,中国青岛\\
\textsc{2002年09月 --2006年06月} & \textbf{本科,工学学士学位},计算机科学与技术专业,信息科学与工程学院\\ & 中国海洋大学,中国青岛
\end{tabular}
+55
View File
@@ -0,0 +1,55 @@
% 简历 / 学术论文
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**:论文题名、作者、DOI、卷期页码均系编造,
% 仅期刊名与会议名使用真实出版物名称以演示排版效果。不指向任何真实文献。
%
% 版式:itemize,每条一个 \item。要点:
% · 自己的名字用 \textbf{...},通讯作者再加 *(原件就是 **姓名***)
% · 收录类型(SCI / EI / 核心)用 \cvtagcount{} 缀在末尾,字体与正文同号,
% 不会喧宾夺主。\cvtagcount 除了显示,还会给该类别 +1,
% 概述里的「论文 \cvnum*{SCI,EI,核心} 篇」就是数出来的。
% ⚠️ 不要写回 \textbf{SCI}——那样只显示不计数,概述会少算。
% · 条目里出现 & 必须写 \&(如 "Neural Comput \& Applic")
% · 网址长的可以在前面加 \\ 手动断行,避免溢出到页边
\sectionTitle{学术论文}{\faLeanpub}
\begin{itemize}
\item \textbf{张远航}, 李文博, 陈思远, and 王海涛. 2024. 融合注意力机制的
多尺度卷积网络用于近岸叶绿素浓度反演.
\textit{IEEE Transactions on Geoscience and Remote Sensing}, 62, 1, (2024), 1--15.
DOI: 10.9999/TGRS.2024.0000001.\cvtagcount{SCI}
\item \textbf{张远航}, 刘洋, 赵明轩. 2023. 基于图神经网络的多源海洋观测数据
时空插值方法.
2023 IEEE International Geoscience and Remote Sensing Symposium (IGARSS), 412--415.
中国青岛: IEEE, 2023. \\ https://doi.org/10.9999/IGARSS.2023.0000002.\cvtagcount{EI}
\item \textbf{张远航}, 孙悦, 周建华, 吴晓峰, 郑凯. 2023. 一种面向海洋浮标
观测序列的异常检测与修复框架.
2023 IEEE 18th Annual Conference on Industrial Electronics and Applications (ICIEA), 88--93.
中国青岛, 中国: IEEE, 2023. https://doi.org/10.9999/ICIEA.2023.0000003.\cvtagcount{EI}
\item 李文博, \textbf{张远航*}, 陈思远, 王海涛, 刘洋. 2022. 基于物理约束
深度学习的长江口溶解氧短期预测.
\textit{Environmental Modelling \& Software}, 155, 105--118 (2022).
https://doi.org/10.9999/envsoft.2022.0000004.\cvtagcount{SCI}
\item 赵明轩, 孙悦, 周建华, 吴晓峰, \textbf{张远航*}. 2022.
海表温度再分析产品的多尺度误差分解与订正.
\textit{海洋学报}, 44 (6): 1--12.
\\ https://doi.org/10.9999/actaoce.2022.0000005.\cvtagcount{核心}
\item 陈思远, 王海涛, \textbf{张远航*}, 李文博, 郑凯. 2021. "基于时序注意力
机制的赤潮发生概率预报模型." \textit{Journal of Marine Systems} 218 (5): 103--115.
https://doi.org/10.9999/jmarsys.2021.0000006.\cvtagcount{SCI}
\item 王海涛, 刘洋, and \textbf{张远航*}. 2021. "A Hybrid Data Assimilation
Scheme Coupling Ensemble Kalman Filter with Deep Learning."
In 2021 IEEE 17th International Conference on Computational Intelligence and Security (CIS), 201--206.
中国北京, 中国: IEEE. https://doi.org/10.9999/CIS.2021.0000007.\cvtagcount{EI}
\item 刘洋, 赵明轩, and \textbf{张远航*}. 2020. "Spatiotemporal Fusion of
Satellite and In-situ Observations for Coastal Water Quality Mapping."
\textit{IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing} 13 (4): 1120--1133.
\\ https://doi.org/10.9999/jstars.2020.0000008.\cvtagcount{SCI}
\item 孙悦, 周建华, and \textbf{张远航*}. 2019. "Transfer Learning for
Cross-Region Chlorophyll Prediction with Limited Labels."
In \textit{Advances in Neural Information Processing Systems Workshops}. 中国青岛: 44--51.
Lecture Notes in Computer Science.
Cham: Springer International Publishing. \cvtagcount{EI}
\end{itemize}
+47
View File
@@ -0,0 +1,47 @@
% 简历 / 发明专利
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**:发明人、专利名称、专利号、授权日均系编造,
% 不指向任何真实专利。
%
% 版式:itemize。原件按「本人第一发明人」与「本人非第一发明人」分两组、
% 中间空一行。本模板保留这个分组习惯 —— 评审看专利时第一发明人权重
% 明显不同,混在一起排是浪费。
% 专利号格式:ZL + 年份 + 序号 + . + 校验位(示例统一用 9999 段,
% 一眼可辨是假号)。
%
% ⚠️ 每条末尾的 \cvmark{专利} 是计数标记,不产生可见输出。
% 第一发明人的条目额外加 \cvmark{第一发明人},概述里的
% 「授权发明专利 \cvnum{专利} 项(第一发明人 \cvnum{第一发明人} 项)」
% 就是这么数出来的。增删条目时**标记要跟着走**,否则数字会不对。
\sectionTitle{发明专利}{\faWpforms}
\begin{itemize}
\item \textbf{张远航}, 李文博, 陈思远, 王海涛. 一种基于注意力机制的海表
叶绿素浓度反演方法. ZL209999000001.9. 2024-05-14.\cvmark{专利}
\cvmark{第一发明人}
\item \textbf{张远航}, 刘洋, 赵明轩, 孙悦. 多源海洋观测数据时空融合插值
装置及方法. ZL209999000002.6. 2023-11-07.\cvmark{专利}
\cvmark{第一发明人}
\item \textbf{张远航}, 陈思远, 王海涛, 周建华, 吴晓峰. 一种海洋浮标观测
序列异常检测与自动修复方法. ZL209999000003.3. 2023-06-20.\cvmark{专利}
\cvmark{第一发明人}
\item \textbf{张远航}, 孙悦, 周建华. 基于物理约束神经网络的水质参数短期
预测方法及系统. ZL209999000004.0. 2022-09-13.\cvmark{专利}
\cvmark{第一发明人}
\item \textbf{张远航}, 吴晓峰, 郑凯. 一种赤潮发生概率的时序预报方法.
ZL209999000005.8. 2022-03-29.
该方法以多源遥感与水文要素为输入。\cvmark{专利}
\cvmark{第一发明人}
\item \textbf{张远航}, 李文博, 刘洋. 面向近岸海域的遥感影像云检测与重建
方法. ZL209999000006.5. 2021-08-17.\cvmark{专利}
\cvmark{第一发明人}
\item 李文博, 陈思远, \textbf{张远航}. 一种海表温度再分析产品误差订正
方法. ZL209999000007.2. 2021-04-06.\cvmark{专利}
\item 赵明轩, 王海涛, \textbf{张远航}. 多尺度卷积特征融合的海洋要素
预报后处理装置. ZL209999000008.9. 2020-12-15.\cvmark{专利}
\item 周建华, 孙悦, \textbf{张远航}. 一种适用于稀疏站点的海洋数据
质量控制方法. ZL209999000009.7. 2020-07-21.\cvmark{专利}
\end{itemize}
+24
View File
@@ -0,0 +1,24 @@
% 简历 / 软件著作权
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**:软件名称、登记号、登记日均系编造,不指向任何
% 真实软著登记。
%
% 登记号格式:YYYY SR NNNNNNN(前 4 位是年份),后面跟「软著登字第 NNNNNNN 号」。
% 示例统一用 999999 段,一眼可辨是假号。
% 开发人员多于 6 人时可以考虑只列前几位加「等」,避免单条过长折行。
%
% ⚠️ 用 cvlist 环境自动计数:每多一个 \item,概述里的 \cvnum{软著} 就自动 +1。
% 增删条目**什么都不用改**,数字自己会跟上。
\sectionTitle{软件著作权}{\faTv}
\begin{cvlist}{软著}
\item \textbf{张远航}, 李文博, 陈思远, 王海涛, 刘洋, 赵明轩, 孙悦, 周建华.
近岸海域叶绿素浓度遥感反演系统. 2024. 2024SR9999901. 软著登字第 9999901 号.
\item \textbf{张远航}, 陈思远, 王海涛, 李文博, 吴晓峰, 郑凯.
多源海洋观测数据融合与质量控制检索系统. 2023. 2023SR9999902. 软著登字第 9999902 号.
\item \textbf{张远航}, 刘洋, 赵明轩. 海洋要素智能订正与预报后处理平台. 2023. 2023SR9999903. 软著登字第 9999903 号.
\item 李文博, \textbf{张远航}, 孙悦. 浮标观测序列异常检测与修复系统. 2022. 2022SR9999904. 软著登字第 9999904 号.
\item \textbf{张远航}, 周建华. 海洋卫星遥感影像云检测预处理系统. 2021. 2021SR9999905. 软著登字第 9999905 号.
\end{cvlist}
+87
View File
@@ -0,0 +1,87 @@
% 简历 / 项目经验
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**:项目名称、来源、经费、内容均系编造,不指向
% 任何真实项目。
%
% 版式:experiences 环境(longtable 两列),每条 \experience 有 7 个参数:
% ① 结束时间 ② 项目名称 ③ 项目来源 ④ 本人角色
% ⑤ 开始时间 ⑥ 项目内容(可含 itemize) ⑦ 技术关键词
%
% ⚠️ 参数顺序是「结束在前、开始在后」—— 上游模板就这么定义(\textsc{#1}
% 先印、\textsc{#5} 后印),第一次用极易写反。本文按正确顺序填写。
%
% ⚠️ 每条后面必须跟 \emptySeparator 才会分条;漏了会和下一条并成一格。
%
% ⚠️ 关键词用**英文逗号**分隔,\foreach 按 , 切分。用中文逗号会把整串
% 当成一个标签,撑成一个大框。
%
% ⚠️ 项目名称 / 内容越写越长会撞到右栏宽度。右栏宽由 cls 的
% \rightcolumnlength 按版心反算(\linewidth − 左栏 − 4\tabcolsep),
% 改完记住看日志有没有 Overfull。
%
% ⚠️ 每条描述块(\end{itemize} 之后、minipage 之内)的 \cvmark 是计数标记,
% 不产生可见输出。\cvmark{科研项目} 每条都有;\cvmark{主持} 仅当第 4 参数
% 是「主持」;\cvmark{负责} 对应子课题负责人/课题负责人/单位负责人。
% 概述里「主持 \cvnum{主持} 项、作为负责人承担 \cvnum{负责} 项」由此而来。
% ⚠️ 标记必须放在**描述参数**里(minipage 内),不能放关键词参数里——
% 关键词会被 \foreach 拆成单个标签,标记不但不生效还会报错。
\sectionTitle{项目经验}{\faCode}
\begin{experiences}
\experience
{2024年12月} {近岸海域生态健康多源数据融合与智能评估技术}{国家重点研发计划-青年科学家项目}{主持}
{2021年12月} {
\begin{itemize}
\item 建立卫星、浮标、岸基站三类观测的统一时空基准与质量控制流程
\item 提出物理约束的深度学习同化方案,近岸水质要素反演精度提升约 18\%
\end{itemize}
\cvmark{科研项目}\cvmark{主持}
}
{多源数据融合, 深度学习, 数据同化, 近岸水质}
\emptySeparator
\experience
{2023年11月} {海洋牧场环境在线监测与预警平台}{横向}{主持}
{2021年06月} {
\begin{itemize}
\item 面向企业需求搭建浮标数据接入、异常识别与分级预警的完整链路
\item 平台在 3 处海洋牧场部署运行,日均处理观测记录约 12 万条
\end{itemize}
\cvmark{科研项目}\cvmark{主持}
}
{在线监测, 异常检测, 预警平台, 边缘计算, 时序数据库}
\emptySeparator
\experience
{2022年09月} {渤海生态健康预测预警关键技术研发}{国家重点研发计划}{子课题负责人}
{2019年11月} {
\begin{itemize}
\item 负责生态健康风险滚动预警模型的构建与业务化对接
\item 耦合物理模式输出与机器学习订正模块,预警时效由 3 天延至 7 天
\end{itemize}
\cvmark{科研项目}\cvmark{负责}
}
{生态健康, 滚动预警, 模式订正, 机器学习}
\emptySeparator
\experience
{2021年10月} {青岛市近岸海域水质遥感监测能力建设}{青岛市海洋发展局}{单位负责人}
{2020年03月} {
\begin{itemize}
\item 制定近岸水质遥感监测的技术方案与业务规范
\item 完成两期业务人员培训并交付监测产品生成工具
\end{itemize}
\cvmark{科研项目}\cvmark{负责}
}
{遥感监测, 业务规范, 技术培训}
\emptySeparator
\experience
{2020年12月} {海洋大数据智能分析开放课题}{省重点实验室开放基金}{课题负责人}
{2019年01月} {
\begin{itemize}
\item 研究稀疏标签条件下的跨区域迁移学习方法
\item 构建面向近岸水质的公开基准数据集与评测协议
\end{itemize}
\cvmark{科研项目}\cvmark{负责}
}
{迁移学习, 小样本, 基准数据集, 海洋大数据}
\end{experiences}
+23
View File
@@ -0,0 +1,23 @@
% 简历 / 成果转化
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**:专利名称、受让单位、转化时间均系编造,
% 受让单位一律用带「(示例)」字样的虚构公司名,不指向任何真实企业。
%
% 每条格式:发明人. 专利名称. 转化方式. 受让单位. 时间.
% 转化方式写清「专利权实施普通许可 / 转让 / 作价入股」,评职称时这一栏
% 比金额更被看重。
%
% ⚠️ 用 cvlist 环境自动计数:每多一个 \item,概述里的 \cvnum{转化} 就自动 +1。
% 增删条目**什么都不用改**,数字自己会跟上。
\sectionTitle{成果转化}{\faAmericanSignLanguageInterpreting}
\begin{cvlist}{转化}
\item \textbf{张远航}. 一种赤潮发生概率的时序预报方法. 专利权实施普通许可.
青岛蓝湾海洋科技有限公司(示例). 2023年06月.
\item \textbf{张远航}. 基于物理约束神经网络的水质参数短期预测方法及系统. 专利权实施普通许可.
山东海慧信息技术有限公司(示例). 2022年11月.
\item \textbf{张远航}. 面向近岸海域的遥感影像云检测与重建方法. 专利权实施普通许可.
青岛海图数据科技股份有限公司(示例). 2022年04月.
\end{cvlist}
+21
View File
@@ -0,0 +1,21 @@
% 简历 / 教研项目
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**:项目名称、立项单位、起止时间均系编造。
%
% 每条格式:项目名称. 立项单位 + 项目类别. 起止时间. 本人角色.
% 「主持 / 参与」不要省 —— 教学类项目主持人身份是评教学奖的硬指标。
%
% ⚠️ 用 cvlist 环境自动计数:每多一个 \item,概述里的 \cvnum{教研} 就自动 +1。
% 增删条目**什么都不用改**,数字自己会跟上。
\sectionTitle{教研项目}{\faGroup}
\begin{cvlist}{教研}
\item 海洋大数据分析案例库建设. 中国海洋大学研究生科研创新能力提升计划
专业学位研究生教学案例库建设项目. 2023.06 至今. 主持.
\item 机器学习与海洋应用. 中国海洋大学 2022 年度教材建设基金重点项目. 2022.03 至今. 主持.
\item 面向新工科的海洋信息类课程混合式教学模式改革. 中国海洋大学本科
教育教学研究一般项目. 2021.09 至 2023.08. 主持.
\item 数据科学与海洋情怀. 信息科学与工程学部课程思政建设项目. 2021.03 至 2022.12. 主持.
\end{cvlist}
+33
View File
@@ -0,0 +1,33 @@
% 简历 / 奖励与荣誉
%
% 上游:huajh/awesome-latex-cv(awesome-source-cv.cls),LPPL 1.3c。
% 本文件为**虚构示例**:获奖名称、名次、时间均系编造,不指向任何
% 真实评奖结果。
%
% 版式:两列 tabular,左时间右内容。**按时间倒序**排(最近的在最上)——
% 上游原件就是这个顺序,评审也习惯从最近的看起。
%
% 获奖层级的写法建议:国家级 / 省部级 / 校级 / 院级,并在括号里注名次
% (如「(第×位)」)或角色(如「(指导老师)」)。名次不写,评职称时
% 有时会被按最低权重算。
\sectionTitle{奖励与荣誉}{\faGavel}
\begin{tabular}{rl}
2024年11月 & 中国国际大学生创新大赛总决赛高教主赛道二等奖(指导老师) \\
2024年06月 & 中国海洋大学信息科学与工程学部优秀共产党员\\
2023年12月 & 山东省科技进步奖二等奖(第 2 位) \\
2023年09月 & 信息科学与工程学部首届教案展评优秀奖 \\
2023年05月 & 山东省第九届高校青年教师教学比赛优秀奖 \\
2022年12月 & 中国海洋大学青年教师教学大赛二等奖 \\
2022年10月 & 中国海洋大学第九届研究生体育文化节羽毛球比赛第一名 \\
2021年12月 & 2021 年度中国海洋大学优秀工会积极分子 \\
2021年11月 & 山东省科学技术进步一等奖(第 4 位) \\
2020年12月 & 中国海洋大学 2020 年度"优秀班主任"称号 \\
2019年12月 & 中国海洋大学青年教师教学比赛三等奖 \\
2012年12月 & 博士研究生国家奖学金 \\
2012年06月 & 中国海洋大学优秀研究生 \\
2011年12月 & 研究生优秀奖学金学习优秀奖 \\
2006年06月 & 山东省优秀毕业生 \\
2006年06月 & 中国海洋大学优秀毕业生 \\
\end{tabular}
+18
View File
@@ -0,0 +1,18 @@
% Awesome CV LaTeX Template
%
% This template has been downloaded from:
% https://github.com/huajh/huajh-awesome-latex-cv
%
% Author:
% Junhao Hua
%Section: Interests
%\section{\texorpdfstring{\color{Blue}Interests}{Interests}}
\sectionTitle{兴趣爱好}{\faLightbulbO}
\begin{tabular}{rl}
\textsc{体育:} & 篮球,足球,攀岩,极限运动,野外生存 \\
\textsc{艺术:} & 摄影,绘画,电影 \\
\textsc{其他:} & 旅行,量化投资\\
\end{tabular}
+17
View File
@@ -0,0 +1,17 @@
% Awesome CV LaTeX Template
%
% This template has been downloaded from:
% https://github.com/huajh/huajh-awesome-latex-cv
%
% Author:
% Junhao Hua
%Section: Languages
\sectionTitle{语言}{\faLanguage}
\begin{tabular}{lrll}
\textsc{英语:} & \skill{ 阅读}{5} & \textsc{4级: 502} \\
& \skill{听力}{4} & \textsc{6级: 478} \\
& \skill{口语}{3} & \\
\end{tabular}
%Chinese Mandarin (native)\\
+19
View File
@@ -0,0 +1,19 @@
% Awesome CV LaTeX Template
%
% This template has been downloaded from:
% https://github.com/huajh/huajh-awesome-latex-cv
%
% Author:
% Junhao Hua
%Section: Reference
\sectionTitle{Reference}{\faGroup}
\begin{tabular}{>{\small}r >{\small}p{8cm} >{\small}r >{\small}l}
\multicolumn{2}{l}{\textsc{hello world}, \emph{Lord of Winterfell}} & \multicolumn{2}{l}{\textsc{John Snow}, \emph{Lord Commander of the Night Watch}} \\
\quad \faMobilePhone & +33 6 23 45 67 89 & \quad \faMobilePhone & +86 6 23 45 67 90\\
\quad \faPhone & +33 157 2569 1478 & \quad \faPhone& +86 123 4567 5678\\
\quad \mailSymbol & \href{mailto:hello@world.org}{hello@world.org} & \quad \mailSymbol & \href{mailto:J.Snow@night.com}{J.Snow@night.com}\\
\end{tabular}
+23
View File
@@ -0,0 +1,23 @@
% Awesome CV LaTeX Template
%
% This template has been downloaded from:
% https://github.com/huajh/huajh-awesome-latex-cv
%
% Author:
% Junhao Hua
\sectionTitle{相关技能}{\faListUl}
\renewcommand{\arraystretch}{1.1}
\begin{tabular}{>{}r>{}p{13cm}}
\textsc{编程技能:} & \textbf{C/C++}, Matlab, \LaTeX, Python, Java.\\
\textsc{机器学习:} & \emph{掌握} \textbf{变分贝叶斯,分布式机器学习,概率图模型} \\
& \emph{熟悉} 大多数统计机器学习、统计信号处理算法 \\
& \emph{熟悉} 最优化理论(凸优化),矩阵论 \\
\textsc{计算机视觉:} & \emph{了解} 图像处理(分割,分类等),视频分析(目标识别,跟踪等) \\
\textsc{软考证书:} & 中级网络工程师,中级软件设计师,数据库技术三级\\
% \textsc{开发平台:} & Sublime Text, VSCode, MATLAB, Git, Visual Studio.
\end{tabular}
BIN
View File
Binary file not shown.
+109
View File
@@ -0,0 +1,109 @@
% !TEX TS-program = xelatex
% !TEX encoding = UTF-8 Unicode
%======================================================================
% 简历.tex —— 个人简历模板(中国海洋大学 LaTeX 模板库第 11 个模板)
%
% 上游:huajh/awesome-latex-cv 中文版(awesome-source-cv.cls)
% 授权:LPPL 1.3c(见本目录 LICENSE)
%
% ------------------------------------------------------------------
% 与上游的三处关键改动
% ------------------------------------------------------------------
% ① 字体全部换成本仓库自带的(../fonts/ + ../fonts.tex)
% 原件用 Adobe 宋/黑/楷/仿 4 款共 56 MB —— 商业授权不能分发;
% 还拿 HarmonyOS Sans 冒充 Bold/Italic(等于加粗不变、斜体不变)。
% 现在:中文 OUC Serif(真粗体 + 楷体代斜体)、西文 TeX Gyre Termes。
% 详见 awesome-source-cv.cls 的「Configuration for fonts」段。
%
% ② 不再需要 zh_cn-adobefonts_external.sty
% 那个文件只干一件事:设 Adobe 中文字体。现在由 ../fonts.tex
% 统一设,所以它不在本目录里。
%
% ③ 内容改为**虚构示例**
% 原 .tex 是填好的真实简历(真名、手机、邮箱、住址、出生年月、
% 专利号、论文题目)。本仓库的规矩是示例不含真人信息,故重写为
% 一份完整的虚构简历:人物「张远航」,单位、学历、论文、专利、
% 软著、项目、获奖全部编造。选「虚构值」而不是全打 ×,是因为
% 满篇 × 的示例既看不出排版效果,也没法直接对着改。
% 结构、章节顺序、排版与原版一致,按下面的「怎么填」一节替换即可。
%
% ------------------------------------------------------------------
% 编译
% ------------------------------------------------------------------
% cd 简历
% xelatex 简历.tex
% xelatex 简历.tex ← 跑两遍(hyperref 书签 + longtable 列宽)
%
% ⚠️ 必须在本模板目录下编译,不能从仓库根调用 —— fonts.tex 用的是
% 相对路径 ../fonts/,工作目录变了就找不到字体。
%
% ⚠️ 必须是 XeLaTeX。pdflatex 会在 fontspec 处直接失败。
%
% ------------------------------------------------------------------
% 怎么填
% ------------------------------------------------------------------
% \name{}{张远航} 姓名(第一个参数是西文名,中文简历留空)
% \tagline{中国海洋大学 教授} 头衔一行
% \photo{2.5cm}{photo} 照片,photo.jpg(不想要就整行删掉,
% 删后 \makecvheader 会自动占满整行)
% \socialinfo{...} 联系方式,里面的 \smartphone / \email /
% \address / \infos 都是可选的,不用的删掉
%
% section_XX_*.tex 各章节,按需要增删;主文件末尾 \input 的顺序
% 就是排版顺序
%======================================================================
\documentclass[localFont]{awesome-source-cv}
% 字体入口:仓库唯一允许声明字体的地方。
% ⚠️ 必须在 \documentclass 之后、\begin{document} 之前。
\input{../fonts.tex}
\usepackage{xeCJK}
% ⚠️⚠️ 以下全部内容为**虚构示例**,人物「张远航」及其单位、论文、专利、
% 软著、项目、获奖均系编造,不对应任何真实人物与成果。仅用于演示版式,
% 使用时请整体替换为自己的信息。
\name{}{张远航}
\tagline{中国海洋大学 教授}
\photo{2.5cm}{photo}
% 左上角校徽(可选)。不写这一行就完全不出现。
% 28mm 是这块空间里视觉最平衡的尺寸:页边距只有 15mm、姓名墨迹顶在 17.2mm,
% 再大就压到姓名上。想换样式:\cvlogo{28mm}[ouc_logo_彩色](圆形校徽)
% 想微调位置(默认距纸左 10mm、距纸顶 6mm):
% \setlength{\cvlogox}{12mm}
% \setlength{\cvlogoy}{8mm}
\cvlogo{28mm}
\socialinfo{
\infos{出生年月:1985.03 \quad 籍贯:山东青岛 \quad 政治面貌:中共党员}\\
\smartphone{(+86) 138 0000 0000}
\email{yhzhang@ouc.edu.cn} \emailO{yhzhang@example.net}\\
\address{山东省青岛市崂山区松岭路 238 号 中国海洋大学 信息科学与工程学部}
% ⚠️ 上面这行**不要**加结尾的 \\ 。\socialinfo 的内容会被塞进
% minipage 里的普通段落,末尾多一个 \\ 就等于多一个空行,
% 日志刷 Underfull \hbox (badness 10000) in paragraph(not fatal,
% 但属于无谓的脏警告)。中间的 \\ 是分行,必须留。
}
\begin{document}
\makecvheader
\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_references} % Reference(默认不印)
% \input{section_skills} % 相关技能(默认不印)
% \input{section_languages} % 语言(默认不印)
\end{document}
+135 -59
View File
@@ -1,85 +1,161 @@
# 试卷 —— 试卷与参考答案 LaTeX 模板 # 试卷
中国海洋大学期末考试**试卷**与**参考答案及评分标准**的 XeLaTeX 模板。 期末考试试卷 + 参考答案与评分标准,两套模板,A4 两栏。
两份模板均不含真题,题目与分值都是示意,按教学大纲替换即可。
## 编译
```bash
cd 试卷
xelatex 试卷题型示例.tex
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}, % 大题数量(成绩表按此栏数等分)
} }
``` ```
- `type` 与 `foottype` 互不影响:前者只管卷头,后者只管页脚。 | 参数 | 说明 |
原卷 A 卷页脚没印字母、B 卷印了 B,这是出卷人手工差异,不是规则。 |---|---|
- 大题数变了必须同步改 `nsec`,否则成绩表格子会错位。 | `year` | 学年 |
| `term` | 季学期 |
| `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 = {秋}, % 季学期
major = {××专业 \TNR{2024} 级}, course = {数字逻辑}, % 课程名称
teacher = {×××}, examiner = {×××}, type = {A}, % 试卷类型
mode = {闭卷、笔试}, total = {100}, dept = {计算机科学与技术学院},
college = {信息科学与工程学院},
major = {计算机科学与技术专业 \TNR{2023} 级},
teacher = {张远航}, % 任课教师
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` 之后。 ```
## 注意
示例内容为虚构题目,使用时全部替换。
+188 -40
View File
@@ -45,41 +45,146 @@
\AtBeginDocument{\linespread{1}\Fivhao\selectfont} \AtBeginDocument{\linespread{1}\Fivhao\selectfont}
%====================================================================== %======================================================================
% 2. 字体 % 2. 字体(全部统一为思源宋体)
% 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下)。 % 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下)。
% 旧版这里是 SimSun / SimHei / KaiTi / Times New Roman 四个系统字体,
% 换台机器(尤其 Linux/macOS)就编不出来,且都不能随仓库分发。
% %
% 对应关系: % ★ 本版把试卷的所有文字统一为**思源宋体(OUC Serif)**,中西文同一字族:
% 宋体正文 OUC Serif ← 思源宋体 SC 子集(真粗体,不再 AutoFakeBold) % 中文正文 / 标题 OUC Serif(真粗体,不再 AutoFakeBold)
% 黑体 OUC Sans ← 思源黑体 SC 子集 % 西文 / 阿拉伯数字 OUC Serif ✅ 与中文同族(本版改动)
% 楷体(卷头) OUC Kai ← 霞鹜文楷子集 % 卷头三行填空 OUC Serif ✅ 原为霞鹜文楷
% 西文/数字 TeX Gyre Termes(Times 度量兼容,见下) % 成绩表"题号/得分/一~八/总分" OUC Serif ✅ 原为霞鹜文楷
% %
% ⚠️ 关于原卷的"宋体西文": % ⚠️ 为什么西文也能用思源宋体
% 原卷正文 Mealy / RS / 2026 等实测每个 ASCII 字符步距恒为 5.28bp % 已实际OUCSerif-Regular.otf / -Bold.otf:13714 字形、cmap 7555 条,
% (= 0.500 em @10.5bp)且 font 名为 SimSun —— 即 Word 把西文设为 % ASCII 字母数字与常用标点 35/35 全部命中。它不是纯中文字体,
% 宋体时给出的"半角等宽"字形。SimSun 是全 ASCII 0.500 em 等宽的。 % 西文字形是配套设计的,与汉字同灰度 —— 这正是要的效果。
% %
% 这里改用 Termes,理由: % ⚠️⚠️ 与 Termes 的度量差异(换字体必然推动版面,别当回归)
% · Termes 的**数字**步距恰好也是 0.500 em,数字宽度零漂移; % 旧版西文用 TeX Gyre Termes(Times 度量)。原卷 SimSun 的西文是
% · 本卷所有数字本来就走 \TNR{} / \TNRB{}(已实测 PDF 里 SimSun % 全 ASCII 0.500 em 等宽,Termes 的数字也是 0.500 em,所以选它能让
% 只承担空格与极少数裸字母),换字体的实际影响面只有那几处; % 数字零漂移。思源宋体的西文**不是等宽**,比 Termes 宽:
% · 若要强行复刻 0.500 em 等宽只能上 Inconsolata 这类代码字体, % 数字 0-9 0.549~0.562 em (+0.049~+0.062)
% 放进试卷正文观感明显更差 —— 按需求"字体不合适再更换"的取舍, % 小写 m 0.974 vs 0.778 (+0.196,最明显)
% 宁可让裸西文用 Termes 的比例字形。 % 小写 b 0.638 vs 0.500 (+0.138)
% 实测结论见 README「字体」一节的 A/B 对比。 % 句点 . 0.327 vs 0.250 (+0.077)
% 连字符 - 0.346 vs 0.333 (+0.013)
% 影响:题号、分值、页码右移约 6%,题干里的英文单词变长。
%
% ⚠️ 装订线的 4 组连字符虚线已改为**用线画**(见第 6 节),
% 不再受字体宽度影响。旧版是靠 18bp 连字符排出来的,
% 换字体后每串会长 4~7bp,故锁定为几何坐标。
%
% ⚠️ 数学公式**不在统一范围内**(答案卷的 $x$、$\dfrac{}{}$ 等仍走
% Computer Modern)。理由:思源宋体没有 MATH 表(实际只有
% GSUB/GPOS),不能作数学字体;强行塞进正文字体会破坏斜体变量、
% 正体数字、运算符间距这些数学排版规则。用户已确认保持不动。
%====================================================================== %======================================================================
\input{../fonts.tex} \input{../fonts.tex}
% 试卷正文的宋体西文占位:原模板用 \sunfont 指 SimSun,现统一指 Termes。 %----------------------------------------------------------------------
% 西文字族:把思源宋体登记成一个**独立字族** \OUCLatinSerif
%
% 为什么不直接把 \tnr 改成 \setmainfont 指过去:
% ① ../fonts.tex 是**全库共用**的,改它的 \tnr 会连带改掉科技报告和
% 简历 —— 那两个模板有自己的西文设定(Cochineal / Termes),不该外溢。
% ② 试卷需要的是"西文也用宋体",这在排版上是**回到中文字体的西文字形**,
% 本质是让西文跟 CJK 主字体一致,而不是"换一套西文字体"。
% 所以在试卷包内单独登记一族,只改本包的命令指向。
%
% ⚠️ 用 \newfontfamily 而不是 \setCJKfamilyfont:这里要的是西文字族,
% 走 fontspec 的 Latin 通道;中文由 \setCJKmainfont 那边管,互不干扰。
% ⚠️ 四个档位必须全给。少给会在 \bfseries 里静默回落到默认字体,
% 表现为"加粗失效"而不是报错(试卷的 \TNRB / \qnum / 大题标题都会踩到)。
% ⚠️ 斜体档:思源宋体没有真正的意大利斜体(只有 Regular / Bold 两档)。
% 这里让 Italic 指回 Regular、BoldItalic 指回 Bold —— 即"中文式斜体"
% (不倾斜)。本模板正文没有 \textit / \emph 用法,此设定只是防止将来
% 有人用了就报 Font shape undefined。真要斜体请用 \kaiti 代斜的惯例。
%----------------------------------------------------------------------
\newfontfamily\OUCLatinSerif{OUCSerif}[
Extension = .otf,
Path = ../fonts/ouc-serif/,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-Regular,
BoldItalicFont = *-Bold,
]
% 粗体专职档:与 \tnrb 的语义一致("取粗体那一字形当常规用")。
% \TNRB{} 用它,保证括号、分值数字是真的粗,而不是靠 AutoFakeBold 描边。
\newfontfamily\OUCLatinSerifBold{OUCSerif}[
Extension = .otf,
Path = ../fonts/ouc-serif/,
UprightFont = *-Bold,
BoldFont = *-Bold,
ItalicFont = *-Bold,
BoldItalicFont = *-Bold,
]
%----------------------------------------------------------------------
% 把**默认西文字体**也换成思源宋体(这是关键一步)
%
% 模板里有大量文字**根本没走 \tnr**,而是走 \setmainfont(默认西文族):
% · \textbf{learning outcome} —— 裸加粗,西文走 \setmainfont
% · 页脚的页码 / 总页数 —— \node{...\thepage} 裸排
% · 任何 \fontsize..\selectfont 之后的裸 ASCII
% 第一轮只做了 \let\tnr\OUCLatinSerif,结果 PDF 里仍残留 22 个
% TeXGyreTermes span:页脚 6 个页码 + 6 个总页数 + 第 4 页的
% A./B./C./D. 与 learning outcome 等。
% ⇒ 必须连 \setmainfont 一起改,才算"全部用思源宋体"。
%
% ⚠️ 为什么可以安全地在这里 \setmainfont:
% 本包由试卷/答案卷各自的 .tex \usepackage 载入,\setmainfont 只影响
% 当前文档。其他模板(科技报告/简历/幻灯片)各自 \input ../fonts.tex
% 并各自设主字体,互不干扰。
%
% ⚠️ 四个档位必须全给。缺斜体档时 \textit 会报
% Font shape `TU/OUCSerif(0)/m/it' undefined 并静默回落。
% 思源宋体没有真斜体,这里让 it 指回 Regular(中文式斜体,不倾斜)。
%----------------------------------------------------------------------
\setmainfont{OUCSerif}[
Extension = .otf,
Path = ../fonts/ouc-serif/,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-Regular,
BoldItalicFont = *-Bold,
]
% sans 位也指到思源宋体:本试卷没有真正的 sans 用法,但 \textsf 之类的
% 兜底也应该是宋体,不能漏回 Termes。sans 位不加粗体档,用 Regular 顶上。
\setsansfont{OUCSerif}[
Extension = .otf,
Path = ../fonts/ouc-serif/,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-Regular,
BoldItalicFont = *-Bold,
]
%----------------------------------------------------------------------
% 把本包内的字体命令全部重定向到思源宋体
%
% ⚠️ \let 是一次性绑定:绑完再改 \tnr 的定义,\tnr 仍指旧目标。
% 这里 \let 到 \OUCLatinSerif 是**有意为之** —— 让 \tnr / \tnrb 与
% \setmainfont 走同一族,但保持两个独立命令名,因为 \tnrb 是
% "取粗体当常规用"(\TNRB 需要),与 \bfseries 语义不同。
%----------------------------------------------------------------------
\let\tnr\OUCLatinSerif
\let\tnrb\OUCLatinSerifBold
% \sunfont 原指 SimSun("宋体西文"占位),现一并指思源宋体。
% 保留命令名是为了不动 \qnum / \logicexpr / \sumsig 等所有调用点。 % 保留命令名是为了不动 \qnum / \logicexpr / \sumsig 等所有调用点。
\let\sunfont\tnr \let\sunfont\OUCLatinSerif
% \kaiti 在试卷里只用于卷头填空与成绩表题号(见 \kh / \scoretable)。
%为思源宋体,故整个包内把 \kaiti 也指到思源宋体。
% ⚠️ 用 \let 而不是改 \def\kaiti —— 后者会破坏 ../fonts.tex 的定义,
% 而 \kaiti 在别的模板里还要用楷体。
% ⚠️ 若将来要恢复楷体卷头,把下面这行注释掉即可,其余代码不用动。
\let\kaiti\songti
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% ⚠️ xeCJK 陷阱:字体切换命令若紧邻 \par(或位于段落末尾), % ⚠️ xeCJK 陷阱:字体切换命令若紧邻 \par(或位于段落末尾),
% 该段结束时的字体状态会"溢出"到后续段落,导致后面的 ASCII % 该段结束时的字体状态会"溢出"到后续段落,导致后面的 ASCII
% 字符全部被排成 Times(实测:\tnr{ABC}\par 会让下一段的 "3" 变 Times)。 % 字符全部被排成 Times(\tnr{ABC}\par 会让下一段的 "3" 变 Times)。
% 故所有局部字体切换一律走下面两个包装:内部显式 \normalfont 收尾。 % 故所有局部字体切换一律走下面两个包装:内部显式 \normalfont 收尾。
% ⇒ 正文中请用 \TNR{...} / \TNRB{...} / \SUN{...},不要裸用 \tnr。 % ⇒ 正文中请用 \TNR{...} / \TNRB{...} / \SUN{...},不要裸用 \tnr。
%---------------------------------------------------------------------- %----------------------------------------------------------------------
@@ -98,7 +203,7 @@
\def\@spreadeach#1{% \def\@spreadeach#1{%
\ifx#1\@nil\else\hspace*{\spread@amt}#1\expandafter\@spreadeach\fi} \ifx#1\@nil\else\hspace*{\spread@amt}#1\expandafter\@spreadeach\fi}
% 中文与西文间自动间距:原卷实测固定 2.70bp(不随字号缩放, % 中文与西文间自动间距:原卷实际固定 2.70bp(不随字号缩放,
% 故用绝对 bp 而非 em;原卷 10.5bp 与 12bp 处均为 2.7bp) % 故用绝对 bp 而非 em;原卷 10.5bp 与 12bp 处均为 2.7bp)
\xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain} \xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain}
@@ -131,7 +236,7 @@
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% 页脚是否印"试卷类型字母"(课程名之后那个 A / B) % 页脚是否印"试卷类型字母"(课程名之后那个 A / B)
% %
% ★ 原卷实测:A 卷页脚【没有】字母(数字逻辑 + 一串短横线), % ★ 原卷A 卷页脚【没有】字母(数字逻辑 + 一串短横线),
% B 卷页脚【有】B(392.48 处)。 % B 卷页脚【有】B(392.48 处)。
% 即:这是出卷人手工敲的,不是规则。故默认不印,需要时显式打开: % 即:这是出卷人手工敲的,不是规则。故默认不印,需要时显式打开:
% \examsetup{foottype = {B}} → 页脚印 B % \examsetup{foottype = {B}} → 页脚印 B
@@ -143,7 +248,7 @@
%====================================================================== %======================================================================
% 5. 页脚:+…………………………课程名称 X……… 第 N 页 共 M 页 + 基线 713.33bp % 5. 页脚:+…………………………课程名称 X……… 第 N 页 共 M 页 + 基线 713.33bp
% %
% 本地实测(原卷字符级): % 本地(原卷字符级):
% 82.20 '+' | 91.20~343.20 连续 29 个 '…'(每个步距 9.00) % 82.20 '+' | 91.20~343.20 连续 29 个 '…'(每个步距 9.00)
% 352.20 起课程名(长度不定)| 类型字母在 390.48 % 352.20 起课程名(长度不定)| 类型字母在 390.48
% 396.48 起 3 个 '…' | 432.48 '第' | 443.64 页码 | 448.20 '页' % 396.48 起 3 个 '…' | 432.48 '第' | 443.64 页码 | 448.20 '页'
@@ -254,7 +359,7 @@
% \bindstrip[1.3,on] → 强制画 + 下移 % \bindstrip[1.3,on] → 强制画 + 下移
% 局部覆盖单页:\ouc@bindforce 置 1/0 % 局部覆盖单页:\ouc@bindforce 置 1/0
% %
% 本地实测(原卷 p1,x 坐标全部 bp): % 本地(原卷 p1,x 坐标全部 bp):
% 竖虚线 x=33.8,5 段:101.1~148.5 / 222.4~290.8 / 359.4~427.9 % 竖虚线 x=33.8,5 段:101.1~148.5 / 222.4~290.8 / 359.4~427.9
% 489.3~557.8 / 600.0~668.6 % 489.3~557.8 / 600.0~668.6
% 18bp Times 连字符串 x=55.69("装/订/线"三字压在上面,白底遮断) % 18bp Times 连字符串 x=55.69("装/订/线"三字压在上面,白底遮断)
@@ -284,12 +389,47 @@
\ifx\@empty#1\@empty\else \setlength{\ouc@bindshift}{#1bp}\fi \ifx\@empty#1\@empty\else \setlength{\ouc@bindshift}{#1bp}\fi
\fi} \fi}
%----------------------------------------------------------------------
% 装订线虚线段:一个连字符笔画 = 一条**竖直**短线段
%
% 参数:#1 = 这一串最上一笔的顶端 y 坐标(bp,从页面顶端往下量)
% #2 = 笔画个数
% 相邻笔画顶端间隔 6.00bp,与原卷 18bp 连字符的步距一致。
%
% 原卷的连字符是 rotate=90 排的,所以连字符的**横向长度转到了纵轴**、
% **线粗转到了横轴**。也就是说每一笔是「竖着的短杠」,不是「横着的短杠」:
% 竖:y 跨 4.30bp(这是连字符的字面长度)
% 横:x 跨 1.10bp(这是连字符的笔画粗细)
% 中心 x = 51.60bp
% 第一版按"水平线"画((49.40,y)--(53.70,y)),结果整条装订线变成
% 一把**梯子**(一排横杠叠在竖线位置),与基线观感完全不同。
%
% ⚠️ x 中心 51.60bp 是原卷连字符字符盒 x 41.60~59.60(18bp 宽),
% 但可见笔画只在 51.10~52.10,即字形在字符盒内偏右、
% 中心 51.60 —— 这是 Times 连字符的字形位置,不是笔误。
%
% ⚠️ 必须定义在 \ouc@dobindstrip **外面**。放进去的话每次 shipout 都会
% 重新 \newcommand 一次,第二页起报 "command already defined"。
% ⚠️ y 坐标**不能**写成 \dimexpr#1bp+\i*6bp:TikZ 的坐标解析器不认
% 带小数点的小数 + \dimexpr 组合,会报
% Illegal unit of measure (pt inserted)
% Package PGF Math Error: Unknown operator `.' or `.0'
% 必须先 \pgfmathsetmacro 算成纯数字,再拼 "bp"。
%----------------------------------------------------------------------
\newcommand{\ouc@dashseg}[2]{%
\foreach \i in {0,...,\the\numexpr#2-1\relax}{%
\pgfmathsetmacro{\ouc@dyy}{#1+\i*6.00}%
\pgfmathsetmacro{\ouc@dzz}{\ouc@dyy+4.30}%
\draw[line width=1.10bp,line cap=butt]
([xshift=51.60bp,yshift=-\ouc@dyy bp]B) --
([xshift=51.60bp,yshift=-\ouc@dzz bp]B);}}
\newcommand{\ouc@dobindstrip}{% \newcommand{\ouc@dobindstrip}{%
\begin{tikzpicture}[remember picture,overlay] \begin{tikzpicture}[remember picture,overlay]
\coordinate (B) at ([yshift=-\ouc@bindshift]current page.north west); \coordinate (B) at ([yshift=-\ouc@bindshift]current page.north west);
% ---- ★ 原卷此处【没有】外框 ---- % ---- ★ 原卷此处【没有】外框 ----
% 曾误把 PDF 里 x=17.4/18.12/60.15/60.87 那组线当成黑色外框, % 曾误把 PDF 里 x=17.4/18.12/60.15/60.87 那组线当成黑色外框,
% 实测它们是 fill=(1,1,1) 的**白色遮挡块**(Word 里盖住页眉页脚 % 实际它们是 fill=(1,1,1) 的**白色遮挡块**(Word 里盖住页眉页脚
% 的底色块),可见黑线只有 x=33.80 那 6 段竖虚线。 % 的底色块),可见黑线只有 x=33.80 那 6 段竖虚线。
% 故此处不画任何竖线/封口线。 % 故此处不画任何竖线/封口线。
% ---- 竖虚线:每段 = 对应栏目的"填写区"(紧接栏目名冒号之后,向上延伸)---- % ---- 竖虚线:每段 = 对应栏目的"填写区"(紧接栏目名冒号之后,向上延伸)----
@@ -305,15 +445,23 @@
359.35/427.85, 489.30/557.80, 600.05/668.60}{% 359.35/427.85, 489.30/557.80, 600.05/668.60}{%
\draw[line width=0.48bp,line cap=butt] \draw[line width=0.48bp,line cap=butt]
([xshift=33.8bp,yshift=-\a bp]B) -- ([xshift=33.8bp,yshift=-\b bp]B);} ([xshift=33.8bp,yshift=-\a bp]B) -- ([xshift=33.8bp,yshift=-\b bp]B);}
% ---- 虚线段(原卷用 18bp Times 连字符排成,不是画线)---- % ---- 虚线段(由「18bp 连字符排成」改为「用线画」)----
% 四段的连字符个数原卷各不相同(16 / 30 / 28 / 24),逐段复刻 % 原卷这四段确实是 18bp Times 连字符排出来的,但本包把试卷字体
\foreach \s/\pos in {----------------/677.32, % 统一到思源宋体之后,连字符每个宽 0.346 em(Termes 是 0.333),
---------------- -------------/571.00, % 18bp 下每串会长出 4~7bp,正好破坏"复刻原卷长度"这个前提。
--- ------------------------/382.12, % ⇒ 改为几何画的短横线段,长度锁死在 \ouc@dashseg 的坐标里,
------------------------/205.36}{% % 不受任何字体宽度影响。
\node[anchor=base west,rotate=90,inner sep=0pt, % 实际原卷(720dpi 渲染后逐笔画测量):
font=\fontsize{18bp}{18bp}\selectfont\tnr] % 单个连字符笔画 长 4.40bp、粗 1.10bp、x 中心 51.60bp
at ([xshift=55.69bp,yshift=-\pos bp]B) {\s};} % → 左 49.40bp、右 53.80bp
% 相邻笔画步距 6.00bp(= 18bp × 0.333 em)
% 六段坐标与笔画数取自原卷逐笔画实际,见下方调用处。
\ouc@dashseg{62.20}{24}% 最下一串(座号区)
\ouc@dashseg{216.50}{24}% 考场教室号区
\ouc@dashseg{364.80}{3}% 截断的短线(原卷被白底遮断,照抄)
\ouc@dashseg{393.40}{13}% 授课教师区(上半截)
\ouc@dashseg{475.80}{16}% 专业年级区
\ouc@dashseg{582.10}{16}% 学号 + 姓名区(最上一串)
% ---- 竖排栏目名(自下而上读)---- % ---- 竖排栏目名(自下而上读)----
% 原卷只有"姓名:""授课教师:"把冒号连排,其余冒号单独一行 % 原卷只有"姓名:""授课教师:"把冒号连排,其余冒号单独一行
\foreach \lab/\pos in {学号/694.06, 姓名:/585.10, 专业年级/474.46, \foreach \lab/\pos in {学号/694.06, 姓名:/585.10, 专业年级/474.46,
@@ -510,7 +658,7 @@
\newcommand{\examfigcaption}[1]{% \newcommand{\examfigcaption}[1]{%
\par\nointerlineskip\centerline{\Xiaowu #1}\par\nointerlineskip} \par\nointerlineskip\centerline{\Xiaowu #1}\par\nointerlineskip}
% 图题(五号):原卷第 3 页 "图3" 实测 10.45bp % 图题(五号):原卷第 3 页 "图3" 实际10.45bp
\newcommand{\examfigcaptioniii}[1]{% \newcommand{\examfigcaptioniii}[1]{%
\par\nointerlineskip\centerline{\Fivhao #1}\par\nointerlineskip\vspace*{5.40bp}} \par\nointerlineskip\centerline{\Fivhao #1}\par\nointerlineskip\vspace*{5.40bp}}
@@ -533,7 +681,7 @@
\newcommand{\sumphisig}{\hbox{\sunfont ∑Φ}} \newcommand{\sumphisig}{\hbox{\sunfont ∑Φ}}
% 下标(原卷 M_L / M_S) % 下标(原卷 M_L / M_S)
% 实测:L/S 字号 5.30bp(SimSun),基线相对正文下移 1.56bp; % L/S 字号 5.30bp(SimSun),基线相对正文下移 1.56bp;
% M(210.00) → L(215.16) 步距 5.16bp(M 的半角宽), % M(210.00) → L(215.16) 步距 5.16bp(M 的半角宽),
% L → 和 3.96bp,故 M 起点到"和"共 9.12bp。 % L → 和 3.96bp,故 M 起点到"和"共 9.12bp。
% 用宽度 3.87bp 的盒接管下标宽度,使 5.25 + 3.87 = 9.12 对齐原卷。 % 用宽度 3.87bp 的盒接管下标宽度,使 5.25 + 3.87 = 9.12 对齐原卷。
@@ -543,7 +691,7 @@
%====================================================================== %======================================================================
% 10. 题型构件(通用) % 10. 题型构件(通用)
% 设计原则:不依赖任何具体课程,只提供"骨架", % 设计原则:不依赖任何具体课程,只提供"骨架",
% 题目内容由正文填写。所有题型都沿用本卷实测的版面参数: % 题目内容由正文填写。所有题型都沿用本卷实际的版面参数:
% · 正文 10.5bp / 行距 15.6bp % · 正文 10.5bp / 行距 15.6bp
% · 中英之间 2.70bp(ecglue) % · 中英之间 2.70bp(ecglue)
% · 题号栏 15.72bp(宋体题号,题号后空 5.28bp) % · 题号栏 15.72bp(宋体题号,题号后空 5.28bp)
+241 -39
View File
@@ -59,20 +59,142 @@
\pagestyle{empty} \pagestyle{empty}
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% 字体(与 oucexam.sty 保持一致,全部取自公共字体包 ../fonts.tex) % 字体(与 oucexam.sty 同步,全部统一为思源宋体)
% 全部取自公共字体包 ../fonts.tex,再在包内重定向。
%
% ⚠️ 必须和 oucexam.sty 做**完全相同的处理**,否则两份文件观感不一致:
% oucexam 是试卷、ouckey 是答案卷,学校通常一起印发。
%
% ⚠️⚠️ 只重定向 \tnr / \tnrb 不够 —— 模板里大量文字没走它们:
% · \textbf{...} 的裸西文 → 走 \setmainfont
% · 「(4 分)」里的数字 → 走 \setmainfont
% · \thepage / \pageref 页码 → 走 \setmainfont
% ⇒ 必须连 \setmainfont 一起改,否则 PDF 里会残留 Termes span。
% 实际第一轮只做 \let 时,答案卷残留 197 个 Termes span。
%
% ⚠️ 数学公式($x$ / $\dfrac{}{}$ / $\sum$)**不在统一范围内**,
% 仍走 Computer Modern。原因见 oucexam.sty 的说明:思源宋体没有
% MATH 表,不能作数学字体。用户已确认保持不动。
%---------------------------------------------------------------------- %----------------------------------------------------------------------
\input{../fonts.tex} \input{../fonts.tex}
% \sunfont 原指 SimSun,现统一指 Termes(见 oucexam.sty 的说明) %----------------------------------------------------------------------
\let\sunfont\tnr % 西文字族:思源宋体(与 oucexam.sty 同一套定义,复制而非 \input,
% 因为两个 .sty 是并列关系,谁先加载不确定,不能互相依赖)
%----------------------------------------------------------------------
\newfontfamily\OUCLatinSerif{OUCSerif}[
Extension = .otf,
Path = ../fonts/ouc-serif/,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-Regular,
BoldItalicFont = *-Bold,
]
\newfontfamily\OUCLatinSerifBold{OUCSerif}[
Extension = .otf,
Path = ../fonts/ouc-serif/,
UprightFont = *-Bold,
BoldFont = *-Bold,
ItalicFont = *-Bold,
BoldItalicFont = *-Bold,
]
% 默认西文字体 → 思源宋体(这一步不能省,见上面的说明)
\setmainfont{OUCSerif}[
Extension = .otf,
Path = ../fonts/ouc-serif/,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-Regular,
BoldItalicFont = *-Bold,
]
\setsansfont{OUCSerif}[
Extension = .otf,
Path = ../fonts/ouc-serif/,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-Regular,
BoldItalicFont = *-Bold,
]
% \sunfont 原指 SimSun,现统一指思源宋体
\let\sunfont\OUCLatinSerif
\let\tnr\OUCLatinSerif
\let\tnrb\OUCLatinSerifBold
% 答案卷里的黑体小标题(\heiti,共 37 处)一并换成思源宋体。
% ⚠️ 用 \let 而非改 \def\heiti —— 后者会破坏 ../fonts.tex,影响别的模板。
% ⚠️ 若将来要恢复黑体标题,注释掉下面这行即可。
\let\heiti\songti
% 局部字体切换必须显式收尾,否则 xeCJK 字体会"溢出"到后一段 % 局部字体切换必须显式收尾,否则 xeCJK 字体会"溢出"到后一段
\newcommand{\TNR}[1]{{\tnr #1\normalfont}} \newcommand{\TNR}[1]{{\tnr #1\normalfont}}
\newcommand{\TNRB}[1]{{\tnrb #1\normalfont}} \newcommand{\TNRB}[1]{{\tnrb #1\normalfont}}
\newcommand{\SUN}[1]{{\sunfont #1\normalfont}} \newcommand{\SUN}[1]{{\sunfont #1\normalfont}}
% 中西文间距 2.70bp(原卷取值,不随字号缩放)。
\xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain} \xeCJKsetup{CJKecglue={\hskip 2.70bp\relax},PunctStyle=plain}
%----------------------------------------------------------------------
% 直引号 " (U+0022) 归入 CJK 字符类(补充修正)
%
% ⚠️ 问题:本文件正文用 ASCII 直引号 "" 表示中文引号(共 32 处),
% 而 xeCJK 按 Unicode 区段分类 —— U+0022 在 Basic Latin,被判成**西文**,
% 于是引号走 \setmainfont(原为 Termes),与两侧汉字不同字体、不同宽度。
% 换字体后表现为一行里出现 TeXGyreTermes-Regular 的 ",且因为西文引号
% 比中文引号窄、字距算法不同,挤压出 Overfull(实际第 88 行 +8.07pt)。
%
% ⚠️ 为什么不在 fonts.tex 里改:那里是**全库共用**的,把 U+0022 全局归 CJK
% 会让正文里真正的英文引号(如 code 片段 "hello world")也变成全角,
% 破坏那些地方。这是试卷的局部需求 —— 试卷正文基本是中文,直引号就是
% 中文引号的意思。
% ⚠️ 必须在 \input{../fonts.tex} **之后**声明,否则被随后加载的默认分类覆盖。
%----------------------------------------------------------------------
\xeCJKDeclareCharClass{CJK}{"0022} % " 直引号(当中文引号用)
%----------------------------------------------------------------------
% 【技术说明】换字体引起的 Overfull 怎么修(结论:改源码断行,别调参数)
%
% 现象:字体统一为思源宋体后,参考答案与评分标准示例.tex 第 123-125 行
% (\keyitem{3}{4})出现 Overfull 2.61pt,渲染后压出版心右边界
% (最右墨迹 527.01bp,版心止于 524.41bp)。
% 基线同一行本来就有 0.21pt 轻微 Overfull,换字体后西文变宽
% (数字 +6%、小写字母 +13~20%),把 0.21 放大到 2.61。
%
% 根因:该行末尾是「…正迁移与负迁移(1 分),」。
% · 「,」按中文标点禁则不能出现在行首 ⇒ 不许在「)」与「,」之间断
% · \pt 定义里有 `~`(\nobreakspace)⇒ 「(1 分)」内部也不可断
% ⇒ 「(1 分),」约 16bp,是不可断尾部,必须整体塞进本行。
% 而本行没有弹性胶可拉(汉字定宽、唯一的西文空格已满),
% 往前找更早的合法断点(句号「。」之后)的话,第一行只填 65%,
% 欠宽 150bp 无处拉伸 ⇒ badness 爆掉 ⇒ TeX 宁可撑破 2.61bp。
%
% ① \emergencystretch 1.5em —— 无效。只追加"可拉伸量",
% 本行没有胶可拉,给多少额度都无从施展。
% ② \tolerance 3000 —— 无效。不是不满意断点,是没有更早的**合法**断点。
% ③ PunctStyle=kaiming —— 能消 Overfull,但句末标点悬挂探出版心
% 6.5bp(第 3 页右缘 530.93 > 524.41),比不修更难看。
% ④ PunctStyle=quanjiao —— 同样探出 8bp(532.5),一样不可接受。
% 根子在于 xeCJK 的这几个 PunctStyle 做的是"行末标点**悬挂**",
% 不是"标点**压缩**"—— 中文排版里这是两回事,指望它消 Overfull 必翻车。
% ⑤ \rightskip 0pt plus 6bp(含 \AtBeginDocument 版)—— 无效。
% 6bp 远小于需要的 150bp,TeX 仍选"撑破"这个解。
% 注意:preamble 里直接 \setlength 还会被 ctex/xeCJK 初始化重置,
% 必须 \AtBeginDocument 才可能生效 —— 这类"设了没反应"的常见原因。
%
% ✅ 正解:**在源码的自然断点处手动断行**。
% 第 124 行末尾句号「。」之后本来就是语义上的句子边界,加 \\ 即可:
% \keyitem{3}{4}{%
% \textbf{学习迁移}:指一种学习对另一种学习的影响\pt{2}。\\
% 按方向分正迁移与负迁移\pt{1},其发生依赖于共同要素与概括水平\pt{1}。}
% 已Overfull 归零,三页最右墨迹均为 524.41bp,与版心严丝合缝。
%
% 为什么这是对的做法而不是"绕过问题":
% 分项给分的答案本来就该一句一行,读者(阅卷人)靠句号扫分点。
% 手动断行既解决排版,又让内容结构更清楚 —— 不是妥协,是双赢。
% ⚠️ 若将来修改了这段文字导致又不齐,先看这里:多半还是在句号处补 \\。
%----------------------------------------------------------------------
\newcommand{\Fivhao}{\fontsize{10.5bp}{16bp}\selectfont} \newcommand{\Fivhao}{\fontsize{10.5bp}{16bp}\selectfont}
\newcommand{\Sihao}{\fontsize{12bp}{18bp}\selectfont} \newcommand{\Sihao}{\fontsize{12bp}{18bp}\selectfont}
\newcommand{\Xiaowu}{\fontsize{9bp}{13bp}\selectfont} \newcommand{\Xiaowu}{\fontsize{9bp}{13bp}\selectfont}
@@ -87,22 +209,65 @@
\def\ouckey@major{}\def\ouckey@dept{}\def\ouckey@teacher{} \def\ouckey@major{}\def\ouckey@dept{}\def\ouckey@teacher{}
\def\ouckey@examiner{}\def\ouckey@mode{}\def\ouckey@date{} \def\ouckey@examiner{}\def\ouckey@mode{}\def\ouckey@date{}
\def\ouckey@total{} \def\ouckey@total{}
\define@key{ouckey}{year}{\def\ouckey@year{#1}}
\define@key{ouckey}{term}{\def\ouckey@term{#1}} %----------------------------------------------------------------------
\define@key{ouckey}{course}{\def\ouckey@course{#1}} % key 赋值:空值规范成空串
\define@key{ouckey}{type}{\def\ouckey@type{#1}} %
\define@key{ouckey}{college}{\def\ouckey@college{#1}} % ⚠️ 所有 key 一律走这里,不要退回 `\def\ouckey@xxx{#1}`。
\define@key{ouckey}{grade}{\def\ouckey@grade{#1}} % 原因见文件下方「判空」一节的完整说明:那样 dept={} 会存成
\define@key{ouckey}{major}{\def\ouckey@major{#1}} % 「一个空组」,后续 \detokenize 展开后仍非空,判空失败,
\define@key{ouckey}{dept}{\def\ouckey@dept{#1}} % 抬头会印出孤立的「开课学院:」而没有值。
\define@key{ouckey}{teacher}{\def\ouckey@teacher{#1}} %
\define@key{ouckey}{examiner}{\def\ouckey@examiner{#1}} % ⚠️ 必须定义在 \define@key 之**前**,否则展开时 undefined。
\define@key{ouckey}{mode}{\def\ouckey@mode{#1}} %----------------------------------------------------------------------
\define@key{ouckey}{date}{\def\ouckey@date{#1}} \newcommand{\ouckey@setkey}[2]{%
\define@key{ouckey}{total}{\def\ouckey@total{#1}} \if\relax\detokenize{#2}\relax
\def#1{}%
\else
\def#1{#2}%
\fi}
% 所有 key 一律走 \ouckey@setkey
\define@key{ouckey}{year}{\ouckey@setkey{\ouckey@year}{#1}}
\define@key{ouckey}{term}{\ouckey@setkey{\ouckey@term}{#1}}
\define@key{ouckey}{course}{\ouckey@setkey{\ouckey@course}{#1}}
\define@key{ouckey}{type}{\ouckey@setkey{\ouckey@type}{#1}}
\define@key{ouckey}{college}{\ouckey@setkey{\ouckey@college}{#1}}
\define@key{ouckey}{grade}{\ouckey@setkey{\ouckey@grade}{#1}}
\define@key{ouckey}{major}{\ouckey@setkey{\ouckey@major}{#1}}
\define@key{ouckey}{dept}{\ouckey@setkey{\ouckey@dept}{#1}}
\define@key{ouckey}{teacher}{\ouckey@setkey{\ouckey@teacher}{#1}}
\define@key{ouckey}{examiner}{\ouckey@setkey{\ouckey@examiner}{#1}}
\define@key{ouckey}{mode}{\ouckey@setkey{\ouckey@mode}{#1}}
\define@key{ouckey}{date}{\ouckey@setkey{\ouckey@date}{#1}}
\define@key{ouckey}{total}{\ouckey@setkey{\ouckey@total}{#1}}
\newcommand{\keysetup}[1]{\setkeys{ouckey}{#1}} \newcommand{\keysetup}[1]{\setkeys{ouckey}{#1}}
% 判空:\ifx 比不了多 token 参数,用 \detokenize 展成字符串再比 %----------------------------------------------------------------------
% 判空(修正:原实现有真 bug)
%
% ⚠️⚠️ 旧实现的坑
% 旧代码是
% \newcommand{\ouckey@ifempty}[1]{%
% \if\relax\detokenize{#1}\relax ... }
% 调用处写 `\ouckey@ifempty{\ouckey@dept}{空}{非空}`。
% **\detokenize 不展开参数** —— 它看到的是字符串 `\ouckey@dept`
% (宏名本身),永远非空 ⇒ 判空永远失败。
% 后果:`dept = {}` 时抬头仍印出孤立的「开课学院:」,后面没有值。
% 这是旧版就有的 bug(三格布局下不明显)。
%
% 为什么不在宏里修
% 试过「先 \edef 展开再 \detokenize」的版本,会报
% ! Incomplete \iffalse; all text was ignored after line 49.
% 因为 \if...\else...\fi 被 \expandafter 链打散,TeX 匹配 \fi 时错位。
% 这类宏层展开的修补很脆,不值得。
%
% ✅ 正确做法:**在 \define@key 里就把空值规范化**(见文件上方
% \ouckey@setkey)。空值存成真正的空串,判空就能工作。
%
% ⚠️ 这里只留判空宏本身。它拿到的是**已经规范化过的值**
% (`\ouckey@dept` 展开后就是纯文本),所以 \detokenize 有效。
%----------------------------------------------------------------------
\newcommand{\ouckey@ifempty}[1]{% \newcommand{\ouckey@ifempty}[1]{%
\if\relax\detokenize{#1}\relax \if\relax\detokenize{#1}\relax
\expandafter\@firstoftwo \expandafter\@firstoftwo
@@ -110,15 +275,45 @@
\expandafter\@secondoftwo \expandafter\@secondoftwo
\fi} \fi}
% 一格信息:标签加粗,值用宋体;值为空则整格不出 %----------------------------------------------------------------------
\newcommand{\ouckey@cell}[2]{% % 一项信息:标签加粗 + 值,**独占一行**
\ouckey@ifempty{#2}{}{\textbf{#1:}#2}} %
% 一行三格,等宽 % ⚠️⚠️ 为什么从"一行三格"改成"一行一项"
\newcommand{\ouckey@inforow}[6]{% %
\par\noindent % 旧实现是三个 \makebox[0.3333\linewidth][l] 并排:
\makebox[0.3333\linewidth][l]{\ouckey@cell{#1}{#2}}% % \makebox[固定宽][l]{内容}
\makebox[0.3333\linewidth][l]{\ouckey@cell{#3}{#4}}% % \makebox 是**不可断的盒子**,行为是:
\makebox[0.3333\linewidth][l]{\ouckey@cell{#5}{#6}}\par} % · 内容比盒宽短 → 左对齐,右侧留白(正常)
% · 内容比盒宽长 → **直接溢出盒外,压到右边一格上**(就是 bug)
% · 盒内中文**不能换行**(LR 模式,不做段落断行)
% 所以三格布局对短字段友好,对长字段必然重叠。
%
% 把 dept 填成
% 计算机科学与技术学院(人工智能与大数据技术方向实验班)
% 后,读取
% 开课学院:(70.87~123.37) 值:(123.37~406.87)
% 而第二格「课程名称」本该从 216.0 开始 ⇒ **重叠 190.87bp**,
% 把「课程名称 / 试卷类型」整个压住。
%
% ⚠️ **编译完全不报错,也没有 Overfull 警告**(rc=0 over=0)。
% \makebox 内容溢出盒外时 TeX 不认为是"坏行"。
% ⇒ 这类 bug 只能靠看渲染结果或量 span 坐标发现,看日志发现不了。
%
% 现在的做法:每项 `\par\noindent\textbf{标签:}值\par`,普通段落。
% · 超长自动换行(中文可在任意汉字间断行)
% · 不存在并排,也就不存在互相压住
% · 抬头是"查阅"性质,一项一行比三格更容易扫读
% 代价:抬头从 3 行变 9 行,多占约 6 行。答案卷 A4、内容不满页,
% 多 6 行不影响版面。
%
% ⚠️ 留空的项仍**整项不印**(也不留空行),逻辑不变。
%----------------------------------------------------------------------
\newcommand{\ouckey@inforow}[2]{%
\ouckey@ifempty{#2}{}{%
% 行距收紧到 15bp(\Fivhao 的基线距是 16bp)。抬头是"查阅"信息,
% 不需要正文那种行距;9 行 × 省 5.8bp ≈ 省 52bp,将近 3 行正文。
{\fontsize{10.5bp}{15bp}\selectfont
\par\noindent\textbf{#1:}#2\par}}}
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% 抬头:标题 + 信息栏 + 一条分隔线 % 抬头:标题 + 信息栏 + 一条分隔线
@@ -140,15 +335,18 @@
\vspace*{10bp} \vspace*{10bp}
\hrule height 1.2bp \hrule height 1.2bp
\vspace*{8bp} \vspace*{8bp}
\ouckey@inforow{开课学院}{\ouckey@dept}% % 每项一行。顺序按"读者关心程度"排:
{课程名称}{\ouckey@course}% % 先课程、后学院、再人与考试形式,最后分值。
{试卷类型}{\ouckey@ifempty{\ouckey@type}{}{\ouckey@type~卷}} % 留空的自动跳过,所以实际行数随填写项变化。
\ouckey@inforow{学生学院}{\ouckey@college}% \ouckey@inforow{课程名称}{\ouckey@course}
{年级专业}{\ouckey@major}% \ouckey@inforow{开课学院}{\ouckey@dept}
{考试方式}{\ouckey@mode} \ouckey@inforow{学生学院}{\ouckey@college}
\ouckey@inforow{任课教师}{\ouckey@teacher}% \ouckey@inforow{年级专业}{\ouckey@major}
{命题人}{\ouckey@examiner}% \ouckey@inforow{试卷类型}{\ouckey@ifempty{\ouckey@type}{}{\ouckey@type~卷}}
{满分}{\ouckey@ifempty{\ouckey@total}{}{\TNR{\ouckey@total}~分}} \ouckey@inforow{考试方式}{\ouckey@mode}
\ouckey@inforow{任课教师}{\ouckey@teacher}
\ouckey@inforow{命题人}{\ouckey@examiner}
\ouckey@inforow{满分}{\ouckey@ifempty{\ouckey@total}{}{\TNR{\ouckey@total}~分}}
% ★ 抬头【不印考试日期】。 % ★ 抬头【不印考试日期】。
% date 这个键仍保留(老文件写了 date= 不会报 unknown key), % date 这个键仍保留(老文件写了 date= 不会报 unknown key),
% 但不再渲染,对话框里也不显示,避免抬头行数随日期有无而浮动。 % 但不再渲染,对话框里也不显示,避免抬头行数随日期有无而浮动。
@@ -161,6 +359,11 @@
% \pt{2} → 「(2 分)」——嵌在答案文字中间,标"这一点值 2 分" % \pt{2} → 「(2 分)」——嵌在答案文字中间,标"这一点值 2 分"
% \ptline{2}{要点} → 要点靠左、分值靠右对齐(长要点更清爽) % \ptline{2}{要点} → 要点靠左、分值靠右对齐(长要点更清爽)
%====================================================================== %======================================================================
% 分值标注「(X 分)」。
% ⚠️ 里面用 `~`(\nobreakspace)是**有意为之** —— 不让「X」和「分」
% 分处两行,否则会看到「(1」在行末、「分)」在下一行,很难看。
% 代价是「(X 分)」成了不可断的整体,极端行宽下会撑破版心。
% ⇒ 这个代价接受,解决办法是在**源码的句子边界手动断行**,
\newcommand{\pt}[1]{{\small(\TNR{#1}~分)}} \newcommand{\pt}[1]{{\small(\TNR{#1}~分)}}
\newcommand{\ptline}[2]{% \newcommand{\ptline}[2]{%
\par\noindent #2\unskip\par\nobreak \par\noindent #2\unskip\par\nobreak
@@ -188,7 +391,7 @@
\addvspace{5bp}} \addvspace{5bp}}
\newcommand{\keysectionfree}[3]{% \newcommand{\keysectionfree}[3]{%
\par\addvspace{10bp}% \par\addvspace{10bp}%
{\Sihao\heiti #1、#2(#3)\par}% {\Sihao\heiti #1、#2\par}%
\addvspace{5bp}} \addvspace{5bp}}
%====================================================================== %======================================================================
@@ -197,7 +400,7 @@
% \objkeys[5]{...} → 每行 5 个 % \objkeys[5]{...} → 每行 5 个
% 答案串逗号分隔;题号自动递增。 % 答案串逗号分隔;题号自动递增。
% %
% ★ 这个宏反复改过很多次,下面几条是实测结论,动之前先看清: % ★ 这个宏反复改过很多次,下面几条是实际结论,动之前先看清:
% %
% 【不能用 \par 分行】 % 【不能用 \par 分行】
% 在 \@for 循环体里写 "\hbox to \textwidth{...}\par\noindent", % 在 \@for 循环体里写 "\hbox to \textwidth{...}\par\noindent",
@@ -208,7 +411,7 @@
% 【不能用 \unvbox + \prevdepth 思路】 % 【不能用 \unvbox + \prevdepth 思路】
% \unvbox 执行完寄存器即被清空,紧跟的 \ifdim\ht...>0pt 恒为假; % \unvbox 执行完寄存器即被清空,紧跟的 \ifdim\ht...>0pt 恒为假;
% 而且 \unvbox 后 TeX 把 \prevdepth 设成 -1000pt 抑制行间胶水, % 而且 \unvbox 后 TeX 把 \prevdepth 设成 -1000pt 抑制行间胶水,
% 各行会叠在一起(实测间距只有一个行高)。 % 各行会叠在一起(实际间距只有一个行高)。
% %
% 【不能用 \makebox[<变宽>]】 % 【不能用 \makebox[<变宽>]】
% 在 \@for 循环里 \makebox[\dimexpr\textwidth/\perrow\relax] 或 % 在 \@for 循环里 \makebox[\dimexpr\textwidth/\perrow\relax] 或
@@ -327,7 +530,6 @@
\newcount\ouckey@sum \newcount\ouckey@sum
\newcount\ouckey@cnt \newcount\ouckey@cnt
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% ★ 这里踩过三个坑,都记下:
% %
% 坑1 \edef\head{\head&...} 自引用 → 无限展开,parameter stack 爆掉。 % 坑1 \edef\head{\head&...} 自引用 → 无限展开,parameter stack 爆掉。
% 坑2 \g@addto@macro / \toks 存 token 序列 → 存进去的是 \ouckey@cur % 坑2 \g@addto@macro / \toks 存 token 序列 → 存进去的是 \ouckey@cur
Binary file not shown.
+7 -7
View File
@@ -33,13 +33,13 @@
\keysetup{ \keysetup{
year = {2025}, year = {2025},
term = {秋}, term = {秋},
course = {课程名称}, course = {数字逻辑},
type = {A}, type = {A},
dept = {××学院}, dept = {计算机科学与技术学院},
college = {××学院}, college = {信息科学与工程学院},
major = {××专业 \TNR{2024} 级}, major = {计算机科学与技术专业 \TNR{2023} 级},
teacher = {×××}, teacher = {张远航},
examiner = {×××}, examiner = {张远航},
mode = {闭卷、笔试}, mode = {闭卷、笔试},
total = {100}, total = {100},
} }
@@ -121,7 +121,7 @@
作业批改等方式实施\pt{1}。} 作业批改等方式实施\pt{1}。}
\keyitem{3}{4}{% \keyitem{3}{4}{%
\textbf{学习迁移}:指一种学习对另一种学习的影响\pt{2}。 \textbf{学习迁移}:指一种学习对另一种学习的影响\pt{2}。\\
按方向分正迁移与负迁移\pt{1},其发生依赖于共同要素与概括水平\pt{1}。} 按方向分正迁移与负迁移\pt{1},其发生依赖于共同要素与概括水平\pt{1}。}
\scoring{每小题 \TNR{4} 分,共 \TNR{12} 分。按上述得分点累加给分, \scoring{每小题 \TNR{4} 分,共 \TNR{12} 分。按上述得分点累加给分,
Binary file not shown.
+2 -2
View File
@@ -33,8 +33,8 @@
\examsetup{ \examsetup{
year = {2025}, year = {2025},
term = {秋}, term = {秋},
course = {课程名称}, course = {数字逻辑},
college = {××学院}, college = {信息科学与工程学院},
type = {A}, % 卷头"试卷类型:A 卷"用这个 type = {A}, % 卷头"试卷类型:A 卷"用这个
foottype = {}, % 页脚课程名后是否再印类型字母。默认空(原卷 A 卷就不印) foottype = {}, % 页脚课程名后是否再印类型字母。默认空(原卷 A 卷就不印)
% 若要与 B 卷一致,写 foottype = {B} % 若要与 B 卷一致,写 foottype = {B}
+112 -90
View File
@@ -1,120 +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 节】:
```latex ```latex
\newcommand{\sfmyear} {\ph{××××}年} % 学年 \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{××××}} % 面向年级 \ph{计算机科学与技术}、\ph{软件工程}、\ph{智能科学与技术}}
\newcommand{\sfmcount}{\ph{××}} % 试卷份数 \newcommand{\sfmgrade} {\ph{2023}级} % 面向年级
\newcommand{\sfmteacher}{\ph{×××}} % 授课教师 \newcommand{\sfmcount} {\ph{86}} % 试卷份数
\newcommand{\sfmdate}{...} % 日期 \newcommand{\sfmteacher}{\ph{张远航}} % 授课教师
\newcommand{\sfmdate} {\ph{2025}年\ph{01}月\ph{08}日星期\ph{三}} % 日期
``` ```
填真实内容后把 `\ph{...}` 整个换掉,不要留下 `×`。 | 参数 | 说明 |
|---|---|
| `\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 行(面向专业)为高行
```
## 注意
示例内容为虚构数据,使用时全部替换成自己的课程。
+12 -14
View File
@@ -5,7 +5,7 @@
% (SynologyDrive/授课/数字逻辑/2025/归档/) % (SynologyDrive/授课/数字逻辑/2025/归档/)
% 原名与内文标题写的是「学院」,按现行建制改为「学部」, % 原名与内文标题写的是「学院」,按现行建制改为「学部」,
% 模板标题相应为「信息科学与工程学部试卷归档封面」。 % 模板标题相应为「信息科学与工程学部试卷归档封面」。
% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算: % 目标:版式与逐项对齐。所有尺寸都由 Word 内部数值换算:
% pt → mm : mm = pt / 72 * 25.4 % pt → mm : mm = pt / 72 * 25.4
% twips → mm : mm = twips / 1440 * 25.4 % twips → mm : mm = twips / 1440 * 25.4
% w:sz : 半磅值,÷ 2 即 pt % w:sz : 半磅值,÷ 2 即 pt
@@ -23,7 +23,7 @@
%====================================================================== %======================================================================
% 1. 页面与版心 % 1. 页面与版心
% %
% 原 .doc sectPr: % sectPr:
% pgSz A4(595.3 × 841.9 pt = 210.0 × 297.0 mm) % pgSz A4(595.3 × 841.9 pt = 210.0 × 297.0 mm)
% pgMar top/bottom 70.9 pt = 25.01 mm % pgMar top/bottom 70.9 pt = 25.01 mm
% left/right 56.7 pt = 20.00 mm % left/right 56.7 pt = 20.00 mm
@@ -49,7 +49,7 @@
} }
\setlength{\parindent}{0pt} \setlength{\parindent}{0pt}
\setlength{\parskip}{0pt} \setlength{\parskip}{0pt}
\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码 \pagestyle{empty} % 无页眉页脚,故不排页码
%====================================================================== %======================================================================
% 2. 字体与字号 % 2. 字体与字号
@@ -65,7 +65,6 @@
% ⚠️ 全文只有黑体一种字体,没有宋体/仿宋混排,比另两份表单简单。 % ⚠️ 全文只有黑体一种字体,没有宋体/仿宋混排,比另两份表单简单。
% %
% 字体全部来自仓库公共字体包 ../oucfonts.sty(文件在 ../fonts/ 下)。 % 字体全部来自仓库公共字体包 ../oucfonts.sty(文件在 ../fonts/ 下)。
% 旧版这里写的是系统字体的 SimHei / SimSun / FangSong + AutoFakeBold,
% 换台机器(尤其 Linux/macOS)就编不出来。现已全部换成随仓库分发的 % 换台机器(尤其 Linux/macOS)就编不出来。现已全部换成随仓库分发的
% 开源字体,并且粗体用字体自带的真粗体、不再算法描边。 % 开源字体,并且粗体用字体自带的真粗体、不再算法描边。
%====================================================================== %======================================================================
@@ -85,7 +84,7 @@
\linespread{1}\relax \linespread{1}\relax
\fontsize{18}{21.6}\selectfont} \fontsize{18}{21.6}\selectfont}
% 三档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致) % 三档字号(行距取字号的 1.2 倍,与单倍行距一致)
\newcommand{\sfmbigfont}{\linespread{1}\relax\fontsize{18}{21.6}\selectfont} \newcommand{\sfmbigfont}{\linespread{1}\relax\fontsize{18}{21.6}\selectfont}
\newcommand{\sfmmidfont}{\linespread{1}\relax\fontsize{16}{19.2}\selectfont} \newcommand{\sfmmidfont}{\linespread{1}\relax\fontsize{16}{19.2}\selectfont}
\newcommand{\sfmsmlfont}{\linespread{1}\relax\fontsize{14}{16.8}\selectfont} \newcommand{\sfmsmlfont}{\linespread{1}\relax\fontsize{14}{16.8}\selectfont}
@@ -97,11 +96,10 @@
\newcommand{\SFMHT}[1]{{\heiti #1\normalfont}} \newcommand{\SFMHT}[1]{{\heiti #1\normalfont}}
%---------------------------------------------------------------------- %----------------------------------------------------------------------
% ⚠️⚠️⚠️【「×」占位符的坑 —— 在 年度考核登记表/ 里踩过,那里只是绕过去了,
% 这里做了根治】 % 这里做了根治】
% %
% 现象:写 {\heiti ×××} 后编译,PDF 里这些 × 实际用的是 % 现象:写 {\heiti ×××} 后编译,PDF 里这些 × 实际用的是
% Times New Roman(pymupdf 读 span 的 font=TimesNewRomanPSMT), % Times New Roman,
% 不是黑体。§ 29 个 × 撑不满预期宽度,跟汉字混排时基线也偏。 % 不是黑体。§ 29 个 × 撑不满预期宽度,跟汉字混排时基线也偏。
% %
% 原因:xeCJK 按 Unicode 区段分类。「×」是 U+00D7,落在 Latin-1 补充区, % 原因:xeCJK 按 Unicode 区段分类。「×」是 U+00D7,落在 Latin-1 补充区,
@@ -122,7 +120,7 @@
%====================================================================== %======================================================================
% 3. 列的宽度模型 % 3. 列的宽度模型
% %
% 原 .doc tblGrid(2 个网格列,col_widths_pct = [30, 70]): % tblGrid(2 个网格列,col_widths_pct = [30, 70]):
% c1 = 170 × 30% = 51.000 mm % c1 = 170 × 30% = 51.000 mm
% c2 = 170 × 70% = 119.000 mm % c2 = 170 × 70% = 119.000 mm
% %
@@ -141,7 +139,7 @@
% 故每列再减 0.5292/2 = 0.2646 mm。 % 故每列再减 0.5292/2 = 0.2646 mm。
% %
% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差, % ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
% 实测需再微调(见 3.2 的实测标定值),否则一直报 % 实际需再微调(见 3.2 的标定值),否则一直报
% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。 % "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。
%====================================================================== %======================================================================
\newcommand{\sfmrule}{0.5pt} % 边框粗细(w:sz=4) \newcommand{\sfmrule}{0.5pt} % 边框粗细(w:sz=4)
@@ -167,7 +165,7 @@
%====================================================================== %======================================================================
% 4. 行高 % 4. 行高
% %
% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast): % 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast):
% R1 学年 42.55 pt = 15.011 mm % R1 学年 42.55 pt = 15.011 mm
% R2 学期 42.55 pt = 15.011 mm % R2 学期 42.55 pt = 15.011 mm
% R3 课程号 43.55 pt = 15.363 mm % R3 课程号 43.55 pt = 15.363 mm
@@ -242,14 +240,14 @@
%====================================================================== %======================================================================
% 7. 表外标题 % 7. 表外标题
% %
% 原 .doc 第 1 段:黑体、加粗、w:sz=36(18pt)、jc=center % 第 1 段:黑体、加粗、w:sz=36(18pt)、jc=center
% %
% 原文标题是「信息科学与工程学院试卷」,按现行建制与文档实际用途已改为 % 原文标题是「信息科学与工程学院试卷」,按现行建制与文档实际用途已改为
% 「信息科学与工程学部试卷归档封面」 % 「信息科学与工程学部试卷归档封面」
% 实测 18pt 下宽 94.89mm,版心宽 170mm,左右各余约 37mm,单行不折。 % 实际18pt 下宽 94.89mm,版心宽 170mm,左右各余约 37mm,单行不折。
% 再加长(比如后面挂"(理论课)")仍有余量,超过 170mm 才会折行。 % 再加长(比如后面挂"(理论课)")仍有余量,超过 170mm 才会折行。
% %
% 标题与表格之间原 .doc 有 3 个空段落(idx 13/14/15), % 标题与表格之间有 3 个空段落(idx 13/14/15),
% 合计 3 × 21.6pt = 64.8pt = 22.86 mm。这里用 \sfmtitleskip 还原。 % 合计 3 × 21.6pt = 64.8pt = 22.86 mm。这里用 \sfmtitleskip 还原。
%====================================================================== %======================================================================
\newlength{\sfmtitleskip} \newlength{\sfmtitleskip}
@@ -266,7 +264,7 @@
%====================================================================== %======================================================================
% 8. 表后空行 % 8. 表后空行
% %
% 原 .doc 表格之后还有一个空段落(idx 212)。 % 表格之后还有一个空段落(idx 212)。
%====================================================================== %======================================================================
\newcommand{\sfmtail}{\par\null\par} \newcommand{\sfmtail}{\par\null\par}
Binary file not shown.
+16 -13
View File
@@ -11,7 +11,7 @@
% (原文件名与内文标题写的是「学院」,现按现行建制改为「学部」) % (原文件名与内文标题写的是「学院」,现按现行建制改为「学部」)
% 所有尺寸已在 oucksfm.sty 内注明换算过程;要改版式请改 sty。 % 所有尺寸已在 oucksfm.sty 内注明换算过程;要改版式请改 sty。
% %
% 与原 .doc 的差异(有意为之): % 与的差异(有意为之):
% · 原文件里的真实课程信息已全部换成 × 占位 % · 原文件里的真实课程信息已全部换成 × 占位
% · 单位名「学院」按现行建制改为「学部」,标题相应改为 % · 单位名「学院」按现行建制改为「学部」,标题相应改为
% 「信息科学与工程学部试卷归档封面」 % 「信息科学与工程学部试卷归档封面」
@@ -43,7 +43,6 @@
% %
% ⚠️⚠️【必须看】占位符「×」一律用 \ph{} 包起来,不要裸写 ×。 % ⚠️⚠️【必须看】占位符「×」一律用 \ph{} 包起来,不要裸写 ×。
% %
% 原因(在 年度考核登记表/ 里踩过):字体的 ASCII 区段由 fontspec 交给
% 西文字体(这里是 Times New Roman),而「×」U+00D7 属于 Latin-1, % 西文字体(这里是 Times New Roman),而「×」U+00D7 属于 Latin-1,
% 会被判成 ASCII ⇒ 用 TNR 的 ×,那是 1em 宽的数学乘号, % 会被判成 ASCII ⇒ 用 TNR 的 ×,那是 1em 宽的数学乘号,
% 与汉字的 1em 字宽【不一样】(TNR 的 × 略窄、位置也偏)。 % 与汉字的 1em 字宽【不一样】(TNR 的 × 略窄、位置也偏)。
@@ -52,18 +51,22 @@
% \ph{} 把它强制交回黑体(全角),宽度才与汉字一致。 % \ph{} 把它强制交回黑体(全角),宽度才与汉字一致。
% 本表全文黑体,所以用 \heiti 收尾即可。 % 本表全文黑体,所以用 \heiti 收尾即可。
% %
% ⚠️ 填表时把 \ph{×××} 整体替换成真实内容(不要保留 × ): % ⚠️ 填表时把自己的内容套进 \ph{}(每个值都要包,不要裸写):
% 例如 \newcommand{\sfmcourse}{数字逻辑},一行的 \ph 都不要留。 % 例如 \newcommand{\sfmcourse}{\ph{数字逻辑}}。
%
% ⚠️ 本文件已填入**虚构示例**(学期 2025 秋、课程「数字逻辑」、任课教师
% 「张远航」等),用于演示一份填好的表长什么样。实际使用时整体替换:
% 下面每个 \ph{...} 的内容都改成自己的,不要保留示例值。
%---------------------------------------------------------------------- %----------------------------------------------------------------------
\newcommand{\ph}[1]{{\heiti #1\normalfont}} \newcommand{\ph}[1]{{\heiti #1\normalfont}}
% 学年。原文件写「2025年」,学期行写「秋季学期」。 % 学年。原文件写「2025年」,学期行写「秋季学期」。
% ⚠️ 注意:学部原表是「学年」+「2025年」这种写法,不是「2025—2026」。 % ⚠️ 注意:学部原表是「学年」+「2025年」这种写法,不是「2025—2026」。
% 若学校要求写成区间,改这里即可,行高涨一点不会溢出。 % 若学校要求写成区间,改这里即可,行高涨一点不会溢出。
\newcommand{\sfmyear} {\ph{××××}年} \newcommand{\sfmyear} {\ph{2025}年}
% 学期:秋 / 春,或「秋季学期」「春季学期」 % 学期:秋 / 春,或「秋季学期」「春季学期」
\newcommand{\sfmterm} {\ph{×}季学期} \newcommand{\sfmterm} {\ph{秋}季学期}
% 课程号 / 选课号:纯数字,14pt(比其余值小一档,原表如此) % 课程号 / 选课号:纯数字,14pt(比其余值小一档,原表如此)
% ⚠️ 纯数字是真正的 ASCII,本来就该用 TNR,所以不用 \ph 包。 % ⚠️ 纯数字是真正的 ASCII,本来就该用 TNR,所以不用 \ph 包。
@@ -71,29 +74,29 @@
\newcommand{\sfmsno} {25252029} \newcommand{\sfmsno} {25252029}
% 考试课程名称 % 考试课程名称
\newcommand{\sfmcourse}{\ph{××××}} \newcommand{\sfmcourse}{\ph{数字逻辑}}
% 课程类型:专业课 / 公共基础课 / 通识课 … % 课程类型:专业课 / 公共基础课 / 通识课 …
\newcommand{\sfmtype} {\ph{×××}} \newcommand{\sfmtype} {\ph{专业课}}
% 面向专业。多个专业之间用「、」隔开。 % 面向专业。多个专业之间用「、」隔开。
% ⚠️⚠️ 这一格是全表唯一的高行(32.844mm),能容 3 行 16pt 文字。 % ⚠️⚠️ 这一格是全表唯一的高行(32.844mm),能容 3 行 16pt 文字。
% 专业名超过 3 行会自动把行撑高,整表就顶出版心了——届时请把 % 专业名超过 3 行会自动把行撑高,整表就顶出版心了——届时请把
% oucksfm.sty 里 row{7} 的 ht 改大,或者把专业名精简。 % oucksfm.sty 里 row{7} 的 ht 改大,或者把专业名精简。
\newcommand{\sfmmajor}{% \newcommand{\sfmmajor}{%
\ph{××××××××}、\ph{××××}、\ph{××××××}、\ph{××××××}、\ph{××××××}} \ph{计算机科学与技术}、\ph{软件工程}、\ph{智能科学与技术}、\ph{数据科学}、\ph{电子信息工程}}
% 面向年级 % 面向年级
\newcommand{\sfmgrade}{\ph{××××}} \newcommand{\sfmgrade}{\ph{2023}级}
% 试卷份数 % 试卷份数
\newcommand{\sfmcount}{\ph{××}} \newcommand{\sfmcount}{\ph{86}}
% 授课教师 % 授课教师
\newcommand{\sfmteacher}{\ph{×××}} \newcommand{\sfmteacher}{\ph{张远航}}
% 日期 % 日期
\newcommand{\sfmdate}{\ph{××××}年\ph{××}月\ph{××}日星期\ph{×}} \newcommand{\sfmdate}{\ph{2025}年\ph{01}月\ph{08}日星期\ph{三}}
%====================================================================== %======================================================================
% 2. 正文 % 2. 正文
+62 -159
View File
@@ -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 警告**。这是唯一的主动偏离,属修正而非改版。
+41 -359
View File
@@ -1,72 +1,32 @@
%======================================================================
% oucgddir.sty — 信息科学与工程学部 试卷归档目录(理论课)版式包
%
% 依据:附件2:信息科学与工程学院归档目录(理论课).doc
% (SynologyDrive/授课/数字逻辑/2025/归档/)
% 原名与内文写的是「学院」,按现行建制改为「学部」,
% 模板标题相应为「信息科学与工程学部试卷归档目录」。
%
% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算:
% pt → mm : mm = pt / 72 * 25.4
% twips → mm : mm = twips / 1440 * 25.4
% w:sz : 半磅值,÷ 2 即 pt
%
% 用法见同目录 试卷归档目录.tex,说明见 README.md
%======================================================================
\NeedsTeXFormat{LaTeX2e} \NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{oucgddir}[2026/10/27 v1.0 OUC exam archive checklist] \ProvidesPackage{oucgddir}[2026/10/27 v1.0 OUC exam archive checklist]
%======================================================================
% oucgddir.sty —— 试卷归档目录版式包
%
% 提供:gdtable 环境、\gdtitle、\gdhead、\gdno、\gditem、\gdnote
% 用法见同目录 README.md
%======================================================================
\RequirePackage{geometry} \RequirePackage{geometry}
\RequirePackage{fontspec} \RequirePackage{fontspec}
\RequirePackage{xeCJK} \RequirePackage{xeCJK}
\RequirePackage{tabularray} \RequirePackage{tabularray}
%====================================================================== %======================================================================
% 1. 页面与版心 % 一、页面
% %
% 原 .doc sectPr: % 表格宽 150.8105mm,比常规版心(左右各 31.75mm)宽约 4.14mm,
% pgSz w:w=11906 h:h=16838 → A4(210.01 × 297.00 mm) % 故整表按纸张居中,左右各留 29.599mm。
% pgMar top/bottom = 1440 twips = 25.40 mm
% left/right = 1800 twips = 31.75 mm
% header 851 / footer 992 twips
% %
% 但这张表本身【比版心宽】—— 这是原文档就存在的问题,不是这里引入的: % totalwidth 取 150.8105mm 而非 150.636mm:tabularray 把竖线画在
% 版心宽 = 210 − 2×31.75 = 146.50 mm % 版心边界内侧,线宽计入盒宽,故需补 0.1745mm。
% 表宽 = tblGrid 合计 8540 twips = 150.64 mm
% ⇒ 表格比版心宽 4.14 mm,左右各溢出 2.07 mm。
% 原 Word 里 tblPr 是 jc=center + tblW=auto,所以表格是居中摆的,
% 左边界落在 29.60mm(= 31.75 − 2.07),实测 PDF 表格线 x 范围
% 29.60 ~ 180.41 mm,与此吻合。
%
% ⇒ 本包的处理:把 totalwidth 直接设成表宽 150.636mm,左右各留
% (210 − 150.636)/2 = 29.682 mm。这样
% · 表格与版心同宽,整表居中,编译不刷 Overfull \hbox
% · 表格线在纸面上的绝对位置与原 .doc 完全一致(误差 < 0.1mm)
% · 标题的居中基准也落在纸张中心,与原稿一致
% 即:不改动任何可见版式,只把"溢出版心"换成"版心就是表宽"。
%
% ⚠️⚠️【实测修正:totalwidth 要 150.8105mm,左边距 29.599mm】
%
% (a) 表宽的真实值不是 150.636mm。
% tabularray 把左竖线画在版心左边界【内侧】,线中心 = 边界 + 半线宽,
% 而右竖线外缘还要再占半个线宽,故整个 tblr 盒子的实宽比
% Σwd + 6×colsep + 4×线宽 多出约 0.4945pt。实测:
% Overfull \hbox (0.49452pt too wide)
% 须把 totalwidth 补足到 150.636 + 0.1745 = 150.8105 mm。
%
% (b) 左边距要 29.599mm 而非 29.682mm。
% 实测新版竖线 x 比原稿整体右偏 0.083mm(29.771 vs 29.686),
% 列宽与行距都已逐项精确,纯属整表平移,故左边距减 0.083mm。
% 此时 right 自动 = 210 − 29.599 − 150.8105 = 29.5905mm。
%
% 校正后实测:竖线 x = 29.686 / 52.758 / 130.104 / 180.322 mm,
% 与原稿 29.686 / 52.758 / 130.104 / 180.322 逐位相同。
%====================================================================== %======================================================================
\geometry{ \geometry{
paperwidth = 210mm, paperwidth = 210mm,
paperheight = 297mm, paperheight = 297mm,
left = 29.599mm, % 实测标定(见上) left = 29.599mm,
totalwidth = 150.8105mm, % = 表真实宽(含 tabularray 取整余量) totalwidth = 150.8105mm,
top = 25.40mm, top = 25.40mm,
bottom = 25.40mm, bottom = 25.40mm,
headheight = 0pt, headheight = 0pt,
@@ -75,179 +35,48 @@
} }
\setlength{\parindent}{0pt} \setlength{\parindent}{0pt}
\setlength{\parskip}{0pt} \setlength{\parskip}{0pt}
\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码 \pagestyle{empty}
%======================================================================
% 2. 字体与字号
%
% 原 .doc 全文只用「方正楷体_GB2312」一种中文字体,西文/数字用
% Times New Roman:
% 表外标题 楷体 24pt (w:sz=48)
% 表头三格 楷体 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)
%
% ⚠️ 原字体是方正楷体 —— 商业字体,不允许随仓库分发。这里换成
% OUC Kai(霞鹜文楷 GB2312 子集,SIL OFL 1.1),字形风格一致
% (同为楷体、同为 GB2312 字符集),观感几乎无法区分。
% 字体全部来自仓库公共字体包 ../fonts.tex。
%
% ⚠️ 西文/数字:原文档用 Times New Roman。这里用 TeX Gyre Termes,
% 它是 Times 的度量兼容替代(字符宽度逐字相同),数字宽度零漂移。
%======================================================================
\input{../fonts.tex} \input{../fonts.tex}
%----------------------------------------------------------------------
% ⚠️⚠️⚠️【最隐蔽的一条:必须关掉 xeCJK 的全角标点压缩】
%
% 现象:凡含全角括号「(」的行,整行右移 4.23pt,而字宽完全正确。
% 「试卷(项目设计报告)」原稿 x0=199.20,按默认设置排出 203.43。
%
% 根因:xeCJK 默认 PunctStyle=quanjiao,会对全角标点做**字宽挤压**:
% · 「(」「)」的 advance 从 1.0em 压到 0.5em
% · 挤压省下的空间被记在**行内盒子的起点**上(负的 \kern),
% 于是整行墨迹相对盒子右移
% · Word 不做这件事,全角括号就是整 1.0em
% 这在两端对齐的正文里看起来是"标点更紧凑",但在**居中**的表格
% 单元格里就会让整行偏移,且偏移量随括号个数变化(1 个括号 4.23pt,
% 2 个括号 8.46pt …),肉眼可见地不居中。
%
% 正解:\xeCJKsetup{PunctStyle=plain} —— 关闭挤压,全角标点按原字宽排。
% 代价:正文里中文标点的视觉密度略增(与 Word 完全一致,本就是目标)。
%
% ⚠️ 这条必须在 \begin{document} 之前设,且是**全局**的 ——
% 只对本模板生效,不影响仓库里其他模板(它们各自没这个包)。
%----------------------------------------------------------------------
\xeCJKsetup{PunctStyle=plain} \xeCJKsetup{PunctStyle=plain}
%---------------------------------------------------------------------- %======================================================================
% ⚠️⚠️⚠️【最要命的一条,与 oucksfm.sty / ouclw.sty 同源】 % 二、字号
% ctex 默认 \linespread 约 1.3,会把 \fontsize{12}{14.4} 的 14.4pt
% 行距放大成 18.7pt 以上,整张表会被撑高。
% %
% \fontsize 的第二个参数【本来是】用来设 \baselineskip 的,但 % 行距统一取字号的 1.2 倍。
% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread 归 1。 % 字号用 bp 单位:pt 换算成 PDF 点会有 72/72.27 的偏差,
% 这一步不能省,也必须在 \AtBeginDocument 之后再设一次 % 写 24pt 实际排出 23.91bp。
% (ctex 在 begin document 时会重设)。 %======================================================================
%----------------------------------------------------------------------
\newcommand{\gdbasefont}{% \newcommand{\gdbasefont}{%
\linespread{1}\relax \linespread{1}\relax
\fontsize{12bp}{14.4bp}\selectfont} \fontsize{12bp}{14.4bp}\selectfont}
%----------------------------------------------------------------------
% ⚠️⚠️【字号必须用 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 对不上。
%
% 正解:显式写 bp 单位 —— \fontsize{24bp}{28.8bp},实测正好 24.000。
% 本包所有字号、行距、间距只要涉及"照抄 Word 数值"的,一律用 bp。
%----------------------------------------------------------------------
% 各档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致)
\newcommand{\gdtitlefont}{\linespread{1}\relax\fontsize{24bp}{28.8bp}\selectfont} \newcommand{\gdtitlefont}{\linespread{1}\relax\fontsize{24bp}{28.8bp}\selectfont}
\newcommand{\gdheadfont} {\linespread{1}\relax\fontsize{18bp}{21.6bp}\selectfont} \newcommand{\gdheadfont} {\linespread{1}\relax\fontsize{18bp}{21.6bp}\selectfont}
\newcommand{\gdnotefont} {\linespread{1}\relax\fontsize{10.45bp}{12.54bp}\selectfont} \newcommand{\gdnotefont} {\linespread{1}\relax\fontsize{10.45bp}{12.54bp}\selectfont}
\newcommand{\gdcellfont} {\linespread{1}\relax\fontsize{12bp}{14.4bp}\selectfont} \newcommand{\gdcellfont} {\linespread{1}\relax\fontsize{12bp}{14.4bp}\selectfont}
%----------------------------------------------------------------------
% ⚠️ xeCJK 陷阱:局部字体切换命令若紧邻 \par(或落在段落末尾),段末的
% 字体状态会"溢出"到后面段落。故局部切换一律用带 \normalfont 收尾的包装。
%----------------------------------------------------------------------
%====================================================================== %======================================================================
% 3. 列的宽度模型 % 三、表格尺寸
% %
% 原 .doc tblGrid 三个网格列(twips → mm): % tabularray 的 wd 是内容宽,不含内边距;实际列间距 =
% c1 序号 = 1308 twips = 23.0717 mm % wd + 2×colsep + 线宽。下列取值已扣除内边距与线宽。
% c2 内容 = 4385 twips = 77.3465 mm
% c3 标注 = 2847 twips = 50.2179 mm
% ─────────────────────────────────────
% 合计 8540 twips = 150.6361 mm
%
% cellMar:left/right = 108 twips = 1.9050 mm,top/bottom = 0
% 边框 :w:sz = 4(单位 1/8 pt)⇒ 0.5 pt = 0.1764 mm
%
% tabularray 的 colsep 计在每列【左右两侧】,故 3 列共 6×1.905 = 11.430mm;
% 竖线 4 根(左边界 + 2 条内线 + 右边界)× 0.1764 = 0.7056mm。
% 要让 Σwd + 11.430 + 0.7056 = 150.636,需
% Σwd = 138.5005 mm
% 而 (gridCol − 2×1.905) 之和为 150.636 − 11.430 = 139.2061 mm,
% 两者差 0.7056 mm 正好是竖线总宽,故每列再减
% 竖线分摊 = 0.7056 / 3 = 0.2352 mm
%
% ⚠️ 上式是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差,
% 实测需再微调(见 3.1 的实测标定值),否则报
% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。
%
% ⚠️⚠️【实测标定:tabularray 把边框线宽算进列宽里】
% 实测每列"相邻竖线中心线间距" = wd + 2×colsep + \gdrule,
% 即比理论值 wd + 2×colsep 多出一个 0.1764mm 的线宽。
% 故正确的 wd 是
% wd = gridCol − 2×colsep − \gdrule
% 而不是 gridCol − 2×colsep − 竖线分摊。
% (按旧式"分摊"算出的 wd 偏小 0.154mm/列,整表窄 0.466mm,
% 实测原稿三列 23.072/77.346/50.218 而旧版 22.916/77.192/50.062。)
%====================================================================== %======================================================================
\newcommand{\gdrule}{0.5pt} % 边框粗细(w:sz=4) \newcommand{\gdrule}{0.5pt} % 边框粗细
\newcommand{\gdcolsep}{1.905mm} % 单元格左右内边距(108 twips) \newcommand{\gdcolsep}{1.905mm} % 单元格内边距
\newlength{\gdtblw} \newlength{\gdtblw}
\setlength{\gdtblw}{150.636mm} % 表宽(含 4 根竖线与 6 处内边距) \setlength{\gdtblw}{150.636mm} % 表宽(含 4 根竖线与 6 处内边距)
%---------------------------------------------------------------------- \newcommand{\gdwa}{19.0853mm} % 第 1 列内容宽
% 3.1 各列宽(= gridCol − 2×colsep − 竖线分摊) \newcommand{\gdwb}{73.3601mm} % 第 2 列内容宽
% 与 gdtable 环境里 colspec 的 wd 必须逐字一致。 \newcommand{\gdwc}{46.2315mm} % 第 3 列内容宽
%----------------------------------------------------------------------
\newcommand{\gdwa}{19.0853mm} % c1 23.0717 − 3.8100 − 0.1764(线宽)
\newcommand{\gdwb}{73.3601mm} % c2 77.3465 − 3.8100 − 0.1764
\newcommand{\gdwc}{46.2315mm} % c3 50.2179 − 3.8100 − 0.1764
%----------------------------------------------------------------------
% 3.2 行高(扣掉边框线宽)
%
% ⚠️⚠️ tabularray 的 row{...}={ht=...} 是**内容区**高度,hline 的线宽
% 不包含在内 —— 实测每行都比 ht 高出整整一个 \gdrule(0.5pt):
% 原稿行距 39.00pt,按 ht=13.7583mm(=39.00pt) 排出来是 39.50pt
% 13 行累计多出 6.5pt,整表总高 533.88 vs 原稿 527.40
% ⇒ ht 需减去线宽 0.5pt = 0.1764mm:
% 表头 20.5493 − 0.1764 = 20.3729 mm
% 中间行 13.7583 − 0.1764 = 13.5819 mm
% 末 行 14.1640 − 0.1764 = 13.9876 mm
%----------------------------------------------------------------------
%====================================================================== %======================================================================
% 4. 行高 % 四、表格环境
% %
% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast): % 3 列:序号 / 内容 / 标注
% R1 表头 1165 twips = 20.5493 mm % 第 1 行表头高 20.3729mm,正文行高 13.5819mm,末行 13.9876mm
% R2 ~ R13 780 twips = 13.7583 mm ← 12 行,逐行完全相同
% 最后一行 803 twips = 14.1640 mm ← 比其余 12 行高 0.406mm
% ────────────────────────────────────────
% 合计 20.5493 + 12×13.7583 + ... 见下
%
% ⚠️ 第 13 行(序号 12「试卷(项目设计报告)」)是 803 而非 780,
% 多出来的 23 twips 是 Word 里"字高 + 段前段后"凑出来的测量值,
% 照抄才能与原表逐行对齐。
%
% ⚠️ Word 的 exact 是"精确等于",内容超了会【被裁掉】。tabularray 的
% ht= 是最小行高(内容多则自动长高),语义更安全。本表各行内容都远
% 小于行高,两者结果相同,故直接写 ht=。
%======================================================================
%======================================================================
% 5. 表格环境
%
% ⚠️ 用 tblr 而非 longtblr:本表总高约 191mm,一页装得下(版心高
% 297 − 2×25.40 = 246.2 mm),不需要断页。
%
% ⚠️⚠️ colspec 与 row{} 必须字面写在这里,不能先存进宏再展开:
% tabularray 的列类型解析在宏展开之外进行,会报
% "Unexpandable command \xxx inside column type"。
% (所以 3.1 节那些 \gdwa… 只作文档用,不能拼进 colspec。)
%
% ⚠️ 选项里的宏名一律不带 @:tabularray 解析选项时 @ 不是字母。
%====================================================================== %======================================================================
\newenvironment{gdtable}{% \newenvironment{gdtable}{%
\par\begingroup \par\begingroup
@@ -263,96 +92,19 @@
\end{tblr}\par\endgroup} \end{tblr}\par\endgroup}
%====================================================================== %======================================================================
% 6. 单元格内容包装 % 五、单元格命令
%
% 本表全是单列格,tabularray 的 Q[c,m,wd=…] 已处理好居中与折行,
% 不需要 ouclw.sty 那种定宽 \parbox。这里只提供语义化的包装宏,
% 让 .tex 里不必反复写字体命令。
%====================================================================== %======================================================================
% \gdno{数字} —— 序号列:楷体 12pt 加粗
\newcommand{\gdno}[1]{{\kaiti\bfseries\gdcellfont #1\normalfont}} \newcommand{\gdno}[1]{{\kaiti\bfseries\gdcellfont #1\normalfont}}
% \gditem{文字} —— 内容列:楷体 12pt
\newcommand{\gditem}[1]{{\kaiti\gdcellfont #1\normalfont}} \newcommand{\gditem}[1]{{\kaiti\gdcellfont #1\normalfont}}
% 表头文字:楷体 18pt 加粗(只排字,不带任何垂直位移)
\newcommand{\gdheadraw}[1]{{\kaiti\bfseries\gdheadfont #1\normalfont}} \newcommand{\gdheadraw}[1]{{\kaiti\bfseries\gdheadfont #1\normalfont}}
% 表头单元格(单段结构,用于「序号」「内容」两格)
%
% ⚠️ 尾部 \vspace*{1.58pt} 把这两个字【上移】0.99pt。
% 原稿基线距行顶 34.73pt,不处理时是 36.51pt(低了 1.78pt)。
%
% 方向推导:尾部间距 s 改变盒子总高 H(H' = H + s),m 居中后
% 内容顶端 = 行顶 + (行高 − H')/2。故 s > 0 ⇒ 顶端上移 s/2;
% s < 0 ⇒ 顶端下移 |s|/2。
% ⚠️ 实测 s 与位移不是严格 s/2 关系(因为行高是固定 ht,但单元格
% 还有 hline 参与分配),标定结果:
% s = 0 → 36.51(低 1.78)
% s = 3.56 → 33.74(高 0.99)
% 即 Δs=3.56 带来 Δ位移=2.77,灵敏度 0.778pt/pt。
% 要从 33.74 下移回 34.73,需 Δs = −1.99 × 0.778⁻¹… 反解得 1.58。
% 实测 s = 1.58 → 34.73,与原稿一致。
%
% 「标注」格是两段结构、自带自己的位移,故用 \gdheadraw 而非本宏。
\newcommand{\gdhead}[1]{\gdheadraw{#1}\par\vspace*{1.58pt}} \newcommand{\gdhead}[1]{\gdheadraw{#1}\par\vspace*{1.58pt}}
% 表头第三格的小字注释:楷体 10.45pt,不加粗
\newcommand{\gdnote}[1]{{\kaiti\gdnotefont #1\normalfont}} \newcommand{\gdnote}[1]{{\kaiti\gdnotefont #1\normalfont}}
%---------------------------------------------------------------------- % 第三列表头:上行「标注」+ 下行说明
% 表头第三格的两行结构
%
% 原 .doc 该格是【两个独立段落】:
% 段 1 「标注」 楷体 18pt 加粗,jc=center
% 段 2 「(确认存档后在此栏打√)」 楷体 10.45pt,不加粗,jc=center
%
% 实测两段的 y0 分别为 161.64 与 189.27 pt(相差 27.63pt),
% 说明它们是顺序排列的两行,不是同一行里的不同字号。
% 因此这里也用两个 \par 分开的段落,而不是塞进同一行。
%
% ⚠️ 第二段的字宽 379.08~500.65pt = 121.57pt = 42.89mm,
% 而该列内容可用宽只有 46.08mm(见 §3.1),余 3.19mm,
% 刚好排得下不折行 —— 与原稿一致。若换成别的字体/字号导致
% 折行,请把 §3.1 的 c3 略微加宽(同时减小 c2)。
%
% ⚠️⚠️【两段的垂直间距:原稿 21.12pt】
% 原稿两段基线相距 198.29 − 177.17 = 21.12pt。
% 而 18pt 楷体的行距(\baselineskip = 21.6pt)已把第二段的
% 起点推到了第一段基线 + 21.6pt 处,故两段之间的 \vspace 应当是
% **负值**才能得到 21.12pt:
%
% 间距 = 第一段行距 21.6 + \vspace → \vspace = −0.48pt
%
% 但实测 \vspace*{-0.48pt} 只排出 13.93pt,与 21.12 差 7.19pt。
% 原因是 \gdhead{...} 内部的 \gdheadfont 把 \baselineskip 重设成
% 21.6bp 之后,\par 结束时段落用的是**收尾组外**的 12bp/14.4bp,
% 故实际参与的是 14.4pt,不是 21.6pt:
% 间距 = 14.4 + \vspace → \vspace = +6.72pt
% 实测 6.72pt 正好排出 21.12pt。
%
% ⚠️ 三个 \par 段落会改变单元格盒子的总高,tabularray 的 m(垂直居中)
% 会据此重新计算基线位置 —— 故改这个值会连带影响「标注」二字的高度。
%
% ⚠️⚠️【整格下移 1.49pt:只能用"尾部负间距"】
% 两段间距调对(21.09 vs 原稿 21.12 ✓)后,整个格子比原稿高 1.49pt。
% 五种手段实测对比(距行顶距离,单位 pt,最后一项是两段间距):
% A 原样 25.43 / 46.53 / 21.09
% B 尾部 \vspace*{-2.98pt} 26.92 / 48.01 / 21.10 ← 正确
% C 顶部 \vspace*{+2.98pt} 23.95 / 48.01 / 24.06 ← 反向且拉大间距
% D 顶部 \rule{0pt}{26.5pt} 31.25 / 52.34 / 21.09 ← 位移过大
% E \raisebox{-1.49pt}{\vbox{...}} 25.43 / 46.53 / 21.09 ← 完全无效
%
% 为什么 B 有效:\vspace* 放在最后一段之后会缩短盒子的**总高**,
% m 居中按 (行高 − 总高)/2 定位,总高减 2.98 ⇒ 内容整体下移 1.49。
% 两者是 2 倍关系,别写成 1.49。
%
% 为什么 C/D 不行:顶部间距会被首行的 ascent 吃掉(3.6pt 远小于
% 18pt 字的 ascent),所以小 h 无效、大 h 又过量,没有可用区间。
% 为什么 E 不行:raisebox 在 tabularray 的单元格里被 m 居中的
% 重新计算抵消掉了。
%----------------------------------------------------------------------
\newcommand{\gdheadIII}{% \newcommand{\gdheadIII}{%
\gdheadraw{标注}\par \gdheadraw{标注}\par
\vspace{6.72pt}% \vspace{6.72pt}%
@@ -360,50 +112,17 @@
\vspace*{-2.98pt}}% \vspace*{-2.98pt}}%
%====================================================================== %======================================================================
% 7. 表外标题 % 六、标题
% %
% 原 .doc 第 2 段(idx 1): % 标题「归档目录」四字之间用 \gdgap 插入固定空隙。
% 楷体 24pt,jc 未设(左对齐),首行缩进 firstLine=2640 twips % xeCJK 会吞掉连续半角空格,故不能用空格排版。
% = 46.55 mm,且 firstLineChars=550(即 5.5 字宽)。
% 文字是「归 档 目 录」,字间各留两个半角空格。
%
% 实测 PDF:四个字 x0 = 222.00 / 270.00 / 318.00 / 366.00 pt,
% 相邻间距恒为 48.00 pt,每字宽 24.00 pt
% ⇒ 字间空隙 = 48.00 − 24.00 = 24.00 pt = 1 个字宽 = 2 个半角空格 ✓
%
% ⚠️⚠️【不能直接把「归 档 目 录」写进源码】
% xeCJK 默认开启 CJKecglue,且会把连续半角空格吞成一个,
% 写「归 档 目 录」编译出来是「归档目录」紧贴(空格全没了,
% 实测 x0=216.09 且只有一个 span)。
%
% 正解:用实测的间距自己摆 —— 每字之间插入 \gdtitlegap
% = 24.00pt = 8.467mm 的固定空白。这样得到的字符位置与原稿逐字相同,
% 且不依赖 xeCJK 的空格策略。
% 实现见下面的 \gdtitle:参数是【逗号分隔的字】,逐字排并插 gap。
%====================================================================== %======================================================================
\newlength{\gdtitleindent} \newlength{\gdtitleindent}
%----------------------------------------------------------------------
% ⚠️⚠️【这个缩进不是 46.55mm,是 48.635mm】
%
% 原 .doc 的 firstLine = 2640 twips = 46.55mm,但它是从**版心左边界
% 31.75mm**(pgMar left=1800 twips)起算的:
% 31.75 + 46.55 = 78.30mm = 221.98pt ← 实测原稿标题 x0 = 222.00pt ✓
%
% 而本包把版心改成了表宽 150.636mm,左边界 29.682mm。若这里照抄
% 46.55mm,标题会落到 29.682 + 46.55 = 76.23mm = 216.02pt,
% 比原稿左移 5.91pt(2.08mm)—— 实测确实如此。
%
% ⇒ 补回这 2.151mm:48.701 = 46.55 + (31.75 − 29.599)
% 实测得到的标题 x0 = 222.00pt,与原稿逐字一致(四字间距 48.00pt)。
%----------------------------------------------------------------------
\setlength{\gdtitleindent}{48.701mm} \setlength{\gdtitleindent}{48.701mm}
\newlength{\gdtitlegap} \newlength{\gdtitlegap}
\setlength{\gdtitlegap}{24bp} % 字间空隙 = 1 个字宽(实测 48−24) \setlength{\gdtitlegap}{24bp} % 字间空隙 = 1 个字宽
% \gdgap —— 标题里的字间空隙,直接在 .tex 里逐字之间插入:
% \gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
% 比"逗号分隔、宏里循环"直观得多,也不用 \makeatletter。
\newcommand{\gdgap}{\kern\gdtitlegap} \newcommand{\gdgap}{\kern\gdtitlegap}
\newcommand{\gdtitle}[1]{% \newcommand{\gdtitle}[1]{%
@@ -412,50 +131,13 @@
{\kaiti\gdtitlefont #1\normalfont\par}} {\kaiti\gdtitlefont #1\normalfont\par}}
%====================================================================== %======================================================================
% 8. 标题与表格之间的空距 % 七、垂直间距
%
% 原 .doc 结构(body 子元素):
% idx 0 空段
% idx 1 标题「归 档 目 录」
% idx 2 空段
% idx 3 表格
% idx 4 空段
% idx 5 空段
%
% 实测:标题基线块 y0=97.78pt(34.50mm),表格顶线 y=150.00pt(52.92mm)。
% 标题字高 24pt、单倍行距 28.8pt = 10.16mm,故标题占 34.50 ~ 44.66mm;
% 标题段之后到表格顶线还差 52.92 − 44.66 = 8.26mm,
% 这一截由「空段(idx 2)」贡献。
%
% ⚠️⚠️【实测标定:9.943mm,不是 8.26mm】
% 理论值 8.26mm 是从"标题字块底 44.66mm"起算的,但 LaTeX 的
% \vspace 是从**基线 + 深度**之后起算,二者差一个 descent。
% 按 8.26mm 排出来表格顶线在 52.61mm,比原稿 53.00mm 高 0.39mm;
% 补足到 9.943mm 后实测 53.00mm,与原稿完全一致。
%====================================================================== %======================================================================
\newlength{\gdheadskip} \newlength{\gdheadskip}
\setlength{\gdheadskip}{9.943mm} \setlength{\gdheadskip}{9.943mm} % 标题下到表头
%======================================================================
% 9. 文档首部留白
%
% idx 0 是一个空段,占 1 行 = 28.8pt? 否 —— 它是 12pt 正文段落的空行,
% 单倍行距 = 14.4pt = 5.08mm。加上版心上边距 25.40mm,
% 标题块 y0 应为 25.40 + 5.08 = 30.48mm;
% 实测 34.50mm,差 4.02mm,是 Word 段前间距。故这里直接写到实测值。
%
% ⚠️⚠️【实测标定:2.7255mm,不是 4.02mm】
% 按 4.02mm 排出来,标题基线在 122.16pt,而原稿是 118.49pt,
% 低了 3.67pt = 1.2945mm。原因:4.02mm 是从"标题字块顶端"反推的,
% 而这里的 \vspace* 是从版心上边界往下量到**基线之上的高度**,
% 两者起算法不同,差了一个 ascent 的零头。
% ⇒ 4.02 − 1.2945 = 2.7255mm,实测标题基线 118.49pt,与原稿一致。
%
% 连带影响:表格整体也在同一基线之后,故此处一并归位;
% 表格顶线随之从 54.30mm 上移到 53.01mm(原稿 53.00mm)。
%======================================================================
\newlength{\gdtopskip} \newlength{\gdtopskip}
\setlength{\gdtopskip}{2.7255mm} \setlength{\gdtopskip}{2.7255mm} % 页顶到标题
\AtBeginDocument{\gdbasefont} \AtBeginDocument{\gdbasefont}
\endinput \endinput
+4 -4
View File
@@ -10,7 +10,7 @@
% 附件2:信息科学与工程学院归档目录(理论课).doc % 附件2:信息科学与工程学院归档目录(理论课).doc
% (原文件名与内文写的是「学院」,现按现行建制改为「学部」) % (原文件名与内文写的是「学院」,现按现行建制改为「学部」)
% %
% 与原 .doc 的差异(有意为之): % 与的差异(有意为之):
% · 单位名「学院」按现行建制改为「学部」,标题相应改为 % · 单位名「学院」按现行建制改为「学部」,标题相应改为
% 「信息科学与工程学部试卷归档目录」 % 「信息科学与工程学部试卷归档目录」
% · 原字体「方正楷体_GB2312」是商业字体,已换成 OUC Kai % · 原字体「方正楷体_GB2312」是商业字体,已换成 OUC Kai
@@ -18,11 +18,11 @@
% · 纸张、边距、表宽、列宽、行高、字号一律照原值,未做任何调整 % · 纸张、边距、表宽、列宽、行高、字号一律照原值,未做任何调整
% (详见 oucgddir.sty 的注释,每一项都附了换算过程) % (详见 oucgddir.sty 的注释,每一项都附了换算过程)
% %
% 与原 .doc 的一个【已知差异】(无法也无需还原): % 与的一个【已知差异】(无法也无需还原):
% 原表的 tblGrid 合计 8540 twips = 150.64mm,比版心 146.50mm 宽 % 原表的 tblGrid 合计 8540 twips = 150.64mm,比版心 146.50mm 宽
% 4.14mm,即原文档里这张表本来就在版心之外各溢出 2.07mm。 % 4.14mm,即原文档里这张表本来就在版心之外各溢出 2.07mm。
% Word 按 jc=center 居中摆放,所以看起来正常。 % Word 按 jc=center 居中摆放,所以看起来正常。
% 本模板把版心直接设成表宽,表格居中与纸面的绝对位置与原稿一致, % 本模板把版心直接设成表宽,表格居中与纸面的绝对位置,
% 但不再"溢出版心"。视觉上无差别,且不会产生 Overfull 警告。 % 但不再"溢出版心"。视觉上无差别,且不会产生 Overfull 警告。
%====================================================================== %======================================================================
\documentclass[UTF8,fontset=none]{ctexart} \documentclass[UTF8,fontset=none]{ctexart}
@@ -34,7 +34,7 @@
% ⚠️ 标题里的空格【不能】写成「归 档 目 录」—— xeCJK 会吞掉连续 % ⚠️ 标题里的空格【不能】写成「归 档 目 录」—— xeCJK 会吞掉连续
% 半角空格,编译出来是紧贴的「归档目录」。必须用 \gdgap 手动插入 % 半角空格,编译出来是紧贴的「归档目录」。必须用 \gdgap 手动插入
% 24bp(= 1 个字宽)的固定空隙,才能与原稿逐字对齐。 % 24bp(= 1 个字宽)的固定空隙,才能与逐字对齐。
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录} \gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
\vspace{\gdheadskip} \vspace{\gdheadskip}
+112
View File
@@ -0,0 +1,112 @@
# 课程大纲
中国海洋大学本科生课程大纲,A4 多页。
## 编译
```bash
cd 课程大纲
xelatex 课程大纲.tex
xelatex 课程大纲.tex % 跑两遍,目录与交叉引用才正确
```
或仓库根:`bash build.sh 课程大纲`(自动跑两遍)
## 文件
| 文件 | 说明 |
|---|---|
| `课程大纲.tex` | 主文件,课程信息与正文改这里 |
| `oucSyllabus.sty` | 版式包,一般不改 |
## 换课程要改三处
1. 文首的课程基本信息(`\newcommand` 那一段)
2. 各章节正文
3. 各表格的内容
## 课程基本信息
在 `\begin{document}` 之前定义:
```latex
\newcommand{\sylnamecn}{数字逻辑} % 课程名称(中文)
\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} % 课外学时
```
| 参数 | 说明 |
|---|---|
| `\sylnamecn` | 课程名称(中文) |
| `\sylnameen` | 课程名称(英文) |
| `\sylcode` | 课程代码 |
| `\sylteacher` | 责任教师 |
| `\sylattr` | 课程属性(专业知识 / 通识教育 …) |
| `\sylnature` | 必修 / 选修 |
| `\sylcredit` | 学分 |
| `\sylhours` | 总学时 |
| `\syltheory` | 理论学时 |
| `\sylpractice` | 实践学时 |
| `\sylextra` | 课外学时 |
## 正文写法
```latex
\oucsylmaintitle{中国海洋大学本科生课程大纲}
\oucsylsection{一、课程介绍}
\oucsylsubsection{1.课程描述(中英文):}
\oucsylp{数字逻辑是数字电路逻辑设计的简称……}
\oucsylp{Digital logic, short for digital logic circuit design, ...}
\oucsylsubsection{2.设计思路:}
\oucsylp{本课程主要讲授……}
\oucsylsection{二、课程目标}
\oucsylp{通过对该课程的学习,学生将达到如下课程目标:}
```
| 命令 | 用途 |
|---|---|
| `\oucsylmaintitle{标题}` | 主标题 |
| `\oucsylsection{标题}` | 一级节(一、二、三…) |
| `\oucsylsubsection{标题}` | 二级节(1.2.3.…) |
| `\oucsylsubsub{标题}` | 三级节 |
| `\oucsylp{正文}` | 正文段落,首行缩进 |
| `\oucsylpz{正文}` | 正文段落,不缩进 |
| `\oucsylsignature` | 签字栏 |
编号(一、二 / 1.2.)手写在参数里,模板不自动生成。
## 表格
课程大纲有四个表:课程基本信息、课程目标与毕业要求对应关系、
教学内容与学时分配、考核方式与成绩构成。
表格用 `tblr`(tabularray)环境,合并格用 `\SetCell`。改内容时
注意**每行的段数要与列数一致**,被合并掉的格子留空。
```latex
\SetCell[c=1]{c} 课程名称 & \SetCell[c=5]{l} (中文)\sylnamecn \\
```
## 版式
```
A4,多页
正文宋体,标题黑体,表格内 9pt
表格带边框,合并单元格较多
页眉页脚含课程名称
```
## 注意
示例内容为虚构数据,使用时全部替换。

Some files were not shown because too many files have changed in this diff Show More