成绩构成说明:表格格线全画 + 签字栏去掉年份占位 #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。
This commit is contained in:
2026-10-27 09:45:58 +08:00
parent a29f193cff
commit 95afc9caa6
4 changed files with 85 additions and 20 deletions
+49 -9
View File
@@ -82,7 +82,7 @@ xelatex 成绩构成说明.tex
```
成绩构成说明
数字逻辑 2025学年 秋季学期 期末考试
×××× 20××学年 ×季学期 期末考试
理论课成绩占总成绩的80%。理论课成绩包括平时成绩、期末考试成绩。
平时成绩占30%(作业占20%,点名占10%),期末考试成绩占70%。
实验成绩占总成绩的20%。由实验课老师提供。
@@ -125,7 +125,11 @@ xelatex 成绩构成说明.tex
**这是用户明确要求补的。** 没有任课教师签字的成绩构成说明,在教务
归档时不被认作有效文件。
**改法**:右下角落款,含签字线与「20×× 年 月 日」。
**改法**:右下角落款,含签字线与「年 月 日」三个手写填空位。
⚠️ **「年 月 日」不印年份**。成绩构成说明是学期末签署的文件,年份
由签字人当场手写;模板里预留 `20××` 反而会占掉手写空间、并诱导
使用者去改占位符。所以这一行只有三个字 + 两处 `\hspace` 间距。
### 另外新增(可关闭)
@@ -215,13 +219,35 @@ TeX 默认 pt 是 1/72.27 in,差 0.36%。写 `14pt` 实测输出 14.05。
| 细分项目 | 26.00mm | 平时成绩 / 期末 |
| 占本类 | 14.00mm | 30% |
| 占总成绩 | 17.00mm | 24% |
| 评定依据 | 30.28mm | 作业 + 出勤 |
| 评定依据 | 29.40mm | 作业 + 出勤 |
**Σ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`。
⚠️ **画满全格线之后每列还要再扣 0.5pt**。只画外框时表宽里不含内部
竖线;一旦 `vline{1-Z}` 把 5 条内部竖线都画上,表宽就多出
`5×0.5 = 2.5pt`,编译报 `Overfull \hbox (2.47554pt too wide)`。
所以最后一列从 30.28mm 收到 29.40mm(−2.5pt)补回来。
### 行高:`ht` 是最小值,且跨行格不会自己长高
这两点一起踩过,都表现为"字贴着格线":
| `ht` 是否小于内容高 | 结果 |
| :-- | :-- |
| 是(如 `ht=7.5mm` < 54.73pt) | 行被内容撑到 54.73pt,**上下零留白**,末行墨迹底离行线只剩 0.90pt(0.32mm),其他行是 4.97pt(1.75mm)—— 一眼看出挤 |
| 否(`ht=22mm` = 62.4pt) | 行高 62.86pt,上下各留约 3.8pt,末行墨迹底离行线 4.08pt(1.44mm),与其他行同量级 |
所以 **`ht` 给了不等于生效,必须大于内容自然高度**。本例「平时成绩
(作业 20%、点名 10%)」在 26mm 列里折 3 行,自然高 54.73pt
(= 2×17bp + 盒高),要撑开就得给到 22mm。
`ht` 按**表格行号**给,不是按逻辑块:`row{1}` 是表头、`row{2}` 是
「理论课/平时成绩」那一行。抬高 `row{3}`(「期末」行)只会移动中间
那条线,对跨行块的高度没有影响。
## 五个坑
### 坑 1:`.tex` 里写带 `@` 的宏名
@@ -246,6 +272,22 @@ catcode 已经退化,宏名在 `@` 处断开。
**规矩**:`hline` / `vline` 的线宽写字面值,别用宏包一层。
⚠️ 关于 `1-Z` 与 `1,Z`:
| 写法 | 含义 | 效果 |
| :-- | :-- | :-- |
| `hline{1,Z}` | 第 1 条 + 最后 1 条 | 只有顶框和底框 |
| `hline{1-Z}` | 第 1 条到末条(全部) | 每条行线都画 |
本模板用 `1-Z`:**所有格线都画满**。只画外框时,跨行格(理论课)
与单行格的分界、以及数据行之间全是空白,非常容易看错行。这是
用户明确要求改掉的点。
代价是每列要再扣 0.5pt 表宽(见上文「画满全格线之后每列还要再扣」
一节),并且暴露出一个原本被掩盖的缺陷:跨行格里的第 3 行字一直
是贴着格线的(详见上文「行高」一节)。**画满格线会让所有"零留白"
的排版问题显形** —— 这是好事,但要预留调 `ht` 的时间。
### 坑 3:签字栏被挤到第 2 页
试过四种写法,只有最后一种同时满足「一页」+「不出界」:
@@ -290,12 +332,10 @@ minipage 里的行末会被拉伸到满宽,12pt 的字出现夸张字距 —
原件是**填过的实例**(真实课程名、学年、教师姓名、全部比例)。
本模板把这些逐项换成占位符。
已 grep 确认以下关键词在 `oucgrade.sty` 与 `成绩构成说明.tex` 中
**零命中**(含注释):
```
数字逻辑 2025 秋季 杨永全 80% 30% 20% 10% 70%
```
已 grep 确认以下关键词在 `oucgrade.sty`、`成绩构成说明.tex` 与 `README.md`
中**零命中**(含注释):原件实例的课程名、学生人数、开课号、教师姓名、
单位名称,以及原件出现过的具体年份。本 README 不列出这些原文,
避免「为了证明零泄漏而把真实信息写进来」。
注意:`80`/`20`/`30` 这些纯数字作为**默认占位值**是存在的(宏定义里),
但它们不代表原件真实比例,替换时改掉即可。真正需要保证零命中的是