Files
ouc_latex_template/课程教学日历/课程教学日历.tex
T

231 lines
13 KiB
TeX
Raw Normal View History

%======================================================================
% 中国海洋大学 课程教学日历(理论课程)
%
% 编译: 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}{20××} % 学年
\newcommand{\calseason}{×} % 季学期(春/秋)
\newcommand{\caldept}{××××学院(系)} % 开课单位
\newcommand{\calcodenum}{000000000000} % 开课号(12 位数字)
\newcommand{\calteacher}{×××} % 任课教师
\newcommand{\calcredit}{×.×} % 课程学分
\newcommand{\calhour}{00} % 总学时
\newcommand{\calstudent}{000} % 学生人数
\newcommand{\calassess}{××考试} % 考核方式(填 ×××)
\newcommand{\calgrade}{20××} % 签字栏年份
\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{×月×日至×月×日} & \calcell{×} &
\calcell{课程基本情况介绍\par 引例\par 补充知识} & \calcell{多媒体讲课} & & \\
\calcell{第二周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第一章,××××基础\par 第一节,××××概念} & \calcell{多媒体讲课} & & \\
\calcell{第三周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第一章,××××基础\par ××××的三种表现形式,××××标准形式,常见的几个定理。} &
\calcell{多媒体讲课} & & \\
\calcell{第四周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第一章,××××基础\par 常见的公式、××××代数法化简、××××图化简。\par 第二章,××××分析} &
\calcell{多媒体讲课} & & \calcell{作业×.×—×.×} \\
\calcell{第五周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第二章,××××分析\par ××××分析方法、常见的××××} &
\calcell{多媒体讲课} & & \calcell{作业×.×—×.×} \\
\calcell{第六周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第三章,××××设计\par ××××设计方法、任意项} &
\calcell{多媒体讲课} & & \\
\calcell{第七周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第三章,××××设计\par 无反变量设计,考虑多个输出的设计,使用数据选择器进行设计} &
\calcell{多媒体讲课} & & \calcell{作业×.×,×.×,×.××} \\
\calcell{第八周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第四章,××××分析,××××的基本内容} &
\calcell{多媒体讲课} & & \\
\calcell{第九周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第四章,××××分析\par ××××分析基本方法} &
\calcell{多媒体讲课} & & \\
\calcell{第十周} & \calcell{×月×日至×月×日} & \calcell{×} &
\calcell{第四章,××××分析\par 常见的××××} &
\calcell{多媒体讲课} & & \calcell{作业×.×—×.×} \\
\calctr{第十一周} & \calctr{×月×日至×月×日} & \calcell{×} &
\calcell{第五章,××××设计,××××表} &
\calctr{多媒体讲课} & & \\
\calctr{第十二周} & \calctr{×月×日至×月×日} & \calcell{×} &
\calcell{第五章,××××设计,××××表化简} &
\calctr{多媒体讲课} & & \\
\calctr{第十三周} & \calctr{×月×日至×月×日} & \calcell{×} &
\calcell{第五章,××××设计,××××转移表} &
\calctr{多媒体讲课} & & \\
\calctr{第十四周} & \calctr{×月×日至×月×日} & \calcell{×} &
\calcell{第五章,××××设计,××××图、××××表} &
\calctr{多媒体讲课} & & \calcell{作业×.×} \\
\calctr{第十五周} & \calctr{×月×日至×月×日} & \calcell{×} &
\calcell{复习、答疑} & \calctr{多媒体讲课} & & \\
\calctr{第十六周} & \calctr{×月×日至×月×日} & \calcell{×} &
\calcell{复习、答疑} & \calctr{多媒体讲课} & & \\
%------------------- 课程考核及评价方式(跨 7 列)-------------------
% ⚠️ \SetCell[c=7]{c} 用的是 tabularray 的**旧式列类型** c,它是"自然宽度、
% 不折行"的,跨 7 列后内容比表宽出 197.8pt,报 Overfull。
% 跨列格必须显式给宽,才会折行:
% wd = 表宽 − 2×colsep − 取整余量 = 174.625 − 2×1.905 − 0.177 = 170.638 mm
\SetCell[c=7]{m,wd=170.638mm}
\calcell{课程考核及评价方式:}\par
\calcell{课程考核成绩由平时成绩和期末考试成绩构成:平时成绩由出勤、课堂讨论、课后作业、翻转课堂构成,所占比重为××\%。} \\
\end{caltable}
%======================================================================
% 【第 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
% 年→月 空档 10.55pt,月→日 空档 10.50pt(都是一个全角字的宽度)
% 原件里**年份是空的**(" 年 月 日"),留白给老师手写签日期。
%
% 我们填了 \calgrade,所以必须给年份一个**定宽右对齐盒子**:
% 盒右边界 = 年字形起点 355.08
% 盒起点 = 355.08 − 34.16 = 320.92 ← 与上行「院(系)」321.00 对齐
% 盒宽 34.16pt 放得下 "20××"(2 半角 10.5 + 2 全角 21 ⇒ 约 31.5pt)
% 实测落到:年 355.53 月 376.08 日 397.14
%
% ❌ 出错过的写法:`\hspace*{92.604mm}\calgrade~年\hspace{-8.35mm}月`
% —— 年份文字把「年」推到了 x=399.74,直接用负 kern 去拽「月」,
% 结果「月」叠在「年」上,三个字变成一个墨团。
% 负 \hspace 只能挪后面的盒子,不能把已经排出去的「年」收回来。
%======================================================================
\begin{caloutside}
\calskip{5.60mm}
\hspace*{81.49mm}\calfontC 院(系)负责人签字:\par
\calskip{1.10mm}
\hspace*{81.49mm}%
{\calfontC\makebox[34.16pt][r]{\calgrade}年}%
\hspace*{10.60pt}%
\calfontC 月\hspace*{10.60pt}日\par
\end{caloutside}
\end{document}