简历排版修正:项目经验整块右移、西文换 Cochineal、课程执行大纲漏网 × #12

Closed
opened 2026-10-27 05:13:31 +00:00 by laoyang · 1 comment
Owner

背景

用户在查看 简历/简历.pdf 时提出三点:

  1. 「简历,项目经验那一节,怎么缩进了那么多?」
  2. 「中文用宋体没问题,英文是不是需要一个更合适的字体。」
  3. 「为什么代码库的 pdf 没更新,这样别人从代码库看到的,还是带很多叉的版本。」

第 3 点经核实不成立(详见「核实结论」),但顺带查出一处真漏网占位符,一并修掉。


一、项目经验整块右移(排版缺陷)

现象:「项目经验」一节的日期列比其他章节明显右移,与工作经历/教育经历/奖励与荣誉对不齐。

实测坐标(pymupdf 逐词取 x 坐标):

位置 修复前 x 修复后 x
工作经历 日期 48.5 pt 48.5 pt
教育经历 日期 48.5 pt 48.5 pt
奖励与荣誉 日期 48.5 pt 48.5 pt
项目经验 日期 145.1 pt 48.5 pt

根因:awesome-source-cv.cls 里 \rightcolumnlength 算早了。

\RequirePackage[margin=1.5cm]{geometry} 只是登记参数,geometry 真正改写
\textwidth 是在导言区结束时。而 cls 里那句 \setlength 执行得更早,读到的是
article 默认的 \textwidth = 345pt:

实际算出:345 − 71.13(2.5cm) − 24(4×6pt) = 249.87pt
应为:    512.15 − 71.13 − 24 − 0.4      = 417.02pt
差额:     167.15pt

longtable 默认把宽度小于版心的表格居中排(\LTleft/\LTright 都是 \fill),
于是整块右移 167.15/2 ≈ 83.6pt。把 \hfill、| 竖线等因素逐一分离做了最小复现,
均排除;换成 tabular 排同一组列类型也正常(72.3pt),确认是 longtable 的居中行为
放大了列宽计算错误。

修复(简历/awesome-source-cv.cls):

  1. 计算挪进 \AtBeginDocument,等 geometry 生效后再算;同时额外减去
    \arrayrulewidth(| 竖线自身 0.4pt,否则表宽比版心多 0.4pt)。
  2. R 列从 >{\hfill}m{2.5cm}(固定宽右贴)改为
    >{\raggedright\arraybackslash}p{2.5cm}(左对齐)。原来短日期被 \hfill
    推到左列右边界,落在 62.3pt,仍比别的章节多缩 13.8pt。

⚠️ 这类错误的危险之处:零 error、零 warning,日志里完全看不出来,只能量 PDF 坐标。


二、西文字体换 Cochineal

诉求:中文宋体可以,西文要更合适。

原状:TeX Gyre Termes(Times 度量兼容)。中文是思源宋体(中等粗细),Termes
笔画偏细偏紧,中英混排时西文那段视觉上会「陷进去」。

选型(10pt 下同一句英文的排印宽度,用于判断对断行的影响):

字体 样句宽 相对 Termes x 高 授权
TeX Gyre Termes(原) 229.68pt 100.0% 0.450 GUST FL
Cochineal(选中) 225.42pt 98.1% 0.433 SIL OFL 1.1
Libertinus Serif 234.62pt 102.2% 0.433 SIL OFL 1.1
XCharter 246.69pt 107.4% 0.481 SIL OFL 1.1
TeX Gyre Pagella 254.40pt 110.8% 0.472 GUST FL

选 Cochineal 的核心理由是宽度几乎不变(窄 1.9%),断行位置和表格列宽基本不动;
其余候选宽 2.2%~10.8%,会把全库的断行推着变。

落地方式(用户选择「只改简历」,不动另外 10 个模板):

  • 字体文件入 fonts/cochineal/(4 个 .otf,920 KB,附 OFL.txt)
  • fonts.tex 新增 \OUCLatinCochineal / \OUCLatinCochinealBold 两个字族
    和开关命令 \oucUseCochineal,不全局生效
  • 简历/awesome-source-cv.cls 在 \AtBeginDocument 里调用该开关

⚠️ 必须放 \AtBeginDocument:cls 执行时主文件还没 \input{../fonts.tex},
命令尚未定义,直接调用报 Undefined control sequence。


三、换字体后暴露的真实排版缺陷

换成 Cochineal 后(西文窄 1.9%,断点整体前移)出现一条 Overfull 88.49pt:

\TU/cochineal(2)/m/n/10 Conference on Industrial Electronics and Applications (ICIEA), 88–93.

文字实际排到 x=595.5,而纸宽才 595.28 —— 顶到纸边了。

根因:XeLaTeX 里「中文紧跟英文」的位置不是断开点,TeX 把
2023 IEEE 18th Annual Conference on Industrial Electronics and Applications (ICIEA), 88--93.
当成一个长单词找断点,找到头也没有。上游模板没设 \emergencystretch,一点余量都没有。
用 Termes 时只差 0.4pt,刚好挤进去,所以一直没暴露。

修复:\setlength{\emergencystretch}{3em}。不动字体、不改内容、不影响其他环境。
(没选全局 \sloppy —— 那会把所有段落的词距都放松,连正常短段落也变松散。)


四、课程执行大纲漏网占位符(第 3 点的真实来源)

用户说的「代码库看到的还是带很多叉的版本」,经逐字节核实不成立(见下),
但排查时发现 课程执行大纲.pdf 第 1 页确实还有 4 个 ×:

××学部××学院

它硬编码在 课程执行大纲/ouccourse.sty:223,上一轮(#11)只扫了 .tex 没扫 .sty,
所以漏了。

修复:拆成两个名称宏,改院名只动导言区:

\renewcommand{\ccdepartment}{海洋地球科学学院}   % 默认「信息科学与工程学部」
\renewcommand{\cccollege}{地质学系}              % 默认「计算机科学与技术学院」

默认值取自该模板的虚构设定(陈立群 / 电子信息工程 / 2025 秋),与课程教学日历、
成绩构成说明、试卷保持一致。校名「中国海洋大学」真实,不虚构。

未写成 \ccschool[学部][学院]:\newcommand 只支持一个可选参数,第二个方括号
会被当成正文印出来。


核实结论:「代码库里的 PDF 没更新」不成立

  • 本地 HEAD = 远程 HEAD = 8984b93ee7b6
  • 通过 Gitea API 从服务器实际下载 8 个 PDF 逐一比对,全部与本地逐字节一致
  • 简历.pdf 3 页 0 个 ×

全库 PDF 修复后只剩 5 处合法 ×:参考答案 里的判断题符号 判断:× 3 处 +
数学乘号 0.3 × 85 2 处。

用户若在浏览器仍看到旧版,属 Gitea 网页 PDF 预览器缓存,可用原始文件直链复核。


验收标准

  • 简历「项目经验」日期左边缘 = 48.5pt,与其余章节严格一致
  • 简历 PDF 嵌入 Cochineal(Roman/Bold/Italic),Termes 完全消失
  • 简历 3 页,0 error / 0 Overfull / 0 Underfull
  • 课程执行大纲全文 × 归零,院名居中正常
  • 全库 12 项编译回归与基线一致
    (执行大纲 Over 1、参考答案 Over 1、幻灯片 Under 1、科技报告 Under 1,均为改动前既有)
  • 其余 10 个模板仍用 Termes,未被波及
  • 调试用临时文件已清理
## 背景 用户在查看 `简历/简历.pdf` 时提出三点: 1. 「简历,项目经验那一节,怎么缩进了那么多?」 2. 「中文用宋体没问题,英文是不是需要一个更合适的字体。」 3. 「为什么代码库的 pdf 没更新,这样别人从代码库看到的,还是带很多叉的版本。」 第 3 点经核实**不成立**(详见「核实结论」),但顺带查出一处真漏网占位符,一并修掉。 --- ## 一、项目经验整块右移(排版缺陷) **现象**:「项目经验」一节的日期列比其他章节明显右移,与工作经历/教育经历/奖励与荣誉对不齐。 **实测坐标**(pymupdf 逐词取 x 坐标): | 位置 | 修复前 x | 修复后 x | |---|---|---| | 工作经历 日期 | 48.5 pt | 48.5 pt | | 教育经历 日期 | 48.5 pt | 48.5 pt | | 奖励与荣誉 日期 | 48.5 pt | 48.5 pt | | **项目经验 日期** | **145.1 pt** | **48.5 pt** | **根因**:`awesome-source-cv.cls` 里 `\rightcolumnlength` **算早了**。 `\RequirePackage[margin=1.5cm]{geometry}` 只是登记参数,geometry 真正改写 `\textwidth` 是在导言区结束时。而 cls 里那句 `\setlength` 执行得更早,读到的是 article 默认的 `\textwidth = 345pt`: ``` 实际算出:345 − 71.13(2.5cm) − 24(4×6pt) = 249.87pt 应为: 512.15 − 71.13 − 24 − 0.4 = 417.02pt 差额: 167.15pt ``` `longtable` 默认把宽度小于版心的表格**居中**排(`\LTleft`/`\LTright` 都是 `\fill`), 于是整块右移 `167.15/2 ≈ 83.6pt`。把 `\hfill`、`|` 竖线等因素逐一分离做了最小复现, 均排除;换成 `tabular` 排同一组列类型也正常(72.3pt),确认是 `longtable` 的居中行为 放大了列宽计算错误。 **修复**(`简历/awesome-source-cv.cls`): 1. 计算挪进 `\AtBeginDocument`,等 geometry 生效后再算;同时额外减去 `\arrayrulewidth`(`|` 竖线自身 0.4pt,否则表宽比版心多 0.4pt)。 2. `R` 列从 `>{\hfill}m{2.5cm}`(固定宽右贴)改为 `>{\raggedright\arraybackslash}p{2.5cm}`(左对齐)。原来短日期被 `\hfill` 推到左列右边界,落在 62.3pt,仍比别的章节多缩 13.8pt。 **⚠️ 这类错误的危险之处**:零 error、零 warning,日志里完全看不出来,只能量 PDF 坐标。 --- ## 二、西文字体换 Cochineal **诉求**:中文宋体可以,西文要更合适。 **原状**:TeX Gyre Termes(Times 度量兼容)。中文是思源宋体(中等粗细),Termes 笔画偏细偏紧,中英混排时西文那段视觉上会「陷进去」。 **选型**(10pt 下同一句英文的排印宽度,用于判断对断行的影响): | 字体 | 样句宽 | 相对 Termes | x 高 | 授权 | |---|---|---|---|---| | TeX Gyre Termes(原) | 229.68pt | 100.0% | 0.450 | GUST FL | | **Cochineal(选中)** | **225.42pt** | **98.1%** | 0.433 | SIL OFL 1.1 | | Libertinus Serif | 234.62pt | 102.2% | 0.433 | SIL OFL 1.1 | | XCharter | 246.69pt | 107.4% | 0.481 | SIL OFL 1.1 | | TeX Gyre Pagella | 254.40pt | 110.8% | 0.472 | GUST FL | 选 Cochineal 的核心理由是**宽度几乎不变(窄 1.9%)**,断行位置和表格列宽基本不动; 其余候选宽 2.2%~10.8%,会把全库的断行推着变。 **落地方式**(用户选择「只改简历」,不动另外 10 个模板): - 字体文件入 `fonts/cochineal/`(4 个 .otf,920 KB,附 `OFL.txt`) - `fonts.tex` 新增 `\OUCLatinCochineal` / `\OUCLatinCochinealBold` 两个字族 和开关命令 `\oucUseCochineal`,**不全局生效** - `简历/awesome-source-cv.cls` 在 `\AtBeginDocument` 里调用该开关 **⚠️ 必须放 `\AtBeginDocument`**:cls 执行时主文件还没 `\input{../fonts.tex}`, 命令尚未定义,直接调用报 `Undefined control sequence`。 --- ## 三、换字体后暴露的真实排版缺陷 换成 Cochineal 后(西文窄 1.9%,断点整体前移)出现一条 **Overfull 88.49pt**: ``` \TU/cochineal(2)/m/n/10 Conference on Industrial Electronics and Applications (ICIEA), 88–93. ``` 文字实际排到 `x=595.5`,而纸宽才 `595.28` —— 顶到纸边了。 **根因**:XeLaTeX 里「中文紧跟英文」的位置**不是**断开点,TeX 把 `2023 IEEE 18th Annual Conference on Industrial Electronics and Applications (ICIEA), 88--93.` 当成一个长单词找断点,找到头也没有。上游模板没设 `\emergencystretch`,一点余量都没有。 用 Termes 时只差 0.4pt,刚好挤进去,所以一直没暴露。 **修复**:`\setlength{\emergencystretch}{3em}`。不动字体、不改内容、不影响其他环境。 (没选全局 `\sloppy` —— 那会把所有段落的词距都放松,连正常短段落也变松散。) --- ## 四、课程执行大纲漏网占位符(第 3 点的真实来源) 用户说的「代码库看到的还是带很多叉的版本」,经逐字节核实**不成立**(见下), 但排查时发现 `课程执行大纲.pdf` 第 1 页确实还有 4 个 `×`: ``` ××学部××学院 ``` 它硬编码在 `课程执行大纲/ouccourse.sty:223`,上一轮(#11)只扫了 `.tex` 没扫 `.sty`, 所以漏了。 **修复**:拆成两个名称宏,改院名只动导言区: ```latex \renewcommand{\ccdepartment}{海洋地球科学学院} % 默认「信息科学与工程学部」 \renewcommand{\cccollege}{地质学系} % 默认「计算机科学与技术学院」 ``` 默认值取自该模板的虚构设定(陈立群 / 电子信息工程 / 2025 秋),与课程教学日历、 成绩构成说明、试卷保持一致。校名「中国海洋大学」真实,不虚构。 > 未写成 `\ccschool[学部][学院]`:`\newcommand` 只支持一个可选参数,第二个方括号 > 会被当成正文印出来。 --- ## 核实结论:「代码库里的 PDF 没更新」不成立 - 本地 HEAD = 远程 HEAD = `8984b93ee7b6` - 通过 Gitea API 从服务器**实际下载** 8 个 PDF 逐一比对,**全部与本地逐字节一致** - `简历.pdf` 3 页 **0 个 `×`** 全库 PDF 修复后只剩 **5 处合法 `×`**:`参考答案` 里的判断题符号 `判断:×` 3 处 + 数学乘号 `0.3 × 85` 2 处。 用户若在浏览器仍看到旧版,属 Gitea 网页 PDF 预览器缓存,可用原始文件直链复核。 --- ## 验收标准 - [x] 简历「项目经验」日期左边缘 = 48.5pt,与其余章节严格一致 - [x] 简历 PDF 嵌入 Cochineal(Roman/Bold/Italic),Termes 完全消失 - [x] 简历 3 页,`0 error / 0 Overfull / 0 Underfull` - [x] 课程执行大纲全文 `×` 归零,院名居中正常 - [x] 全库 12 项编译回归与基线一致 (执行大纲 Over 1、参考答案 Over 1、幻灯片 Under 1、科技报告 Under 1,均为改动前既有) - [x] 其余 10 个模板仍用 Termes,未被波及 - [x] 调试用临时文件已清理
Author
Owner

已完成并推送

commit:69da5b4(8984b93..69da5b4 main -> main)
远程验证:通过 Gitea API 从服务器下载 简历/简历.pdf(158764 字节)、
课程执行大纲/课程执行大纲.pdf(193876 字节),与本地逐字节一致。

四项改动的最终数据

项目 改前 改后
简历「项目经验」日期左边缘 145.1 pt 48.5 pt(与其余章节一致)
简历西文字体 TeX Gyre Termes Cochineal(Roman/Bold/Italic 全嵌入)
简历 ICIEA 条目 Overfull — 88.49 pt 已消除
课程执行大纲 × 数量 4 0

编译回归(全库 12 项)

模板              err  Over  Under   页数
劳务发放说明表        0     0      0      1
年度考核登记表        0     0      0      2
成绩构成说明         0     0      0      1
简历                0     0      0      3
试卷题型示例         0     0      0      6
参考答案           0     1      0      3   ← 基线 1,改动前既有
试卷归档封面         0     0      0      1
试卷归档目录         0     0      0      1
课程执行大纲         0     1      0      5   ← 基线 1,改动前既有
课程教学日历         0     0      0      2
幻灯片             0     0      1     30   ← 基线 1,改动前既有
科技报告           0     0      1     10   ← 基线 1,改动前既有

四个带 Overfull/Underfull 的与基线完全一致,均为改动前既有问题,本次未引入新问题。

附带核实:「代码库 PDF 没更新」不成立

  • 本地 HEAD = 远程 HEAD = 8984b93ee7b6(改动前)
  • 从服务器实际下载 8 个 PDF 逐一比对,全部与本地逐字节一致
  • 简历.pdf 3 页 0 个 ×

用户若在浏览器仍看到旧版,属 Gitea 网页 PDF 预览器缓存,可用原始文件直链复核:
https://code.yangyq.net/laoyang/ouc_latex_template/raw/branch/main/简历/简历.pdf

调试文件已清理

简历/ 下 _dbg1~3.*、_fontcmp*.*、_fc2_p*.png 等 27 个临时文件全部删除,
未入库。

遗留说明

  • 其余 10 个模板仍用 TeX Gyre Termes,本次按你的选择只改简历。
    若将来要全库统一换 Cochineal,需改 fonts.tex 的 \setmainfont 本身,
    并重新核对各模板断行(Cochineal 窄 1.9%,断点会整体前移一点)。
  • fonts/README.md 新增「Cochineal」章节,含 5 款候选字体的度量对照表,
    供将来换字体时参考,不必重新调研。
## 已完成并推送 **commit**:`69da5b4`(`8984b93..69da5b4 main -> main`) **远程验证**:通过 Gitea API 从服务器下载 `简历/简历.pdf`(158764 字节)、 `课程执行大纲/课程执行大纲.pdf`(193876 字节),与本地**逐字节一致**。 ### 四项改动的最终数据 | 项目 | 改前 | 改后 | |---|---|---| | 简历「项目经验」日期左边缘 | 145.1 pt | **48.5 pt**(与其余章节一致) | | 简历西文字体 | TeX Gyre Termes | **Cochineal**(Roman/Bold/Italic 全嵌入) | | 简历 ICIEA 条目 Overfull | — | 88.49 pt 已消除 | | 课程执行大纲 `×` 数量 | 4 | **0** | ### 编译回归(全库 12 项) ``` 模板 err Over Under 页数 劳务发放说明表 0 0 0 1 年度考核登记表 0 0 0 2 成绩构成说明 0 0 0 1 简历 0 0 0 3 试卷题型示例 0 0 0 6 参考答案 0 1 0 3 ← 基线 1,改动前既有 试卷归档封面 0 0 0 1 试卷归档目录 0 0 0 1 课程执行大纲 0 1 0 5 ← 基线 1,改动前既有 课程教学日历 0 0 0 2 幻灯片 0 0 1 30 ← 基线 1,改动前既有 科技报告 0 0 1 10 ← 基线 1,改动前既有 ``` 四个带 Overfull/Underfull 的与基线**完全一致**,均为改动前既有问题,本次未引入新问题。 ### 附带核实:「代码库 PDF 没更新」不成立 - 本地 HEAD = 远程 HEAD = `8984b93ee7b6`(改动前) - 从服务器实际下载 8 个 PDF 逐一比对,全部与本地**逐字节一致** - `简历.pdf` 3 页 **0 个 `×`** 用户若在浏览器仍看到旧版,属 Gitea 网页 PDF 预览器缓存,可用原始文件直链复核: `https://code.yangyq.net/laoyang/ouc_latex_template/raw/branch/main/简历/简历.pdf` ### 调试文件已清理 `简历/` 下 `_dbg1~3.*`、`_fontcmp*.*`、`_fc2_p*.png` 等 27 个临时文件全部删除, 未入库。 ### 遗留说明 - 其余 10 个模板**仍用 TeX Gyre Termes**,本次按你的选择只改简历。 若将来要全库统一换 Cochineal,需改 `fonts.tex` 的 `\setmainfont` 本身, 并重新核对各模板断行(Cochineal 窄 1.9%,断点会整体前移一点)。 - `fonts/README.md` 新增「Cochineal」章节,含 5 款候选字体的度量对照表, 供将来换字体时参考,不必重新调研。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/ouc_latex_template#12