用户提供原件(学校通用版):
C:\Users\Yongquan\SynologyDrive\授课\数字逻辑\2025\归档\附件3:中国海洋大学课程教学日历(理论课程).doc
要求「改成 latex」。用户明确要求:不要用里面真实的数据——原件里是数字逻辑课 的真实开课信息(开课号、任课教师姓名、学生人数、16 周真实日期与教学内容), 模板里必须全部换成虚构/占位内容,只复刻版式。
课程执行大纲/
课程执行大纲/ 里也有一张「教学日历」表,但那是课程执行大纲这份文件内部的 表 1(9pt 宋体、6 列、整份文件 5 页)。本次是学校下发的独立单张表格 (附件3,10.5pt、7 列、2 页、带院系负责人签字区),两者不是同一份东西, 不能并入,需新建独立模板目录 课程教学日历/。
课程教学日历/
ouccal.sty
课程教学日历.tex
课程教学日历.pdf
README.md
fonts.tex
pgSz
pgMar
tblW
tblInd
tblGrid
tblCellMar
w:sz=4
w:sz=21
jc=center
jc=left
w:line=460 lineRule=exact
trHeight
xelatex 课程教学日历.tex
bp
试卷归档目录/README.md
提交 25dc872(commit 信息带 #8),已 push 到 origin/main。
25dc872
#8
origin/main
课程教学日历/oucal.sty
课程教学日历/课程教学日历.tex
课程教学日历/课程教学日历.pdf
课程教学日历/README.md
同步改了根 README.md(模板清单加一行、七→九)与 fonts.tex(头注释)。
原 .doc 是一份填过的实例,模板把所有字段换成占位符。已 grep 确认 oucal.sty 与 课程教学日历.tex 中以下关键词零命中:
.doc
oucal.sty
数字逻辑 080502101231 杨永全 2021 2022 逻辑代数 卡诺图 触发器 时序线路 组合线路 信息科学与工程学部 闭卷考试
正文里的「××××基础」「×××设计」也是抽象过的占位(原件的真实章节名 「逻辑代数基础」「组合线路设计」等已全部去掉)。
git clone
1. 页数 3 页(原件 2 页)
原件第一周(第 2 行)的段落没写 w:spacing,随 docGrid (linePitch=312 twips = 15.6pt)排,而行高 47.3pt;同为 3 行的第五周 是 69.5pt。同一张表 17 行 23pt、1 行 15.6pt —— 这是原件的疏漏。
w:spacing
docGrid
linePitch=312
本模板不复制这个不一致,全表统一 23pt,故该行高 69.3pt(多 22.0pt), 总高 1132.3pt(原件 1114.2pt),正好顶到第 3 页。已记进 README 与 sty 注释。
2. 表头不加粗
视觉上表头醒目,但原 .doc 表头格只有 jc=center、没有 <w:b/>。 照抄原件,不加粗。
<w:b/>
3. 周次列对齐前后不一致(照抄)
原件第 110 周 jc=left(x=50.40pt),第 1116 周 jc=center (x=51.72pt)。本模板 x=50.65 / 51.75,保留这个不一致, 因为改成统一反而与原件对不上。
\fontsize
w:line=460 exact
\baselineskip
rowsep
\rule
ht
\linespread
\SetCell[c=7]{c}
c
wd
\leftskip
geometry
\vspace*
\par
\newline
临时目录 _conv3/(WPS 转换中间产物、标定脚本)与仓库内实验文件 (_exp/、_t.tex)已删除,仓库里只留 .sty / .tex / .pdf / README.md。
_conv3/
_exp/
_t.tex
用户反馈:最下面的年月日怎么都重合在一起了。
第 3 页底部签字栏第二行,20×× 与「年」「月」挤成一团墨迹,「月」几乎完全压在「年」上。
20××
原第 2 行写法(从原件空格反推得到):
\hspace*{92.604mm}\calfontC \calgrade~年\hspace{-8.35mm}月\hspace{3.34mm}日
反查原件 PDF 的 span 坐标后确认:
原件里年份是空的 —— 原文就是「 年」+两个空格+「月」, 留白给老师手写签日期。\hspace*{92.604mm} 是按「 年」的实际位置 反解出来的偏移量。
年
月
\hspace*{92.604mm}
我在填空模板里加了 \calgrade(20××,约 31.5pt 宽)插在「年」前面, 整串被推后到 x=399.74;后面再用 \hspace{-8.35mm} 去拽「月」, 负 kern 只减「年」「月」之间的空隙,空隙减成负数就变成重叠。
\calgrade
\hspace{-8.35mm}
两层原因:
\hspace
改成让年份右对齐到「年」的左边界,而不是让「月」去追年份:
\hspace*{81.49mm}% {\calfontC\makebox[34.16pt][r]{\calgrade}年}% ← 年份右对齐,盒右界 = 355.08 \hspace*{10.60pt}% \calfontC 月\hspace*{10.60pt}日\par
盒宽 34.16pt = 355.53 − 321.37(盒左与上行「院(系)」321.00 对齐), 装得下 20××(2 半角 10.5 + 2 全角 21 ≈ 31.5pt)。
三个字完全分开,无重叠,且全部与原件对齐。
闭卷
开卷
\calassess
提交 3b67659 修复签字栏年月日重叠:年份改用定宽右对齐盒子 #8 已推送 origin/main
3b67659
反查原件 PDF 的 span 坐标确认:原件里年份是空的,原文就是 「 年」+两个空格+「月」,留白给老师手写签日期。 \hspace*{92.604mm} 是按「 年」的实际位置反解出来的。
我在模板里加了 \calgrade(20××,约 31.5pt)插在「年」前面, 整串被推到 x=399.74;后面用 \hspace{-8.35mm} 去拽「月」, 负 kern 只减「年」「月」之间的空隙,减成负数就成了重叠。
负 \hspace 不能把已经排出去的「年」收回来,只能压缩后续间距。 正确做法是让年份右对齐到「年」的左边界,而不是让「月」去追年份:
\hspace*{81.49mm}% {\calfontC\makebox[34.16pt][r]{\calgrade}年}% 盒右界 = 355.08 \hspace*{10.60pt}\calfontC 月\hspace*{10.60pt}日\par
唯一能让「年」位置固定的写法:把年份塞进定宽 \makebox, 让盒宽吸收占位符长度变化。用户换成 2026 或 2026 年 10 月 都不会再动「月」「日」的位置。
\makebox
2026
2026 年 10 月
三字完全分开,零重叠。
README 里这一节现在写清了为什么要定宽盒子,不只是怎么写。 下次有人换年份格式时能看懂约束,不会又把三个字叠回去。
用户要求:20××年 这个地方不用填了,直接就是「年 月 日」。
20××年
删除 \calgrade 宏(以及它在签字栏的 \makebox 包装),签字栏第二行改为:
\hspace*{93.517mm}\calfontC 年\hspace*{10.55pt}月\hspace*{10.55pt}日\par
现在是纯空白填空位,打印出来就是「年 月 日」,老师手写签日期。
反查原件 PDF 的逐字符坐标时发现一个重要事实:原件那一行其实印着 4 个半角数字(x=331.44~352.50),只是在 span 级过滤时被漏掉了 —— 之前误以为「原件年份是空的」。数字后跟一个空格,再是「年」。
三个字与学校原表逐字重合,只是年份那段留白了。
目标 x = 355.09pt = 125.23mm。caloutside 的 \leftskip 是 15.963mm、 geometry left 是 15.787mm,叠加后排版起点在 31.75mm,故 125.23 − 31.75 = 93.48mm。实测 93.48mm 落在 354.98(偏左 0.10pt), 加 0.037mm 微调到 93.517mm,实测 355.09(偏右 0.01pt)。
caloutside
left
125.23 − 31.75 = 93.48mm
问题不是排版技巧不够,而是那行本来就不该有年份。
上一版为了塞进 20×× 占位符,用 \hspace{-8.35mm} 去拽「月」, 结果三字重叠 —— 因为负 \hspace 只能压缩后续间距,减到负数就是重叠, 不能把已经排出去的字符收回来。
去掉占位符后,这一行只有三个中文字,宽度恒定,位置永远稳定, 不存在任何漂移风险。
98e5fa9edbbb
\hspace*{81.52mm}{\calfontC\makebox[34.0pt][r]{2026}年}...
88b3e08 签字栏去掉年份占位符,只保留手写填空位「年 月 日」 #8
88b3e08
用户要求:教学日历中,考核方式那一块去掉吧。因为有单独的成绩构成 说明文件,那个就不需要了。
原表格 18 行(表头 + 16 周 + 考核方式),现 17 行(表头 + 16 周)。
\SetCell[c=7]{m,wd=142.34mm}
row{18}={ht=69.00pt}
表头上方课程信息里的【考核方式】字段(\calassess)保留 —— 那是一个字段占位,不占用一整行,与「单独的说明文件」不重复。 若你连这个也要去掉,删掉 .tex 第 85 行的 \hfill 【考核方式】~\calassess 即可。
.tex
\hfill 【考核方式】~\calassess
删掉这一行后总高减少 69.5pt,表格不再顶到第 3 页,正好 2 页, 与学校原件页数一致。之前 README 里记的「3 页(原件 2 页)」这个取舍 现在不需要了 —— 那个取舍的起因是「第一周行距照原件会多 22pt」, 现在整个表短了 69pt,这个差额被吸收了。
.tex 里保留了一段注释,写明若要恢复该行需要:
row{18}={ht=69.00pt},
\\
a458913 教学日历删掉表格末尾的「课程考核及评价方式」行(另有独立成绩构成说明) #8
a458913
No dependencies set.
The note is not visible to the blocked user.
背景 / 诉求
用户提供原件(学校通用版):
要求「改成 latex」。用户明确要求:不要用里面真实的数据——原件里是数字逻辑课
的真实开课信息(开课号、任课教师姓名、学生人数、16 周真实日期与教学内容),
模板里必须全部换成虚构/占位内容,只复刻版式。
与已有
课程执行大纲/的关系课程执行大纲/里也有一张「教学日历」表,但那是课程执行大纲这份文件内部的表 1(9pt 宋体、6 列、整份文件 5 页)。本次是学校下发的独立单张表格
(附件3,10.5pt、7 列、2 页、带院系负责人签字区),两者不是同一份东西,
不能并入,需新建独立模板目录
课程教学日历/。涉及范围
课程教学日历/:ouccal.sty—— 版式包课程教学日历.tex—— 正文入口(虚构课程填充)课程教学日历.pdf—— 成品样张README.md—— 用法 / 版式参数 / 实测校验 / 踩坑记录README.md:模板清单加一行;「八个模板」改「九个模板」fonts.tex:头注释「八个模板」改「九个模板」原件关键数据(已从 docx XML 提取)
pgSz11906×16838 twipspgMartop/bottom 1440、left/right 1800 twipstblW9900 twipstblInd−792 twipstblGrid7 列 900/1449/1029/2669/1366/1224/1263 twipstblCellMarleft/right 108、top/bottom 0 twipsw:sz=4w:sz=21(Normal 样式)jc=centerjc=leftw:line=460 lineRule=exacttrHeight验收标准
xelatex 课程教学日历.tex编译通过,2 页,零警告(Overfull / Underfull / 缺字 = 0)。bp单位)教师姓名(杨永全)、学生人数(75)、2021/2022 年份、16 周真实日期
(9月20日至9月24日 …)、真实教学内容(第一章逻辑代数基础 …)、
作业编号(1.1-1.6 …)——全部换成虚构内容。验收时 grep 确认零命中。
试卷归档目录/README.md体例写。已完成并推送
提交
25dc872(commit 信息带#8),已 push 到origin/main。新增文件
课程教学日历/oucal.sty课程教学日历/课程教学日历.tex课程教学日历/课程教学日历.pdf课程教学日历/README.md同步改了根
README.md(模板清单加一行、七→九)与fonts.tex(头注释)。真实数据零泄漏(用户明确要求)
原
.doc是一份填过的实例,模板把所有字段换成占位符。已 grep 确认oucal.sty与课程教学日历.tex中以下关键词零命中:正文里的「××××基础」「×××设计」也是抽象过的占位(原件的真实章节名
「逻辑代数基础」「组合线路设计」等已全部去掉)。
实测校验(pymupdf 读两版 PDF 逐位对比)
表格顶线 242.60 = 242.60,Δ 均为 0.00pt;课程信息两行 Δ ≤ 0.03pt;
签字栏「院(系)负责人签字」x=321.00→320.99
bp)git clone到干净目录重编,3 页像素级完全一致三个需要说明的取舍
1. 页数 3 页(原件 2 页)
原件第一周(第 2 行)的段落没写
w:spacing,随docGrid(
linePitch=312twips = 15.6pt)排,而行高 47.3pt;同为 3 行的第五周是 69.5pt。同一张表 17 行 23pt、1 行 15.6pt —— 这是原件的疏漏。
本模板不复制这个不一致,全表统一 23pt,故该行高 69.3pt(多 22.0pt),
总高 1132.3pt(原件 1114.2pt),正好顶到第 3 页。已记进 README 与 sty 注释。
2. 表头不加粗
视觉上表头醒目,但原
.doc表头格只有jc=center、没有<w:b/>。照抄原件,不加粗。
3. 周次列对齐前后不一致(照抄)
原件第 1
10 周16 周jc=left(x=50.40pt),第 11jc=center(x=51.72pt)。本模板 x=50.65 / 51.75,保留这个不一致,
因为改成统一反而与原件对不上。
README 记录的技术坑(供后续模板复用)
\fontsize必须用bp(Word 的 pt 是 PostScript pt,差 0.36%)w:line=460 exact不等于 TeX 的\baselineskip——前者连首行也硬压成 23pt,后者首行只占字体 ascent。实测
rowsep与
\rule两个方案都不可行,最终用显式ht(附三种方案的实测数据)\linespread必须在\fontsize之后调用,否则被覆盖\SetCell[c=7]{c}里的c是自然宽度不折行,跨列必须显式给wd\leftskip与geometry的左边距叠加而非覆盖(多算了 16.3pt)\vspace*在\par处会被丢弃,要靠\newline让两行落在同一段落里让
\baselineskip生效清理
临时目录
_conv3/(WPS 转换中间产物、标定脚本)与仓库内实验文件(
_exp/、_t.tex)已删除,仓库里只留 .sty / .tex / .pdf / README.md。缺陷修正:签字栏「年 月 日」三个字重叠
用户反馈:最下面的年月日怎么都重合在一起了。
现象
第 3 页底部签字栏第二行,
20××与「年」「月」挤成一团墨迹,「月」几乎完全压在「年」上。原第 2 行写法(从原件空格反推得到):
根因
反查原件 PDF 的 span 坐标后确认:
原件里年份是空的 —— 原文就是「
年」+两个空格+「月」,留白给老师手写签日期。
\hspace*{92.604mm}是按「年」的实际位置反解出来的偏移量。
我在填空模板里加了
\calgrade(20××,约 31.5pt 宽)插在「年」前面,整串被推后到 x=399.74;后面再用
\hspace{-8.35mm}去拽「月」,负 kern 只减「年」「月」之间的空隙,空隙减成负数就变成重叠。
两层原因:
\hspace不能把已经排出去的「年」收回来,只能压缩后续盒子间距。修正
改成让年份右对齐到「年」的左边界,而不是让「月」去追年份:
盒宽 34.16pt = 355.53 − 321.37(盒左与上行「院(系)」321.00 对齐),
装得下
20××(2 半角 10.5 + 2 全角 21 ≈ 31.5pt)。实测校验(修正后)
三个字完全分开,无重叠,且全部与原件对齐。
其他
README.md更新:签核栏验收表补「年」锚点、修正「日」的原误差值(原记 −1.04pt 是旧写法的问题,现为 +0.06pt);「原件的不一致之处」
第 5 条重写为「签字栏的『年 月 日』必须给年份一个定宽盒子」,
附完整的踩坑复盘与失败方案
oucal.sty、课程教学日历.tex中仍为零命中(
闭卷、开卷原本出现在\calassess的注释说明里,已一并改掉)缺陷修正:签字栏「年 月 日」三个字重叠 → 已修复并推送
提交
3b67659修复签字栏年月日重叠:年份改用定宽右对齐盒子 #8已推送
origin/main根因
反查原件 PDF 的 span 坐标确认:原件里年份是空的,原文就是
「
年」+两个空格+「月」,留白给老师手写签日期。\hspace*{92.604mm}是按「年」的实际位置反解出来的。我在模板里加了
\calgrade(20××,约 31.5pt)插在「年」前面,整串被推到 x=399.74;后面用
\hspace{-8.35mm}去拽「月」,负 kern 只减「年」「月」之间的空隙,减成负数就成了重叠。
关键认识
负
\hspace不能把已经排出去的「年」收回来,只能压缩后续间距。正确做法是让年份右对齐到「年」的左边界,而不是让「月」去追年份:
唯一能让「年」位置固定的写法:把年份塞进定宽
\makebox,让盒宽吸收占位符长度变化。用户换成
2026或2026 年 10 月都不会再动「月」「日」的位置。
实测(修正后)
三字完全分开,零重叠。
验收
→ 改动未波及表格与抬头
闭卷/开卷原在\calassess注释里,已改掉)README.md同步更新验收表 + 「原件的不一致之处」第 5 条重写为完整踩坑复盘(含失败方案)
文档改善
README 里这一节现在写清了为什么要定宽盒子,不只是怎么写。
下次有人换年份格式时能看懂约束,不会又把三个字叠回去。
签字栏去掉年份占位符,只留「年 月 日」
用户要求:
20××年这个地方不用填了,直接就是「年 月 日」。改动
删除
\calgrade宏(以及它在签字栏的\makebox包装),签字栏第二行改为:现在是纯空白填空位,打印出来就是「年 月 日」,老师手写签日期。
逐字符实测(与原件印刷位置对齐)
反查原件 PDF 的逐字符坐标时发现一个重要事实:原件那一行其实印着
4 个半角数字(x=331.44~352.50),只是在 span 级过滤时被漏掉了 ——
之前误以为「原件年份是空的」。数字后跟一个空格,再是「年」。
三个字与学校原表逐字重合,只是年份那段留白了。
偏移量的来历(可复现)
目标 x = 355.09pt = 125.23mm。
caloutside的\leftskip是 15.963mm、geometry
left是 15.787mm,叠加后排版起点在 31.75mm,故125.23 − 31.75 = 93.48mm。实测 93.48mm 落在 354.98(偏左 0.10pt),加 0.037mm 微调到 93.517mm,实测 355.09(偏右 0.01pt)。
关键认识(已写入 README)
问题不是排版技巧不够,而是那行本来就不该有年份。
上一版为了塞进
20××占位符,用\hspace{-8.35mm}去拽「月」,结果三字重叠 —— 因为负
\hspace只能压缩后续间距,减到负数就是重叠,不能把已经排出去的字符收回来。
去掉占位符后,这一行只有三个中文字,宽度恒定,位置永远稳定,
不存在任何漂移风险。
验收
98e5fa9edbbb),完全可复现(原写作「年份位印着 "2022"」,已改为「印着 4 个半角数字」)
README.md:删掉\calgrade一行;验收表更新为新坐标;「原件的不一致之处」第 5 条重写为「是手写填空位,不要填年份」,
附偏移量推导、踩坑复盘,以及如需预填年份时的正确写法
(
\hspace*{81.52mm}{\calfontC\makebox[34.0pt][r]{2026}年}...,已实测)提交
88b3e08签字栏去掉年份占位符,只保留手写填空位「年 月 日」 #8删除表格末尾的「课程考核及评价方式」行
用户要求:教学日历中,考核方式那一块去掉吧。因为有单独的成绩构成
说明文件,那个就不需要了。
改动
原表格 18 行(表头 + 16 周 + 考核方式),现 17 行(表头 + 16 周)。
课程教学日历.tex:删掉跨 7 列的\SetCell[c=7]{m,wd=142.34mm}大格及其两段文字oucal.sty:删掉row{18}={ht=69.00pt}表头上方课程信息里的【考核方式】字段(
\calassess)保留 ——那是一个字段占位,不占用一整行,与「单独的说明文件」不重复。
若你连这个也要去掉,删掉
.tex第 85 行的\hfill 【考核方式】~\calassess即可。附带效果:页数从 3 页回到 2 页
删掉这一行后总高减少 69.5pt,表格不再顶到第 3 页,正好 2 页,
与学校原件页数一致。之前 README 里记的「3 页(原件 2 页)」这个取舍
现在不需要了 —— 那个取舍的起因是「第一周行距照原件会多 22pt」,
现在整个表短了 69pt,这个差额被吸收了。
留了恢复说明
.tex里保留了一段注释,写明若要恢复该行需要:row{18}={ht=69.00pt},\\后加回跨列格(必须显式给wd,否则报 Overfull)验收
提交
a458913教学日历删掉表格末尾的「课程考核及评价方式」行(另有独立成绩构成说明) #8