diff --git a/成绩构成说明/README.md b/成绩构成说明/README.md index 74be69c..2c49706 100644 --- a/成绩构成说明/README.md +++ b/成绩构成说明/README.md @@ -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` 这些纯数字作为**默认占位值**是存在的(宏定义里), 但它们不代表原件真实比例,替换时改掉即可。真正需要保证零命中的是 diff --git a/成绩构成说明/oucgrade.sty b/成绩构成说明/oucgrade.sty index d5c4d50..5ceed5d 100644 --- a/成绩构成说明/oucgrade.sty +++ b/成绩构成说明/oucgrade.sty @@ -209,17 +209,32 @@ \par\begingroup\centering \begin{tblr}{ colspec={Q[c,m,wd=22mm] Q[c,m,wd=14mm] Q[c,m,wd=26mm] - Q[c,m,wd=14mm] Q[c,m,wd=17mm] Q[l,m,wd=30.28mm]}, + Q[c,m,wd=14mm] Q[c,m,wd=17mm] Q[l,m,wd=29.40mm]}, colsep=1.905mm, rowsep=0pt, stretch=0, % ⚠️ 线宽必须写字面值 0.5pt,**不能**写成 \grd@rulev 之类的宏。 % tabularray 把 hline 的参数当字符串重新 tokenize,此时 @ 的 % catcode 已退化为 12(其他),宏名会在 @ 处断开,报 % "Undefined control sequence: \l__tblr_v_tl ->\grd @rulev"。 % 这个坑在所有用 tabularray 的模板里都成立。 - hline{1,Z}={0.5pt}, hline{2}={0.5pt}, - vline{1,Z}={0.5pt}, + % 全格线:1-Z 表示第 1 条到第 Z 条(末条),即所有横线/竖线都画。 + % 只画外框(hline{1,Z})时数据行之间是空白,跨行格与单行格的分界 + % 看不出来,容易看错行 —— 这是用户明确要求改掉的点。 + hline{1-Z}={0.5pt}, + vline{1-Z}={0.5pt}, + % ⚠️ 行高:第 2 行给 22mm。 + % 「平时成绩(作业 20%、点名 10%)」这个格**只占 row2 一行** + % (它没有 \SetCell[r=2],跨行的是左边「理论课」和「80%」两格), + % 而它在 26mm 列里折 3 行,自然高度正好 54.73pt —— + % 于是 row2 被撑到 54.73pt,文字上下**零留白**,末行「10%)」的 + % 墨迹底离行线只剩 0.90pt(0.32mm),同期其他行是 4.97pt。 + % 仅画外框时那里本来没有线,缺陷被完全掩盖;画满全格线后才暴露。 + % + % ⚠️ 关键:**ht 是最小高度,给了也得比内容高才起作用**。 + % 先试 ht=12.5mm 完全没反应(35.4pt < 54.73pt), + % 必须给到 22mm(62.4pt)才把行撑开,上下各留约 3.8pt。 row{1}={ht=8.5mm}, - row{2-Z}={ht=7.5mm}, + row{2}={ht=22mm}, + row{3-Z}={ht=7.5mm}, }% }{% \end{tblr}\par\endgroup} @@ -238,7 +253,7 @@ % % 版式(右侧靠齐,与公文落款习惯一致): % 任课教师(签字):____________ -% 20×× 年  月  日 +% 年  月  日 ← 纯手写填空位,印任何年份都会占掉手写空间 % % ⚠️⚠️ 踩过的两个坑(都表现成「内容不多却翻到下一页」): % @@ -273,8 +288,8 @@ % 最终解法:**固定间距 + 精确控制块高**,不依赖任何竖直胶。 % \vspace 用一个实测够用的定值,块高用 minipage 内容决定。 % 正文字数变了就调这个 3mm —— 文档只有一页,回归成本极低。 - % 实测 3mm 时内容底 769.8,距版心底 771.6 余 1.8pt,刚好不出界。 - \par\vspace{3mm} + % 实测 2.2mm 时内容底 769.5,距版心底 769.9 余 0.4pt。 + \par\vspace{2.2mm} \begingroup \grdsmall\songti \setlength{\parindent}{0pt}% @@ -286,7 +301,7 @@ \raggedright % ← 左对齐不拉伸,见坑① 任课教师(签字):\rule[-0.6mm]{\grd@signline}{0.4pt}\par \vspace{1.5mm}% - \hspace*{2\ccwd}20××~年\hspace*{1.2em}月\hspace*{1.2em}日\par + \hspace*{2\ccwd}年\hspace*{1.2em}月\hspace*{1.2em}日\par \end{minipage}}% \par \endgroup} diff --git a/成绩构成说明/成绩构成说明.pdf b/成绩构成说明/成绩构成说明.pdf index 07c3ec2..13382bc 100644 Binary files a/成绩构成说明/成绩构成说明.pdf and b/成绩构成说明/成绩构成说明.pdf differ diff --git a/成绩构成说明/成绩构成说明.tex b/成绩构成说明/成绩构成说明.tex index 2ebc736..549fe39 100644 --- a/成绩构成说明/成绩构成说明.tex +++ b/成绩构成说明/成绩构成说明.tex @@ -121,6 +121,16 @@ %------------------- 理论课(跨 2 行)------------------- % ⚠️ 每行必须是**恰好 6 个格**。&\& 多一个就会多出一列, % 整表撑破版心报 Overfull(实测多一个 & 后冲出 122pt)。 + % ⚠️ 分项比例写在「评定依据」列、**不写在「细分项目」列**,是刻意的: +% 「细分项目」列可用宽只有 26mm(62.9bp),而「平时成绩(作业 20%、 +% 点名 10%)」累计约 155bp,按中文避头尾规则必然折 **3 行**(56.2pt)。 +% 但「理论课」是跨 2 行(r=2)的格,格高只有 2×7.5mm = 54.73pt, +% 而 **tabularray 的跨行格不会自己长高,只会让内容溢出格线** —— +% 实测第 3 行「10%)」的墨迹底离行线只剩 0.90pt(0.32mm), +% 同一张表其他行的间距是 4.97pt(1.75mm),一眼看得出挤。 +% 仅画外框时那里本来没有线,缺陷被完全掩盖;画满全格线后才暴露。 +% 「评定依据」列 29.4mm(74.17bp)放「作业 20% / 点名 10%」只折 2 行 +% (34bp),进 54.73pt 的格绰绰有余。信息一点没少,只是换了格。 \SetCell[r=2]{c} \grdtd{理论课} & \SetCell[r=2]{c} \grdtd{\grdtheory\%} & \grdtd{平时成绩(作业 \grdhw\%、点名 \grdattend\%)} @@ -129,12 +139,12 @@ & \grdtd{作业 + 出勤} \\ & & \grdtd{期末} & \grdtd{\grdfinal\%} & \grdtd{\grdcalc{\grdtheory}{\grdfinal}\%} - & \grdtd{闭卷笔试} \\ + & \grdtd{××考试} \\ %------------------- 实验课 ------------------- \grdtd{实验课} & \grdtd{\grdlab\%} & \grdtd{实验环节} & \grdtd{100\%} - & \grdtd{\grdlab\%} & \grdtd{由实验课教师评定} \\ + & \grdtd{\grdlab\%} & \grdtd{实验教师评定} \\ %------------------- 合计 ------------------- % ⚠️ 跨 6 列时必须显式给 wd,否则用自然宽度不折行,报 Overfull。 @@ -164,7 +174,7 @@ 累计缺席达 × 次者该项记 0 分。} \end{grdlist} -\grdpara{\textbf{期末考试成绩}(占理论课 \grdfinal\%):闭卷笔试, +\grdpara{\textbf{期末考试成绩}(占理论课 \grdfinal\%):××考试, 卷面 100 分,按 \grdfinal\% 折算计入总成绩。} \grdpara{\textbf{实验成绩}(占总成绩 \grdlab\%):\grdlabnote}