简历概述的成果数字改为自动统计(列几条算几条,支持分类) #14

Closed
opened 2026-10-27 06:56:17 +00:00 by laoyang · 2 comments
Owner

诉求

简历模板第一段概述要写「发表论文 N 篇、授权专利 M 项、成果转化 K 项……」。
这些数字原本手写,每次增删一条论文就得回头改概述,容易漏改。

用户原话:

第一段是概述,就是描述一个人的总体情况,这些总体情况中的数据,能否从文件中获取?
例如,发表了多少论文,这个数字,其实是某一节的数字统计出来的,如果不能自动,
就每次都需要用户手动编写,计算论文数量,然后再更新到前面的概述中,比较麻烦,
有什么办法可以解决吗?

口径确认(用户明确)

问「论文列全部还是只列代表作」,答:

列哪些用户说了算,但是只要他列出来,就应该给他统计上去

即列几条算几条,不做手动声明的总数覆盖。分类统计:需要。

实现

给条目加类别标记,正文自动累加,概述取数。

命令 显示 计数 用在哪
\cvmark{类别} 否 +1 软著、专利、项目、转化、教研
\cvtagcount{类别} 是(加粗) +1 论文 SCI/EI/核心(原本就是 \textbf{SCI})
\cvnum{类别} 数字 — 概述单类取数
\cvnum*{A,B} 数字 — 概述多类求和

\cvtagcount 是为论文设计的:显示与计数合成一步,不会出现「改了显示忘了计数」。

关键技术决策

放弃 LaTeX 的 aux,改用独立数据文件 \jobname.cvnum。

实测发现:中文键经 aux 往返后 \ifcsname 全部匹配不上——xeCJK 把汉字设为
活动字符,键的 token 形态与写入时不一致。ASCII 键正常、中文键失效,
\typeout 确认 \cvSetNum 被调用、但 \ifcsname 查不到。

改用独立文件后中文键完全正常(实测:SCI/EI/授权/转化 全部正确读回)。

双轨存储避免跨遍累加:累加用 cvacc@<类别>(每遍从 0 起),
显示用 cvnum@<类别>(读自上一遍数据文件)。若混用,
因概述在正文之前,上一遍的值会被本遍累加叠加,数字翻倍(实测 2 → 4)。

\newcounter 的存在性检查要查 \c@X 而非 \X:\newcounter{X} 定义的是
\c@X。查错名字会让判断永远为假,每次调用都重新 \newcounter 把计数器清零,
报 Command \c@cvacc@... already defined。

踩坑记录

  1. \cvtag 与 cls 原有命令重名 —— 原本是渲染技术关键词标签的命令
    (\experience 的第 7 参数用它)。改用 \cvmark,不动原有命令。
  2. \cvmark 不能放 \experience 的关键词参数里 —— 关键词被 \foreach
    按逗号拆成单个标签,标记会被当标签名处理,不生效且报
    ! Misplaced \omit。必须放进描述参数(minipage 内)。
  3. \cvmark 不能放 longtable 单元格之外 —— 放在 \emptySeparator 前
    同样报 Misplaced \omit。
  4. \the\csname...\endcsname 要用 \relax 收尾 —— 否则报
    You can't use \relax after \the。改用 TeX 原生 \newcount 后自然消失。

验收标准

  • 概述数字自动来自条目,增删条目后自动跟随(实测删 1 条论文:4→3、
    SCI 2→1)。
  • 支持分类:SCI / EI / 核心 / 专利 / 第一发明人 / 软著 / 科研项目 /
    主持 / 负责 / 转化 / 教研,共 11 类。
  • 多类求和 \cvnum*{SCI,EI,核心} 正确(4+4+1=9)。
  • 空类别返回 0,不报错。
  • 中文类别名可用(不是只能英文)。
  • 编译 0 error / 0 Overfull / 0 Underfull,3 页。
  • 加标记后版面与基线逐行完全一致(无可见副作用)。
  • 连续 5 次编译数字稳定不漂移。
  • 全库其他模板回归与基线一致。
## 诉求 简历模板第一段概述要写「发表论文 N 篇、授权专利 M 项、成果转化 K 项……」。 这些数字原本手写,每次增删一条论文就得回头改概述,容易漏改。 用户原话: > 第一段是概述,就是描述一个人的总体情况,这些总体情况中的数据,能否从文件中获取? > 例如,发表了多少论文,这个数字,其实是某一节的数字统计出来的,如果不能自动, > 就每次都需要用户手动编写,计算论文数量,然后再更新到前面的概述中,比较麻烦, > 有什么办法可以解决吗? ## 口径确认(用户明确) 问「论文列全部还是只列代表作」,答: > 列哪些用户说了算,但是只要他列出来,就应该给他统计上去 即**列几条算几条**,不做手动声明的总数覆盖。分类统计:需要。 ## 实现 给条目加类别标记,正文自动累加,概述取数。 | 命令 | 显示 | 计数 | 用在哪 | |---|---|---|---| | `\cvmark{类别}` | 否 | +1 | 软著、专利、项目、转化、教研 | | `\cvtagcount{类别}` | 是(加粗) | +1 | 论文 SCI/EI/核心(原本就是 `\textbf{SCI}`) | | `\cvnum{类别}` | 数字 | — | 概述单类取数 | | `\cvnum*{A,B}` | 数字 | — | 概述多类求和 | `\cvtagcount` 是为论文设计的:显示与计数合成一步,不会出现「改了显示忘了计数」。 ## 关键技术决策 **放弃 LaTeX 的 aux,改用独立数据文件 `\jobname.cvnum`。** 实测发现:中文键经 aux 往返后 `\ifcsname` 全部匹配不上——xeCJK 把汉字设为 活动字符,键的 token 形态与写入时不一致。ASCII 键正常、中文键失效, `\typeout` 确认 `\cvSetNum` 被调用、但 `\ifcsname` 查不到。 改用独立文件后中文键完全正常(实测:SCI/EI/授权/转化 全部正确读回)。 **双轨存储避免跨遍累加**:累加用 `cvacc@<类别>`(每遍从 0 起), 显示用 `cvnum@<类别>`(读自上一遍数据文件)。若混用, 因概述在正文之前,上一遍的值会被本遍累加叠加,数字翻倍(实测 2 → 4)。 **`\newcounter` 的存在性检查要查 `\c@X` 而非 `\X`**:`\newcounter{X}` 定义的是 `\c@X`。查错名字会让判断永远为假,每次调用都重新 `\newcounter` 把计数器清零, 报 `Command \c@cvacc@... already defined`。 ## 踩坑记录 1. **`\cvtag` 与 cls 原有命令重名** —— 原本是渲染技术关键词标签的命令 (`\experience` 的第 7 参数用它)。改用 `\cvmark`,不动原有命令。 2. **`\cvmark` 不能放 `\experience` 的关键词参数里** —— 关键词被 `\foreach` 按逗号拆成单个标签,标记会被当标签名处理,不生效且报 `! Misplaced \omit`。必须放进描述参数(minipage 内)。 3. **`\cvmark` 不能放 `longtable` 单元格之外** —— 放在 `\emptySeparator` 前 同样报 `Misplaced \omit`。 4. **`\the\csname...\endcsname` 要用 `\relax` 收尾** —— 否则报 `You can't use \relax after \the`。改用 TeX 原生 `\newcount` 后自然消失。 ## 验收标准 - [x] 概述数字自动来自条目,增删条目后自动跟随(实测删 1 条论文:4→3、 SCI 2→1)。 - [x] 支持分类:SCI / EI / 核心 / 专利 / 第一发明人 / 软著 / 科研项目 / 主持 / 负责 / 转化 / 教研,共 11 类。 - [x] 多类求和 `\cvnum*{SCI,EI,核心}` 正确(4+4+1=9)。 - [x] 空类别返回 0,不报错。 - [x] 中文类别名可用(不是只能英文)。 - [x] 编译 0 error / 0 Overfull / 0 Underfull,3 页。 - [x] 加标记后版面与基线**逐行完全一致**(无可见副作用)。 - [x] 连续 5 次编译数字稳定不漂移。 - [x] 全库其他模板回归与基线一致。
Author
Owner

已完成并推送

commit eb3b539,已推到 main。

改动清单

文件 变化
简历/awesome-source-cv.cls +132 行,新增「成果统计」模块(\cvmark / \cvtagcount / \cvnum / \cvSetNum)
简历/section_01_headline.tex 概述 6 处数字改为 \cvnum 取数
简历/section_04~09 各条目加类别标记,共 35 处
简历/README.md +85 行,新增「概述里的成果数字自动统计」整节
.gitignore +4 行,忽略 *.cvnum 生成文件
简历/简历.pdf 重新生成

实际印出来的概述(远端 PDF 实测)

……发表相关论文 9 篇(SCI 4 篇、EI 4 篇、中文核心 1 篇),
获授权发明专利 9 项(第一发明人 6 项),完成专利成果转化 3 项,
登记软件著作权 5 项,主持各级科研项目 2 项、作为负责人承担 3 项,
项目总经费 1200 余万元,主持教研项目 4 项。

加粗的数字全部是数出来的,与 .cvnum 文件一一对应:

\cvSetNum{SCI}{4}          \cvSetNum{专利}{9}
\cvSetNum{EI}{4}           \cvSetNum{第一发明人}{6}
\cvSetNum{核心}{1}         \cvSetNum{软著}{5}
\cvSetNum{科研项目}{5}      \cvSetNum{主持}{2}
\cvSetNum{负责}{3}         \cvSetNum{转化}{3}
\cvSetNum{教研}{4}

验证

项 结果
编译 0 error / 0 Overfull / 0 Underfull,3 页
加标记后版面 与基线逐行完全一致(65/75/34 行),无可见副作用
连续 5 次编译 数字稳定不漂移(9/4/4/1 恒定)
增删条目 删 1 条论文后自动变 4→3、SCI 2→1 ✅
× 残留 0
校徽 / 字体 28.00×7.06mm 未变;Cochineal 仍在
全库其他模板 回归与基线一致(执行大纲 Over 1 为原有)
服务器 远端 PDF sha256=bc13e7b4… 与本地逐字节相同

三种口径说明(重要)

自动统计只数你列出来的条目。示例原来写「论文 40 余篇」但正文只列 9 篇代表作,
改成自动后变「9 篇」。这不是 bug,是两种口径:

  • 只列代表作(简历惯例)→ 概述写总量,那处数字应保留手写
  • 列全部→ 自动统计的数字才是真实总量

README 里已把这点写成独立小节,避免以后误用。

已知未做

项目总经费仍是手填 1200 余万元。\experience 的参数里没有经费字段,
无法从条目求和。若要自动,需给 \experience 加第 8 个参数(预算金额),
改动面较大,按你的口径「列出来才统计」也不适用(经费不是逐条列的)。

## 已完成并推送 commit `eb3b539`,已推到 `main`。 ### 改动清单 | 文件 | 变化 | |---|---| | `简历/awesome-source-cv.cls` | +132 行,新增「成果统计」模块(`\cvmark` / `\cvtagcount` / `\cvnum` / `\cvSetNum`) | | `简历/section_01_headline.tex` | 概述 6 处数字改为 `\cvnum` 取数 | | `简历/section_04~09` | 各条目加类别标记,共 35 处 | | `简历/README.md` | +85 行,新增「概述里的成果数字自动统计」整节 | | `.gitignore` | +4 行,忽略 `*.cvnum` 生成文件 | | `简历/简历.pdf` | 重新生成 | ### 实际印出来的概述(远端 PDF 实测) > ……发表相关论文 **9** 篇(SCI **4** 篇、EI **4** 篇、中文核心 **1** 篇), > 获授权发明专利 **9** 项(第一发明人 **6** 项),完成专利成果转化 **3** 项, > 登记软件著作权 **5** 项,主持各级科研项目 **2** 项、作为负责人承担 **3** 项, > 项目总经费 1200 余万元,主持教研项目 **4** 项。 加粗的数字全部是数出来的,与 `.cvnum` 文件一一对应: ``` \cvSetNum{SCI}{4} \cvSetNum{专利}{9} \cvSetNum{EI}{4} \cvSetNum{第一发明人}{6} \cvSetNum{核心}{1} \cvSetNum{软著}{5} \cvSetNum{科研项目}{5} \cvSetNum{主持}{2} \cvSetNum{负责}{3} \cvSetNum{转化}{3} \cvSetNum{教研}{4} ``` ### 验证 | 项 | 结果 | |---|---| | 编译 | 0 error / 0 Overfull / 0 Underfull,3 页 | | 加标记后版面 | 与基线**逐行完全一致**(65/75/34 行),无可见副作用 | | 连续 5 次编译 | 数字稳定不漂移(9/4/4/1 恒定) | | 增删条目 | 删 1 条论文后自动变 4→3、SCI 2→1 ✅ | | `×` 残留 | 0 | | 校徽 / 字体 | 28.00×7.06mm 未变;Cochineal 仍在 | | 全库其他模板 | 回归与基线一致(执行大纲 Over 1 为原有) | | 服务器 | 远端 PDF `sha256=bc13e7b4…` 与本地逐字节相同 | ### 三种口径说明(重要) 自动统计**只数你列出来的条目**。示例原来写「论文 40 余篇」但正文只列 9 篇代表作, 改成自动后变「9 篇」。这不是 bug,是两种口径: - **只列代表作**(简历惯例)→ 概述写总量,那处数字应保留手写 - **列全部**→ 自动统计的数字才是真实总量 README 里已把这点写成独立小节,避免以后误用。 ### 已知未做 项目总经费仍是手填 `1200 余万元`。`\experience` 的参数里没有经费字段, 无法从条目求和。若要自动,需给 `\experience` 加第 8 个参数(预算金额), 改动面较大,按你的口径「列出来才统计」也不适用(经费不是逐条列的)。
Author
Owner

需求已完成并推送(commit eb3b539),服务器端 PDF 已从 API 下载逐字节验证一致,
自动统计数字与实际印出内容全部对得上,关闭本工单。

若后续要加别的统计口径(比如「一区论文」「发明专利授权」等新类别),
或要给 \experience 加经费字段做经费自动求和,请在本单继续评论。

需求已完成并推送(commit `eb3b539`),服务器端 PDF 已从 API 下载逐字节验证一致, 自动统计数字与实际印出内容全部对得上,关闭本工单。 若后续要加别的统计口径(比如「一区论文」「发明专利授权」等新类别), 或要给 `\experience` 加经费字段做经费自动求和,请在本单继续评论。
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#14