Files
ouc_latex_template/课程教学日历/课程教学日历.tex
T
laoyang 8984b93ee7 模板内容填充:全库 × 占位换成完整虚构示例,README 表述同步 #11
把 11 个模板里满篇的 × 换成一套连贯的虚构数据,让样张能看出排版效果。

虚构设定(跨模板统一):
- 数字逻辑 / 2025 秋 / 张远航 / 计算机科学与技术学院,教学日历、成绩构成
  说明、试卷归档封面、试卷四份互相对得上
- 简历:张远航,1985.03,教授博导,论文/专利/项目/获奖全套虚构
- 年度考核:同一人的 2025 年度考核表,年度总结四段写满
- 执行大纲:刻意不套用上面那套(原件就是《信号与线性系统分析》的课,
  强行改课程名会让章节体系、学时分配、思政案例全对不上)

假数据都留肉眼可辨标记:DOI 统一 10.9999/、专利号 ZL209999…、
软著 2024SR99999…、手机 138 0000 0000、邮箱 example.net。
签字/日期/评语栏仍然留空——编了就分不清该改哪儿。

修掉一个既有 bug(填充时才暴露):
年度考核登记表「出生年月」的值从来不显示,连字符都不在 PDF 里。
根因是 tabularray 的 cell{r}{c}={c=n} 里那个 c 是数据行的单元序号、
不是视觉列号,表头三处 c=2 要求该行吃 15 个视觉列而表只有 11 列,
超出部分静默丢弃。迷惑点:写 12 格丢值,写 9 格反而正常。
正解是表头不写 cell{},改用行内 \SetCell[c=n]{c},每行照常写满 11 格。
同时 R0 行原件本就装不下(前六字段 115.76mm,剩 42.20mm 要放
19.68mm 标签 + 17.22mm 值,但列宽被切成 15.31/1.38/25.51),
把标签折两行「出生/年月」解决,列宽一个没改。

README 同步:根 README 与 8 个模板 README 里「一律用 × 占位」的说法
已不成立,统一改为「示例内容全部虚构」,并说明哪些位置仍必须留空。

验证:12 个模板零 error,4 处基线警告未新增;干净副本重编页数一致;
PDF 正文 × 清零;真实信息零泄漏。
2026-10-27 12:50:02 +08:00

226 lines
13 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
%======================================================================
% 中国海洋大学 课程教学日历(理论课程)
%
% 编译: xelatex 课程教学日历.tex
%
% 这是学校下发的**通用空白表**(附件3),本模板只复刻版式。
%
% ⚠️ 模板里的课程信息、周次、日期、教学内容**全部是虚构占位**,
% 与原 .doc 里的真实课程无关。填自己的课时请改【第 1 节】与表格。
%
% 版式来源:学校下发的《附件3:中国海洋大学课程教学日历(理论课程)》.doc
%
% 与原 .doc 的差异(有意为之):
% · 原字体「宋体 + Times New Roman」换成 OUC Serif + TeX Gyre Termes
% (全部开源可商用,字宽逐字相同)
% · 纸张、页边距、表宽、列宽、字号、行距、对齐一律照原值
% (详见 oucal.sty 的注释,每一项都附了换算过程)
% · 表格跨页位置不复刻(断点取决于行高取整,不可靠,见 sty §10)
%======================================================================
\documentclass[UTF8,fontset=none]{ctexart}
\usepackage{oucal}
%======================================================================
% 【第 1 节】课程信息 —— 换成你自己的
%
% ⚠️ 下面全部是虚构值,请逐项替换。不要把真实信息留在模板里提交。
%======================================================================
\newcommand{\calcno}{附件3} % 附件编号
\newcommand{\calcname}{数字逻辑} % 课程名称(4 字示例)
\newcommand{\calyear}{2025} % 学年
\newcommand{\calseason}{秋} % 季学期(春/秋)
\newcommand{\caldept}{计算机科学与技术学院(系)} % 开课单位
\newcommand{\calcodenum}{080502101231} % 开课号(12 位数字)
\newcommand{\calteacher}{张远航} % 任课教师
\newcommand{\calcredit}{4.0} % 课程学分
\newcommand{\calhour}{64} % 总学时
\newcommand{\calstudent}{86} % 学生人数
\newcommand{\calassess}{闭卷考试} % 考核方式
% 注:签字栏的「年 月 日」不设宏 —— 那是**手写**填空位,模板里保持空白。
\begin{document}
%======================================================================
% 【第 2 节】表格上方的抬头
%
% ⚠️ 下面每个 \calskip{} 的数值都是**实测标定**的结果,不是估的。
% 原 .doc 只有「460 twips 固定行距」,段与段之间没有段前/段后间距,
% 段距完全由行盒的 ascent/descent 自然堆出来。TeX 的行盒模型与之
% 不同(同样是单行段落,TeX 的盒子比 Word 矮),所以逐段补差。
%
% 标定方法:分别导出原稿与本版的 PDF,用 pymupdf 读每个 span 的
% origin[1](基线 y,原点在左上),逐段比对差值,把差值直接加到
% 对应的 \calskip 上。响应是线性的,一轮即收敛。
% 实测数据见 README「纵向实测校验」。
%======================================================================
\begin{caloutside}
\calskip{-4.330mm} % 顶端补偿:原稿首行基线距版心顶 20.69pt
\calfontA\bfseries \calcno:\par
\calskip{2.894mm}
{\calfontA\bfseries \centering 中国海洋大学 \calcname 课程教学日历(理论课程)\par}
\calskip{1.243mm}
{\calfontB\bfseries \centering \calyear~学年~\calseason~季学期\par}
\calskip{6.493mm}
%---- 课程信息:两行 ----
% ⚠️ 原件这两段带 w:ind left="-540"(−9.525mm) firstLine="210"(+3.704mm),
% 相对原版心 31.75mm 的净起点 = 31.75 − 9.525 + 3.704 = 25.929mm
% = 73.48pt,与原稿实测 x=73.44pt 吻合。
% caloutside 已把段落起点放回 31.75mm,故此处只需再左移 5.821mm。
%
% ⚠️ 两行之间用 \newline 而不是 \par —— 这是关键。
% 原件的两行是 460 twips 固定行距、段距 0,基线相差 23.04pt。
% 若用 \par 分成两段,**\baselineskip 不跨段落**,两段的间距变成
% 「上段末行深度 + \parskip(0) + 下段首行高度」≈ 20.9pt,短 2.1pt,
% 而且这个缺口**补不上**:实测 \vspace*{-2.11pt} 与 \calskip{-0.734mm}
% 都会被 TeX 在 \par 处丢弃(负的垂直胶不能压缩已有间距)。
% \newline 让两行落在同一段落里,\baselineskip = 23bp 直接生效。
\calfontC
% 用一个段落 + \newline 排两行,缩进用 \leftskip 负值 + \parindent 补偿:
% \newline 后的行是"段中行",不吃 \parindent,只认 \leftskip。
% 故把缩进整体前移 5.821mm 后,第二行会自动跟着走。
\setlength{\leftskip}{\dimexpr\caloutsideskip-5.821mm\relax}
\setlength{\parindent}{0pt}
【开课单位】~\caldept\hfill 【开课号】~\calcodenum\hfill 【任课教师】~\calteacher\newline
【课程学分】~\calcredit\hfill 【总学时】~\calhour\hfill 【学生人数】~\calstudent\hfill 【考核方式】~\calassess\par
\setlength{\leftskip}{\caloutsideskip}
\calskip{2.873mm} % 课程信息第 2 行到表格顶线
\end{caloutside}
%======================================================================
% 【第 3 节】教学日历表
%
% 每行格式:
% \calweek{第X周} & \caldate{日期} & \calhourn{学时} & 教学内容 & 教学方式 & 课堂讨论/其它环节 & 课下作业/必读章节 \\
%
% · 周次列前 10 行原件是左对齐、第 11 行起居中 —— 照抄原件这个不一致
% (见 README「原件的不一致之处」)。若想全列统一,把 \calctr 换 \calcell。
% · 空格用 \\ 前的最后一个 & 结束;内容为空就留空。
%======================================================================
\begin{caltable}
%------------------- 表头 -------------------
\calctr{周次} & \calctr{日期} & \calctr{学时} & \calctr{教学内容} &
\calctr{教学方式} & \calctr{课堂讨论内容及其它教学环节} &
\calctr{课下作业及课后必读教材或参考书章节} \\
%------------------- 16 周(示例内容全为虚构)-------------------
% ⚠️ 关于第一周行距 15.6pt:原件只有这一行的段落没写 w:spacing,随
% docGrid(linePitch=312 twips)排,行距 15.6pt,而其余 17 行都是
% 23pt。**本模板不复制这个不一致**,全表统一 23pt。
%
% 后果:这一行比原稿高 22.2pt(69.5 → 46.5),总高多 22pt,表格
% 从 2 页变 3 页。这是有意取舍 —— 保真版式的同时不复制原件的疏漏,
% 理由记在 README「原件的不一致之处」第 1 条。
% (若你确实要 2 页,把这一行改成 \calfall 系列宏、并把 sty 里
% row{2} 的 ht 改回 24.30pt。注意 \calfall 对 \par 分段无效,
% 只对自动折行有效,改之前先读 sty §6 的说明。)
\calcell{第一周} & \calcell{9.1—9.7} & \calcell{4} &
\calcell{课程基本情况介绍\par 引例\par 补充知识} &
\calcell{多媒体讲课} & & \\
\calcell{第二周} & \calcell{9.8—9.14} & \calcell{4} &
\calcell{第一章,数制与编码\par 第一节,数制的基本概念} &
\calcell{多媒体讲课} & & \\
\calcell{第三周} & \calcell{9.15—9.21} & \calcell{4} &
\calcell{第一章,数制与编码\par 数制的三种表现形式,常用编码,常见的几个定理。} &
\calcell{多媒体讲课} & & \\
\calcell{第四周} & \calcell{9.22—9.28} & \calcell{4} &
\calcell{第一章,数制与编码\par 常用的公式、逻辑代数法化简、卡诺图化简。\par 第二章,组合逻辑分析} &
\calcell{多媒体讲课} & & \calcell{作业1.1—1.6} \\
\calcell{第五周} & \calcell{9.29—10.5} & \calcell{4} &
\calcell{第二章,组合逻辑分析\par 组合逻辑分析方法、常见的组合逻辑电路} &
\calcell{多媒体讲课} & \calcell{国庆假期调课} & \calcell{作业1.7—1.10} \\
\calcell{第六周} & \calcell{10.6—10.12} & \calcell{4} &
\calcell{第三章,组合逻辑设计\par 组合逻辑设计方法、任意项} &
\calcell{多媒体讲课} & & \\
\calcell{第七周} & \calcell{10.13—10.19} & \calcell{4} &
\calcell{第三章,组合逻辑设计\par 无反变量设计,考虑多个输出的设计,使用数据选择器进行设计} &
\calcell{多媒体讲课} & & \calcell{作业2.1,2.3,2.5} \\
\calcell{第八周} & \calcell{10.20—10.26} & \calcell{4} &
\calcell{第四章,时序逻辑分析,时序逻辑的基本内容} &
\calcell{多媒体讲课} & & \\
\calcell{第九周} & \calcell{10.27—11.2} & \calcell{4} &
\calcell{第四章,时序逻辑分析\par 时序逻辑分析基本方法} &
\calcell{多媒体讲课} & & \\
\calcell{第十周} & \calcell{11.3—11.9} & \calcell{4} &
\calcell{第四章,时序逻辑分析\par 常见的时序逻辑电路} &
\calcell{多媒体讲课} & & \calcell{作业3.1—3.4} \\
\calctr{第十一周} & \calctr{11.10—11.16} & \calcell{4} &
\calcell{第五章,时序逻辑设计,状态表} &
\calctr{多媒体讲课} & \calcell{期中测验} & \\
\calctr{第十二周} & \calctr{11.17—11.23} & \calcell{4} &
\calcell{第五章,时序逻辑设计,状态表化简} &
\calctr{多媒体讲课} & & \\
\calctr{第十三周} & \calctr{11.24—11.30} & \calcell{4} &
\calcell{第五章,时序逻辑设计,状态转移表} &
\calctr{多媒体讲课} & & \\
\calctr{第十四周} & \calctr{12.1—12.7} & \calcell{4} &
\calcell{第五章,时序逻辑设计,状态图、状态表} &
\calctr{多媒体讲课} & & \calcell{作业4.1} \\
\calctr{第十五周} & \calctr{12.8—12.14} & \calcell{4} &
\calcell{复习、答疑} &
\calctr{多媒体讲课} & & \\
\calctr{第十六周} & \calctr{12.15—12.21} & \calcell{4} &
\calcell{复习、答疑} &
\calctr{多媒体讲课} & & \\
\end{caltable}
%----------------------------------------------------------------------
% 表格到此为止,共 17 行(表头 + 16 周)。
%
% ⚠️ 原件表格末尾还有一行跨 7 列的「课程考核及评价方式:」大格
% (原 18 行)。**本模板已删除这一行**,因为学校另有单独的
% 《成绩构成说明》文件详细说明考核构成,教学日历里重复一遍既
% 冗余又容易与说明文件不一致。考核方式改在表头上方的课程信息里
% 用一个字段(\calassess)点到即可。
%
% 若你要恢复那一行:在 sty 的 colspec 之后补回
% row{18}={ht=69.00pt},
% 并在上方 \\ 之后加:
% \SetCell[c=7]{m,wd=170.638mm}
% \calcell{课程考核及评价方式:}\par
% \calcell{...说明文字...} \\
% (跨列格必须显式给 wd,否则报 Overfull —— 原因见下)
%----------------------------------------------------------------------
%======================================================================
% 【第 4 节】签字栏
%
% 原 .doc 的这两段(P008/P009):
% 「院(系)负责人签字:」 w:ind firstLine=4515 firstLineChars=2150
% 「××××年 月 日」 无 ind,用空格顶到位置
%
% firstLine = 4515 twips = 4515/1440×25.4 = 79.6396 mm
% ⇒ 相对原版心左边界 31.75mm,起点 = 31.75 + 79.6396 = 111.3896 mm = 315.75 pt
% 原稿实测 x = 321.00pt —— 差 5.25pt,因为第一个字「院」的左边界
% 与盒子起点之间还有字形的左边距(word 的 4515 是"首行缩进",量的
% 是盒子起点,不是字形起点)。故按实测 321.00pt 反解:
% 缩进 = 321.00 − (31.75mm→89.999pt) = 231.00 pt = 81.49 mm
%
% ⚠️ 两行的水平位置**不一样**:
% 「院(系)」x=321.00 年份 x=352.50
% 原件第二行是用空格顶的(不是缩进),照抄即可。
%
% ⚠️ 第二行的三个锚点(逐字符实测原件 PDF,10.45pt 宋体):
% 年字形 x = 355.08 月 x = 376.08 日 x = 397.08
% 年→月 21.00pt,月→日 21.00pt(都是一个全角字 + 10.55pt 空档)
%
% 原件被填过,年份位印着 4 个半角数字(x=331.44~352.50),
% 后面跟一个空格,再是「年」。**本模板不写年份**,那一段留白给
% 老师手写签日期 —— 这是空白模板该有的样子。
%
% 但「年 月 日」三个字仍留在原件的印刷位置上(355.08 起),
% 这样打出来的表格与学校原表逐字对齐,手写填空处一目了然。
%
% ⚠️ 不要用负 \hspace 去挪:它只能压缩后续间距,减到负数就是重叠。
% (曾经为了塞进 \calgrade 占位符,用 \hspace{-8.35mm} 拽「月」,
% 结果三个字叠成一个墨团。现已彻底去掉年份占位符,问题不存在了。)
%======================================================================
\begin{caloutside}
\calskip{5.60mm}
\hspace*{81.49mm}\calfontC 院(系)负责人签字:\par
\calskip{1.10mm}
\hspace*{93.517mm}\calfontC 年\hspace*{10.55pt}月\hspace*{10.55pt}日\par
\end{caloutside}
\end{document}