%====================================================================== % 中国海洋大学 课程教学日历(理论课程) % % 编译: 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}