把任课教师手写的《成绩构成说明》做成 LaTeX 模板,与已有的 试卷归档封面/、试卷归档目录/、课程教学日历/ 保持同一套做法 (版式参数注明换算过程、字体取仓库公共字体包、真实数据全换占位符)。
试卷归档封面/
试卷归档目录/
课程教学日历/
学校下发的原件是一份填过的实例:两段流水账文字 + 标题,没有表格、 没有签字栏。用户评价「不算特别好,你再优化一下」,并明确要求 补上任课教师签字的地方和年月日。
成绩构成说明/oucgrade.sty
成绩构成说明/成绩构成说明.tex
成绩构成说明/成绩构成说明.pdf
成绩构成说明/README.md
① 拆掉「三层百分数混用不同基准」的歧义(核心)
原件原文:
理论课成绩占总成绩的80%。理论课成绩包括平时成绩、期末考试成绩。 平时成绩占30%(作业占20%,点名占10%),期末考试成绩占70%。 实验成绩占总成绩的20%。由实验课老师提供。
问题在于百分数的基准不是同一个:
「平时占 30%」看着像占总成绩三成,实际只有 24%。这是教务抽查 最常挑错的地方,学生也容易误读。
改法:表格并置「占本类」与「占总成绩」两列,后者由 \grdcalc 自动算出(\grdcalc{80}{30} → 24),不给心算留余地。
\grdcalc
\grdcalc{80}{30}
24
② 层级从句子搬进表格
6 列表格,一级项目跨行合并:项目 / 占本类 / 细分项目 / 占本类 / 占总成绩 / 评定依据。
③ 补「怎么算」这一层
原件只说比例,没说作业怎么平均、缺交怎么扣、点名缺几次记 0 —— 这些是学生真会问的、也是申诉依据。新增「二、分项说明」用列表写清。
④ 补签字栏(用户明确要求)
右下角落款,含签字线(\rule 40mm)和「20×× 年 月 日」。 没有任课教师签字的成绩构成说明,教务归档时不认。
\rule
另新增「三、成绩评定与异议」一节(说明取整与申诉期限), 用 \def\grdwithini{0} 可一键关闭。
\def\grdwithini{0}
模板会自动检查三组加法:
平时 + 期末 = 100 作业 + 点名 = 平时 理论课 + 实验课 = 100
不通过时 .log 打警告,PDF 标题正下方印一行红字提示。
.log
为什么做这个:原件那句「平时 30%(作业 20%,点名 10%)」 正是靠心算才看得出 20+10=30。这类算术错误在一份要归档的文件里 很难被自己发现,写进模板检查比在 README 写「请自查」可靠。
已做负面测试(关键,证明确实有用而不是摆设):
\grdhw
比例不自洽 --- 作业+点名: 实际 25+10, 应为 30
警告放开头而不是文末 —— 文末会被签字栏挤到第 2 页,没人翻就等于没提示。
f6d2052e80b2
数字逻辑
2025
秋季
杨永全
实验课老师
.sty
.tex
① .tex 里不能写带 @ 的宏名 @ 在 .tex 中 catcode 是 12 不是 11,写 \grd@chk 会被拆成 \grd + @chk,报 Missing \begin{document} 并连累后面所有内容。 规矩:带 @ 的宏定义在 .sty,.tex 只调公开接口。
@
\grd@chk
\grd
@chk
Missing \begin{document}
② tabularray 的 hline{} 里不能用带 @ 的宏 它把参数当字符串重新 tokenize,此时 catcode 已退化,宏名在 @ 处断开, 报 \l__tblr_v_tl ->\grd @rulev。规矩:线宽写字面值 {0.5pt}。
hline{}
\l__tblr_v_tl ->\grd @rulev
{0.5pt}
③ 签字栏被挤到第 2 页(试了四种写法)
\par\vspace{4mm}
\vfill
\vspace*{5mm}
\par\vspace{3mm}
结论:单页文档里别指望竖直胶自动贴底,固定间距 + 实测校准最稳。
④ minipage 内部用 \hfill 做右对齐 → 字距被拉到 34.8pt 一字 正解:内部 \raggedright,\hfill 只放外面 (\makebox[\textwidth][r]{...})。
\hfill
\raggedright
\makebox[\textwidth][r]{...}
⑤ 列表引导符「·」缺字 本库 OUC Serif 子集没有 ·(U+00B7) 和 •(U+2022), 报 Missing character,印出来空白。实测有 ●(U+25CF) 可用, 且 fonts.tex 已把它归入 CJK 字符类。
·
•
Missing character
●
fonts.tex
全部走 ../fonts.tex。原件标题用方正楷体_GB2312(商业字体, 不能分发),改用语霞鹜文楷(同属楷书形态,SIL OFL 1.1)。 这是有意的替换,已在 README 注明,不是遗漏。
../fonts.tex
README.md
#8 是课程教学日历(附件3,16周表格)的模板;本单是成绩构成说明,原件、版式、验收标准完全不同,是独立的新交付物,可单独验收。用户同一次发言里提了两件事:①新做成绩构成说明 ②教学日历删掉考核方式那一行 —— ②已作为补充追加到 #8。
提交 a29f193 新增成绩构成说明 LaTeX 模板(成绩构成说明/) #9,已推送 origin/main。
a29f193
origin/main
这一轮花时间最多的地方不是写文档,是签字栏定位(README 坑 3)。 试了 \vspace / \vfill / \vfill+块内留白 三种,前两种分别导致 翻页和出界,第三种又回到翻页。最后用固定 \vspace{3mm} + 实测校准 才同时满足「一页」「不出界」。
\vspace
\vfill+块内留白
\vspace{3mm}
教训:单页文档里不要指望竖直胶自动贴底。TeX 的 \vfill 是 可伸缩胶,但当它与不可压缩的块高之和超过剩余空间时,它不会"尽量压缩", 而是接受一次坏断页 —— 表现就是「明明还剩 66pt,却翻页了」。 这种情况调 \vfill 永远调不出来,必须换成固定间距。
中间表格,要把线都画上,中间空白的容易看错行。最后的年月日,也不要带20xx了。
两处都属本单范围,不另开单。
原来只画外框 + 表头分割线(hline{1,Z} + hline{2} + vline{1,Z}), 数据行之间和列之间全是空白,跨行格(理论课)与单行格的分界也看不出来, 容易看错行。
hline{1,Z}
hline{2}
vline{1,Z}
改为 hline{1-Z}={0.5pt} 与 vline{1-Z}={0.5pt},所有格线全画。
hline{1-Z}={0.5pt}
vline{1-Z}={0.5pt}
连带必须改列宽:只画外框时表宽里不含内部竖线;画上 5 条内部竖线后 表宽多出 5×0.5 = 2.5pt,编译直接报 Overfull \hbox (2.47554pt too wide)。最后一列 30.28mm → 29.40mm 补回。
5×0.5 = 2.5pt
Overfull \hbox (2.47554pt too wide)
连带暴露出一个被掩盖的缺陷:「理论课」左边跨 2 行,但右边「平时成绩 (作业 20%、点名 10%)」只占 row2 一行、在 26mm 列里折 3 行,自然高 正好 54.73pt —— 于是 row2 被撑到 54.73pt,文字上下零留白,末行 「10%)」的墨迹底离行线只剩 0.90pt(0.32mm),而同一张表其他行是 4.97pt(1.75mm)。只画外框时那里本来没有线,缺陷完全被掩盖。
治法:row{2}={ht=22mm}。关键是 ht 是最小高度,给了还得比内容高才 起作用 —— 先试 12.5mm(35.4pt < 54.73pt)完全没反应,给到 22mm (62.4pt)才把行撑到 62.86pt,上下各留约 3.8pt,末行墨迹底离行线 4.08pt(1.44mm),与其他行同量级。 另注:ht 按表格行号给,抬高 row{3}(期末行)只移动中间那条线, 对跨行块高度没有影响。
row{2}={ht=22mm}
ht
row{3}
顺带把「由实验课教师评定」缩为「实验教师评定」(2 行 → 1 行), 省出 11.3pt 给上面那个 3 行格用。
\hspace*{2\ccwd}20××~年\hspace*{1.2em}月\hspace*{1.2em}日 → \hspace*{2\ccwd}年\hspace*{1.2em}月\hspace*{1.2em}日
\hspace*{2\ccwd}20××~年\hspace*{1.2em}月\hspace*{1.2em}日
\hspace*{2\ccwd}年\hspace*{1.2em}月\hspace*{1.2em}日
成绩构成说明是学期末签署的文件,年份由签字人当场手写;模板里预留 20×× 反而占掉手写空间、并诱导使用者去改占位符。
20××
复查泄漏时发现本单上一版遗留:
成绩构成说明.tex
××考试
前者改占位符,中间那条删掉关键词清单、改为文字说明, 后者改占位。已复查 10 个关键词全部零命中(2022 剩余 3 处为 U+2022 码位与 TeX Live 版本号,属误报)。
2022
U+2022
两处修改都已落地,实测验收通过。
oucgrade.sty
hline{1-Z}
vline{1-Z}
row{2-Z}={ht=7.5mm}
row{3-Z}={ht=7.5mm}
20××~年 月 日
年 月 日
creationDate
10 个关键词零命中(含注释与 README)。剩余 2022 3 处为 U+2022 码位与 TeX Live 版本号,属误报。
README 同步更新:新增「行高:ht 是最小值,且跨行格不会自己长高」 与「1-Z vs 1,Z」两节,列宽表与签字栏说明按现状修正。
1-Z
1,Z
关闭本单。
No dependencies set.
The note is not visible to the blocked user.
新增成绩构成说明 LaTeX 模板(成绩构成说明/)
把任课教师手写的《成绩构成说明》做成 LaTeX 模板,与已有的
试卷归档封面/、试卷归档目录/、课程教学日历/保持同一套做法(版式参数注明换算过程、字体取仓库公共字体包、真实数据全换占位符)。
背景
学校下发的原件是一份填过的实例:两段流水账文字 + 标题,没有表格、
没有签字栏。用户评价「不算特别好,你再优化一下」,并明确要求
补上任课教师签字的地方和年月日。
产出
成绩构成说明/oucgrade.sty成绩构成说明/成绩构成说明.tex成绩构成说明/成绩构成说明.pdf成绩构成说明/README.md相对原件的 4 项改进
① 拆掉「三层百分数混用不同基准」的歧义(核心)
原件原文:
问题在于百分数的基准不是同一个:
「平时占 30%」看着像占总成绩三成,实际只有 24%。这是教务抽查
最常挑错的地方,学生也容易误读。
改法:表格并置「占本类」与「占总成绩」两列,后者由
\grdcalc自动算出(
\grdcalc{80}{30}→24),不给心算留余地。② 层级从句子搬进表格
6 列表格,一级项目跨行合并:项目 / 占本类 / 细分项目 / 占本类 /
占总成绩 / 评定依据。
③ 补「怎么算」这一层
原件只说比例,没说作业怎么平均、缺交怎么扣、点名缺几次记 0 ——
这些是学生真会问的、也是申诉依据。新增「二、分项说明」用列表写清。
④ 补签字栏(用户明确要求)
右下角落款,含签字线(
\rule40mm)和「20×× 年 月 日」。没有任课教师签字的成绩构成说明,教务归档时不认。
另新增「三、成绩评定与异议」一节(说明取整与申诉期限),
用
\def\grdwithini{0}可一键关闭。附带做了个小工具:比例自洽校验
模板会自动检查三组加法:
不通过时
.log打警告,PDF 标题正下方印一行红字提示。为什么做这个:原件那句「平时 30%(作业 20%,点名 10%)」
正是靠心算才看得出 20+10=30。这类算术错误在一份要归档的文件里
很难被自己发现,写进模板检查比在 README 写「请自查」可靠。
已做负面测试(关键,证明确实有用而不是摆设):
.log\grdhw20 → 25比例不自洽 --- 作业+点名: 实际 25+10, 应为 30警告放开头而不是文末 —— 文末会被签字栏挤到第 2 页,没人翻就等于没提示。
验收
f6d2052e80b2)数字逻辑/2025/秋季/杨永全/实验课老师等关键词在.sty与.tex中全部零命中(含注释)五个坑(都写进 README 了)
①
.tex里不能写带@的宏名@在.tex中 catcode 是 12 不是 11,写\grd@chk会被拆成\grd+@chk,报Missing \begin{document}并连累后面所有内容。规矩:带
@的宏定义在.sty,.tex只调公开接口。② tabularray 的
hline{}里不能用带@的宏它把参数当字符串重新 tokenize,此时 catcode 已退化,宏名在
@处断开,报
\l__tblr_v_tl ->\grd @rulev。规矩:线宽写字面值{0.5pt}。③ 签字栏被挤到第 2 页(试了四种写法)
\par\vspace{4mm}+ minipage\vfill顶到底部\vfill+ 块内\vspace*{5mm}\vfill与块高之和超额时 TeX 只搬块不压胶)\par\vspace{3mm}+ minipage结论:单页文档里别指望竖直胶自动贴底,固定间距 + 实测校准最稳。
④ minipage 内部用
\hfill做右对齐 → 字距被拉到 34.8pt 一字正解:内部
\raggedright,\hfill只放外面(
\makebox[\textwidth][r]{...})。⑤ 列表引导符「·」缺字
本库 OUC Serif 子集没有
·(U+00B7) 和•(U+2022),报
Missing character,印出来空白。实测有●(U+25CF) 可用,且
fonts.tex已把它归入 CJK 字符类。字体
全部走
../fonts.tex。原件标题用方正楷体_GB2312(商业字体,不能分发),改用语霞鹜文楷(同属楷书形态,SIL OFL 1.1)。
这是有意的替换,已在 README 注明,不是遗漏。
顺带更新
README.md:模板表加一行,计数 9 → 10fonts.tex头注释:九个模板 → 十个模板为什么单独建单
#8 是课程教学日历(附件3,16周表格)的模板;本单是成绩构成说明,原件、版式、验收标准完全不同,是独立的新交付物,可单独验收。用户同一次发言里提了两件事:①新做成绩构成说明 ②教学日历删掉考核方式那一行 —— ②已作为补充追加到 #8。
验收与收尾
提交
a29f193新增成绩构成说明 LaTeX 模板(成绩构成说明/) #9,已推送origin/main。交付
成绩构成说明/oucgrade.sty成绩构成说明/成绩构成说明.tex成绩构成说明/成绩构成说明.pdf成绩构成说明/README.md最终验收
f6d2052e80b2,完全一致数字逻辑/2025/秋季/杨永全/实验课老师全部零命中\grdhw20→25 时 log 报「实际 25+10,应为 30」,PDF 顶部现警告;改回后消失一点说明
这一轮花时间最多的地方不是写文档,是签字栏定位(README 坑 3)。
试了
\vspace/\vfill/\vfill+块内留白三种,前两种分别导致翻页和出界,第三种又回到翻页。最后用固定
\vspace{3mm}+ 实测校准才同时满足「一页」「不出界」。
教训:单页文档里不要指望竖直胶自动贴底。TeX 的
\vfill是可伸缩胶,但当它与不可压缩的块高之和超过剩余空间时,它不会"尽量压缩",
而是接受一次坏断页 —— 表现就是「明明还剩 66pt,却翻页了」。
这种情况调
\vfill永远调不出来,必须换成固定间距。追加需求(用户反馈)
两处都属本单范围,不另开单。
① 表格格线全画
原来只画外框 + 表头分割线(
hline{1,Z}+hline{2}+vline{1,Z}),数据行之间和列之间全是空白,跨行格(理论课)与单行格的分界也看不出来,
容易看错行。
改为
hline{1-Z}={0.5pt}与vline{1-Z}={0.5pt},所有格线全画。连带必须改列宽:只画外框时表宽里不含内部竖线;画上 5 条内部竖线后
表宽多出
5×0.5 = 2.5pt,编译直接报Overfull \hbox (2.47554pt too wide)。最后一列 30.28mm → 29.40mm 补回。连带暴露出一个被掩盖的缺陷:「理论课」左边跨 2 行,但右边「平时成绩
(作业 20%、点名 10%)」只占 row2 一行、在 26mm 列里折 3 行,自然高
正好 54.73pt —— 于是 row2 被撑到 54.73pt,文字上下零留白,末行
「10%)」的墨迹底离行线只剩 0.90pt(0.32mm),而同一张表其他行是
4.97pt(1.75mm)。只画外框时那里本来没有线,缺陷完全被掩盖。
治法:
row{2}={ht=22mm}。关键是ht是最小高度,给了还得比内容高才起作用 —— 先试 12.5mm(35.4pt < 54.73pt)完全没反应,给到 22mm
(62.4pt)才把行撑到 62.86pt,上下各留约 3.8pt,末行墨迹底离行线
4.08pt(1.44mm),与其他行同量级。
另注:
ht按表格行号给,抬高row{3}(期末行)只移动中间那条线,对跨行块高度没有影响。
顺带把「由实验课教师评定」缩为「实验教师评定」(2 行 → 1 行),
省出 11.3pt 给上面那个 3 行格用。
② 签字栏去掉年份
\hspace*{2\ccwd}20××~年\hspace*{1.2em}月\hspace*{1.2em}日→
\hspace*{2\ccwd}年\hspace*{1.2em}月\hspace*{1.2em}日成绩构成说明是学期末签署的文件,年份由签字人当场手写;模板里预留
20××反而占掉手写空间、并诱导使用者去改占位符。③ 顺带修掉的真实数据泄漏(3 处)
复查泄漏时发现本单上一版遗留:
README.md第 85 行:引用原件全文时把真实课程名与学年原样贴出README.md第 297 行:「真实数据零泄漏」这一节为了证明零泄漏,反而把真实课程名、学年、教师姓名原样列了出来 —— 自相矛盾
成绩构成说明.tex:「闭卷笔试」是原件事实,改为××考试前者改占位符,中间那条删掉关键词清单、改为文字说明,
后者改占位。已复查 10 个关键词全部零命中(
2022剩余 3 处为U+2022码位与 TeX Live 版本号,属误报)。验收(实测)
跨行格内无中线、合计行跨 6 列无内部竖线(逐条清点确认)
已完成并推送(95afc9c)
两处修改都已落地,实测验收通过。
改动
oucgrade.sty格线hline{1,Z}+hline{2}+vline{1,Z}hline{1-Z}+vline{1-Z}oucgrade.sty列宽oucgrade.sty行高row{2-Z}={ht=7.5mm}row{2}={ht=22mm}+row{3-Z}={ht=7.5mm}oucgrade.sty签字栏20××~年 月 日年 月 日成绩构成说明.tex成绩构成说明.tex验收(实测数据)
313.26 / 335.02 / 356.78 / 底框 378.54)+ 合计行下方 1 条;
竖线 7 条按行分段——跨行格(理论课/80%)内无中线、
合计行跨 6 列无内部竖线,均逐条确认
(md5 不同仅
creationDate时间戳)真实数据复查
10 个关键词零命中(含注释与 README)。剩余
20223 处为U+2022码位与 TeX Live 版本号,属误报。README 同步更新:新增「行高:ht 是最小值,且跨行格不会自己长高」
与「
1-Zvs1,Z」两节,列宽表与签字栏说明按现状修正。关闭本单。