简历排版修正:项目经验整块右移、西文换 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 项编译回归与基线一致。
This commit is contained in:
2026-10-27 13:13:54 +08:00
parent 8984b93ee7
commit 69da5b41a6
15 changed files with 455 additions and 27 deletions
+50 -8
View File
@@ -6,7 +6,7 @@
## 特性
- **字体全部取自仓库公共字体包**:中文 OUC Serif(宋体)/ OUC Sans(黑体)/ OUC Kai(楷体)/ Zhuque Fangsong(仿宋),西文 TeX Gyre Termes,图标 FontAwesome —— 没有任何一个字体来自系统或 TeX Live 安装,**换机器编译结果一致**;
- **字体全部取自仓库公共字体包**:中文 OUC Serif(宋体)/ OUC Sans(黑体)/ OUC Kai(楷体)/ Zhuque Fangsong(仿宋),西文 Cochineal,图标 FontAwesome —— 没有任何一个字体来自系统或 TeX Live 安装,**换机器编译结果一致**;
- **真粗体**:标题、姓名、区块头用的都是字体自带的粗体,不是算法描边;
- **分区可拆**:`section_01` ~ `section_10` 各自一个文件,不想要哪块就把对应 `\input` 注释掉;
- **圆形头像**:`\photo{2.5cm}{photo}` 自动裁成圆形,尺寸随参数走;
@@ -27,12 +27,13 @@ xelatex 简历.tex
xelatex 简历.tex # 跑两遍:第一遍写 .aux,第二遍才能取到正确的页码与交叉引用
```
编译结果:3 页,日志零 error、零 Underfull、零 Overfull。嵌入字体只有 5 个,全部来自本仓库:
编译结果:3 页,日志零 error、零 Underfull、零 Overfull。嵌入字体只有 7 个,全部来自本仓库:
| 字体 | 用途 |
|---|---|
| `OUCSerif-Regular` / `OUCSerif-Bold` | 中文正文与标题 |
| `TeXGyreTermes-Regular` / `-Bold` | 西文正文与标题 |
| `Cochineal-Roman` / `-Bold` / `-Italic` | 西文正文、标题与斜体 |
| `OUCKai-Regular` | 中文斜体(楷体代斜体,中文惯例) |
| `FontAwesome` | 联系方式行图标 |
## 改什么、在哪儿改
@@ -55,7 +56,7 @@ xelatex 简历.tex # 跑两遍:第一遍写 .aux,第二遍才能取
| 上游做法 | 问题 | 本模板的处理 |
|---|---|---|
| `zh_cn-adobefonts_external.sty` 设 Adobe 宋/黑/楷/仿 | 56 MB 商业字体,无授权不可分发 | **删掉这两个文件**,改由 `../fonts.tex` 提供中文字体 |
| `awesome-source-cv.cls` 的 `localFont` 分支设 `SourceSansPro-*`(9 个 .otf) | 同上,且与仓库已有西文字体重复 | cls 里的 `\setmainfont` 整段删除,西文改走 `../fonts.tex` 的 TeX Gyre Termes |
| `awesome-source-cv.cls` 的 `localFont` 分支设 `SourceSansPro-*`(9 个 .otf) | 同上,且与仓库已有西文字体重复 | cls 里的 `\setmainfont` 整段删除,西文改走 `../fonts.tex` 提供的 Cochineal |
| `fontawesome.sty` 用字体名找系统 FontAwesome | 机器上没装就编不过 | 改成显式 `Path=../fonts/fontawesome/`,字体文件已入仓库 |
删掉的两个文件里还有个隐藏问题值得记一笔:原 `zh_cn-adobefonts_external.sty` 里
@@ -95,16 +96,57 @@ xelatex 简历.tex # 跑两遍:第一遍写 .aux,第二遍才能取
### 3. 排版小修
- **左栏宽度改自适应**:原来 `\leftcolumn 2.5cm + \rightcolumnlength 14.8cm` 看着
小于版心 18 cm,但两列共 4 个 `\tabcolsep`(≈0.85 cm)没算进去,实际 18.15 cm,
日志有 `Overfull 4.48pt`。改成
`\dimexpr\linewidth-\leftcolumn-4\tabcolsep\relax` 由版心反算,改页边距也不用再调数字。
- **项目经验不再「缩进一大截」**:这一节原来整块右移了约 3.4 cm,与其他章节的
日期列对不齐(145.1pt vs 48.5pt)。根因不是 `\hfill` 也不是竖线,而是
`\rightcolumnlength` **算早了**——`geometry` 的边距要到导言区结束才生效,
而 cls 里那句 `\setlength` 执行得更早,读到 article 默认的 345pt 文字宽,
算出 249.87pt,比应有的 417.02pt 少了 167.15pt;`longtable` 把这张窄表居中排,
于是整块右移 167.15/2 ≈ 83.6pt。修法两条:计算挪进 `\AtBeginDocument`
(并额外减去 `|` 竖线的 `\arrayrulewidth`=0.4pt);`R` 列由
`>{\hfill}m{2.5cm}`(固定宽右贴)改为 `>{\raggedright\arraybackslash}p{2.5cm}`。
改后日期左边缘 145.1 → **48.5pt**,与工作经历/教育经历/奖励与荣誉严格一致。
⚠️ 这类错误**零 error、零 warning**,只看日志发现不了,必须量 PDF 坐标。
- **左栏宽度改按版心反算**:原来 `\leftcolumn 2.5cm + \rightcolumnlength 14.8cm`
看着小于版心 18 cm,但两列共 4 个 `\tabcolsep`(≈0.85 cm)没算进去,实际 18.15 cm,
日志有 `Overfull 4.48pt`。改成由 `\textwidth` 减去左列、列间距与竖线宽度,
改页边距也不用再调数字。
- **中西文之间加断行弹性**:论文条目里「…Applications (ICIEA), 88--93. 中国青岛…」
这类「长英文名紧跟中文」的串,XeLaTeX 默认不在中英交界处断开,会把整串当
一个长单词硬冲出去(实测冲出 88.5pt,文字顶到纸边)。给 itemize 加
`\emergencystretch=3em` 解决,不动字体、不改内容、不影响其他环境。
- **抬头去掉两处空盒**:`\vspace*{0.3cm}\\` 和 `\smallskip\\` 会在换行前多产生一个
空 hbox(日志刷 `Underfull \hbox (badness 10000)`),改成 `\\[0.3cm]` /
`\\[\smallskipamount]`,间距效果不变。
- **`\socialinfo` 末尾不要留 `\\`**:`简历.tex` 里最后一行 `\address{...}` 后面加了
`\\` 同样会多一个空行。中间的 `\\` 是分行,必须保留。
### 4. 西文字体换成 Cochineal
中文用思源宋体(中等粗细),原先配的 **TeX Gyre Termes** 是 Times 的度量兼容替代,
笔画偏细偏紧,中英混排时西文那一段视觉上会「陷进去」。改用 **Cochineal**
(Michael Sharpe 据 Minion 设计,SIL OFL 1.1,920 KB 已入 `../fonts/cochineal/`)。
| 字体 | 同一句英文宽(10pt) | 相对 Termes | x 高 |
|---|---|---|---|
| TeX Gyre Termes(原) | 229.68pt | 100.0% | 0.450 |
| **Cochineal(现)** | 225.42pt | **98.1%** | 0.433 |
| Libertinus Serif | 234.62pt | 102.2% | 0.433 |
| XCharter | 246.69pt | 107.4% | 0.481 |
| TeX Gyre Pagella | 254.40pt | 110.8% | 0.472 |
选 Cochineal 的理由是**宽度几乎不变(窄 1.9%)**,断行位置和表格列宽基本不动;
Pagella / XCharter 宽 7~11%,会把全库的断行推着变。
⚠️ 三点务必注意:
1. **只影响简历**。切换命令 `\oucUseCochineal` 定义在 `../fonts.tex`,
但**不是**全局生效,只有本模板的 cls 调用。改全库请改 `\setmainfont` 本身。
2. **必须放在 `\AtBeginDocument` 里**。cls 执行时主文件还没 `\input{../fonts.tex}`,
那个命令尚未定义,直接调用会报 `Undefined control sequence`。
3. **换西文字体后必须复查 Overfull**。字体窄 1.9% 会让断点位置整体前移,
原本「刚好挤进去」的长串就会暴露成真溢出——本次换字体就是这样才发现
ICIEA 那条论文冲出 88.5pt 的。
## 写的时候容易踩的三个坑
1. **`\newExperience` 的参数顺序是「结束在前、开始在后」** —— 上游定义就是先印
+125 -12
View File
@@ -101,10 +101,59 @@
\titlespacing{\section}{0pt}{2pt}{2pt}
% Configure list
\setlist[itemize,1]{label=\faAngleRight, nosep, leftmargin=2em}
\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
\newcolumntype{R}[1]{>{\hfill}m{#1}}
%
% ⚠️ 原来是 >{\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}
@@ -153,12 +202,39 @@
% Path 指向本目录下并不存在的 fonts/ —— 只能靠系统字体兜底。
% 现在路径写进 fontawesome.sty 了。
% 西文正文:上游用 Source Sans Pro Light(很细),本模板改用 Termes。
% 注意这里**不能**再 \setmainfont —— 那会把 fonts.tex 设好的 Termes
% 整套换掉。只把上游代码里对 Light/Semibold 的引用映射到 Termes 的
% 常规/粗体两档,保持"正文常规、强调加粗"的层级不变。
\providecommand{\sourcesanslight}{\tnr}
\providecommand{\sourcesanssemibold}{\tnrb}
% 西文正文:上游用 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
%
@@ -169,13 +245,50 @@
% Overfull \hbox (4.48311pt too wide) in alignment at lines 20--70
% 这种"算着够、实际差一点"的溢出,换字号/字体后会时有时无,很难查。
%
% 改法:不让它猜,直接用 \linewidth 减去左列与列间距。
% 这样改页边距(geometry)后不用再跟着调数字。
% 改法:不让它猜,直接用版心宽减去左列与列间距。
%
% ⚠️⚠️ 【必须在 \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}
\setlength{\rightcolumnlength}{%
\dimexpr\linewidth-\leftcolumn-4\tabcolsep\relax}
\AtBeginDocument{%
\setlength{\rightcolumnlength}{%
\dimexpr\textwidth-\leftcolumn-4\tabcolsep-\arrayrulewidth\relax}%
}
% Font Awesome icons aliases
\newcommand{\mailSymbol}{\faEnvelope}
BIN
View File
Binary file not shown.