七个模板原先分两套做法:幻灯片/fonts(49MB 鸿蒙 18 个字重)与 科技报告/font(92MB,含 5 款方正商业字体),其余模板直接调系统 SimSun/SimHei/KaiTi/FangSong/Times New Roman。换机器就编不出来, 方正系列也不允许随仓库分发。 统一到仓库根的 fonts/ + fonts.tex: - OUC Serif(思源宋体 SC 子集) —— 宋体 - OUC Sans(思源黑体 SC 子集) —— 黑体 - OUC Kai(霞鹜文楷子集) —— 楷体 - Zhuque Fangsong(朱雀仿宋) —— 仿宋 - TeX Gyre Termes —— 西文 Times 等价(度量逐字相同) - HarmonyOS Sans —— 幻灯片/科技报告原有字体 fonts.tex 是唯一允许声明字体的地方,7 个模板全部 \input 它。 字体体积 141MB -> 49MB(去掉重复),全库共用一套最小集合。 几处踩过的坑(均已写进源码注释): - \newCJKfontfamily 与 ctex 默认 fontset 冲突会中断编译,改用 \setCJKfamilyfont + \def - \newfontfamily 缺粗体档会让 \bfseries 静默失效,四档必须全给 - UprightFont= 与主参数不能同时给,否则文件名被拼两次 - Path= 相对编译时工作目录,不是相对 .sty - ×/□/○ 等符号按 Unicode 区段被判成西文,需 \xeCJKDeclareCharClass - 中文斜体的 ItalicFont 与主字体不在同一目录,须在 ItalicFeatures 里单独写 Path/Extension(否则报 OUCKai-Regular cannot be found) 顺带: - 科技报告 report.tex 的字体演示正文改为新字体名(原文写着方正系列) - 试卷归档封面新模板并入本库 - 科技报告 shell 命令框底色改海大蓝(#5 遗留) 验证(7 个模板 8 个 PDF 全量重编 + 逐行 A/B 对照): - 错误 0,缺字 0 - 幻灯片 362 行逐行完全一致,零漂移 - 年度考核登记表 / 劳务发放说明表 / 试卷题型示例 / 参考答案 文本完全一致 - 课程执行大纲 仅 2 处断字连字符差异(throughout、processing), 1 条 6.39pt Overfull 已论证不可见(距纸张右边缘仍有 20.7mm) - 科技报告 内嵌字体方正归零,只剩 OUC Serif/Sans/Kai + Zhuque - 全库正文 857 个非 ASCII 字符,四款中文字体(含粗体)覆盖 100%
511 lines
22 KiB
TeX
511 lines
22 KiB
TeX
%======================================================================
|
||
% ouccourse.sty —— 中国海洋大学 本科课程教学执行大纲、教学日历
|
||
%
|
||
% 由学校下发的 .docx 复刻而来。版式尺寸全部从原文件的 OOXML 量出,
|
||
% 换算过程逐条写在对应位置。
|
||
%
|
||
% ⚠️ 编译: xelatex 课程执行大纲.tex (单次即可,无交叉引用)
|
||
% 需要 ctex + geometry + fontspec + xeCJK + tabularray
|
||
% 实测 TeX Live 2022 / tabularray 2022A
|
||
%======================================================================
|
||
\NeedsTeXFormat{LaTeX2e}
|
||
\ProvidesPackage{ouccourse}[2026/10/26 v1.0 OUC course syllabus form]
|
||
|
||
\RequirePackage{geometry}
|
||
\RequirePackage{fontspec}
|
||
\RequirePackage{xeCJK}
|
||
\RequirePackage{tabularray}
|
||
\RequirePackage{enumitem}
|
||
\RequirePackage{xcolor}
|
||
|
||
\ExplSyntaxOn
|
||
\cs_set_eq:NN \ccurlength \dim_use:N
|
||
\ExplSyntaxOff
|
||
|
||
%======================================================================
|
||
% 1. 页面
|
||
%
|
||
% 原 docx sectPr:
|
||
% pgSz 11910 x 16840 twips → 210.08 x 297.04 mm
|
||
% pgMar top 1420 right 1300 bottom 280 left 1560
|
||
% header 720 footer 720
|
||
%
|
||
% ⚠️ 注意两件事:
|
||
% (a) WPS 存的 A4 是 11910x16840,比标准 A4 的 11906x16838 各多 4/2 twips。
|
||
% 差异 0.07/0.04 mm,肉眼不可辨,本包直接用标准 A4。
|
||
% (b) 下边距只有 4.94 mm,明显是原文件为“塞进 5 页”压出来的。
|
||
% 照抄会让最后一行几乎贴到纸边,故此处保留原值(复刻优先),
|
||
% 并在 README 里注明这一处的不合理。
|
||
%======================================================================
|
||
\geometry{
|
||
paperwidth = 210mm,
|
||
paperheight = 297mm,
|
||
left = 27.52mm, % 1560 twips
|
||
right = 22.93mm, % 1300 twips
|
||
top = 25.05mm, % 1420 twips
|
||
bottom = 4.94mm, % 280 twips ← 原文件如此,见上注
|
||
headheight = 0pt,
|
||
headsep = 0pt,
|
||
footskip = 12.70mm, % 720 twips
|
||
}
|
||
\setlength{\parindent}{0pt}
|
||
\setlength{\parskip}{0pt}
|
||
\pagestyle{empty} % 原 docx 无页眉页脚、无页码
|
||
|
||
%======================================================================
|
||
% 2. 字体
|
||
%
|
||
% 原 docx 用到 4 个字体,其中 3 个是方正商业字体:
|
||
% 方正小标宋简体 标题(嵌在 docx 里,系统未安装)
|
||
% 方正仿宋_GB2312 正文(同上)
|
||
% 黑体 各级标题
|
||
% 宋体 教学日历表正文、9pt
|
||
%
|
||
% 旧版这里是 SimSun / SimHei / FangSong + AutoFakeBold 伪粗,即
|
||
% 「本机恰好有 Windows 自带字体」的降级方案。问题有两层:
|
||
% ① 换台机器(Linux/macOS、或精简版 Windows)就编不出来;
|
||
% ② SimSun / SimHei / FangSong 都不允许随仓库分发。
|
||
%
|
||
% ⇒ 现改为全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下):
|
||
% 方正小标宋简体 → \ccbiaosong = OUC Serif 的**真粗体**
|
||
% (小标宋本就是宋体的标题变体,用真粗体比原来
|
||
% AutoFakeBold=3.2 的算法描边干净得多 ——
|
||
% 描边到 3.2 时笔画已经糊在一起)
|
||
% 方正仿宋_GB2312 → \ccfang = Zhuque Fangsong(朱雀仿宋)
|
||
% 黑体 → \cchei = OUC Sans(思源黑体)
|
||
% 宋体 → \ccsong = OUC Serif(思源宋体)
|
||
%
|
||
% ⚠️ 朱雀仿宋只有常规一档、没有粗体。原版 \ccfang 靠 AutoFakeBold=2.5
|
||
% 伪粗来排表头(课程执行大纲.tex 里 {\ccfang\ccszxi\bfseries ...})。
|
||
% 现在伪粗已取消,\bfseries 在 \ccfang 下**不会变粗**。若表头必须
|
||
% 加粗,请把那里的 \ccfang 换成 \cchei(黑体本身就是标题用的重字面)。
|
||
%======================================================================
|
||
\input{../fonts.tex}
|
||
|
||
%----------------------------------------------------------------------
|
||
% ⚠️ xeCJK 默认会在[汉字 ↔ 西文/数字]之间自动插一段空白(CJKecglue)。
|
||
% 原 docx 里没有这种空白,例如「××学部××学院」「2026 学年」「56/3.0」
|
||
% 在 Word 里是紧挨着的。不关掉会出现「×× 学部×× 学院」这种多出来的空隙。
|
||
% 此处把 CJKecglue 设为 0,并关掉自动间距(xeCJK 的 punct/ec 两类)。
|
||
%----------------------------------------------------------------------
|
||
\xeCJKsetup{
|
||
CJKecglue = {},
|
||
xeCJKactive = true,
|
||
}
|
||
\setlength{\parindent}{0pt}
|
||
|
||
% 四个语义别名,沿用原命令名,正文一处都不用改。
|
||
% 用 \setCJKfamilyfont + \def 而非 \newCJKfontfamily:后者是 LaTeX3 的
|
||
% \NewDocumentCommand,若 ctex 已定义同名命令会直接报错中断(见 fonts.tex)。
|
||
\setCJKfamilyfont{ccsong}[
|
||
Extension = .otf,
|
||
Path = ../fonts/ouc-serif/,
|
||
UprightFont = *-Regular,
|
||
BoldFont = *-Bold,
|
||
]{OUCSerif}
|
||
\def\ccsong{\CJKfamily{ccsong}}
|
||
|
||
\setCJKfamilyfont{cchei}[
|
||
Extension = .otf,
|
||
Path = ../fonts/ouc-sans/,
|
||
UprightFont = *-Regular,
|
||
BoldFont = *-Bold,
|
||
]{OUCSans}
|
||
\def\cchei{\CJKfamily{cchei}}
|
||
|
||
% ⚠️ 朱雀仿宋只有常规一档、没有粗体。而教学日历的表头
|
||
% (课程执行大纲.tex 里的 {\ccfang\ccszxi\bfseries 周次} 等 6 处)
|
||
% 明确要加粗。若不加处理,\bfseries 会被静默忽略
|
||
% (日志报 "Font shape TU/ZhuqueFangsong/b/n undefined"),
|
||
% 表头就与表体一样细,层次全丢了。
|
||
%
|
||
% 解法:只给这一族开 FakeBold=0.4 的**算法加粗**。
|
||
% ① 原模板本来就靠 AutoFakeBold=2.5 伪粗,观感一致;
|
||
% ② 只影响 \ccfang,不污染其他字族(正文宋体/黑体都是真粗体);
|
||
% ③ 0.4 比原来 2.5 轻得多 —— 2.5 是 Word 描边档位,笔画会糊,
|
||
% 0.4 只加一点点笔宽,正好补上"表头该比表体重一点"的差异。
|
||
\setCJKfamilyfont{ccfang}[
|
||
Extension = .ttf,
|
||
Path = ../fonts/zhuque-fangsong/,
|
||
UprightFont = *-Regular,
|
||
BoldFont = *-Regular,
|
||
BoldFeatures = {FakeBold=0.8},
|
||
]{ZhuqueFangsong}
|
||
\def\ccfang{\CJKfamily{ccfang}}
|
||
|
||
% 小标宋的替代:宋体真粗体(不是伪粗)
|
||
\setCJKfamilyfont{ccbiaosong}[
|
||
Extension = .otf,
|
||
Path = ../fonts/ouc-serif/,
|
||
UprightFont = *-Bold,
|
||
BoldFont = *-Bold,
|
||
]{OUCSerif}
|
||
\def\ccbiaosong{\CJKfamily{ccbiaosong}}
|
||
|
||
%----------------------------------------------------------------------
|
||
% ⚠️⚠️⚠️ ctex 默认 \linespread ≈ 1.3,会把 \fontsize{12}{X} 的行距放大 30%。
|
||
% 本例所有行距都来自 docx 的精确值(460 twips = exact 23pt 等),
|
||
% 被放大就全错,故每次设字号前先把 \linespread 归 1。
|
||
%----------------------------------------------------------------------
|
||
\newcommand{\ccfont}[2]{%
|
||
\linespread{1}\relax\fontsize{#1}{#2}\selectfont}
|
||
|
||
% 常用字号(都是 docx 里实际出现的)
|
||
% 15pt = sz30 14pt = sz28 12pt = sz24 11pt = sz22 10.5pt = sz21 9pt = sz18
|
||
\newcommand{\ccszxv}{\ccfont{15}{23}} % 15pt(首页校名)
|
||
\newcommand{\ccszxiii}{\ccfont{14}{21}} % 14pt
|
||
\newcommand{\ccszxii}{\ccfont{12}{18}} % 12pt 正文
|
||
\newcommand{\ccszxi}{\ccfont{11}{16.5}} % 11pt
|
||
\newcommand{\ccszxxi}{\ccfont{10.5}{15.75}}% 10.5pt
|
||
\newcommand{\ccszix}{\ccfont{9}{13.5}} % 9pt 教学日历表
|
||
|
||
\AtBeginDocument{\ccszxii\ccsong}
|
||
|
||
%----------------------------------------------------------------------
|
||
% 3. 首页字段区
|
||
%
|
||
% 原 docx P3~P8 共用同一个 pPr:
|
||
% <w:tabs><w:tab w:val="left" w:pos="7020"/></w:tabs>
|
||
% <w:spacing w:line="460" w:lineRule="exact"/>
|
||
% <w:ind w:left="-565" w:leftChars="-257" w:firstLine="220" w:firstLineChars="100"/>
|
||
%
|
||
% → 行距 460 twips exact = 23 pt
|
||
% → 左缩进 −565 twips = −9.97 mm(负缩进,把整行往左拉出版心)
|
||
% → 首行再 +220 twips = +3.88 mm
|
||
% → 制表位 7020 twips = 123.81 mm
|
||
%
|
||
% ⚠️⚠️ 实测 docx 这几行是【溢出】的,不能照抄:
|
||
% 制表位绝对位置 = 27.52(左边距)+ 123.81 = 141.33 mm,
|
||
% 而右侧内容【开课时间】 2026 学年 秋 季学期 宽 58.20 mm,
|
||
% ⇒ 行尾落在 199.53 mm,已越过版心右边界 187.07 mm 达 12.5 mm,
|
||
% 钻进了 22.93 mm 的右边距里。原文件靠负缩进硬塞,视觉上不易察觉。
|
||
%
|
||
% ⇒ 本包改为干净的两栏等宽布局,两栏都对齐、整体不溢出:
|
||
% 左栏宽 100 mm(容纳【课程名】+值,实测最长 48.7 mm)
|
||
% 右栏从 100 mm 起,实测最长【开课时间】58.2 mm,合计 158.2 mm
|
||
% 版心 159.55 mm,留 1.35 mm 余量
|
||
% 各行左标签起点一致、右标签起点也一致,比原文件更整齐。
|
||
%----------------------------------------------------------------------
|
||
\newlength{\cccolw}
|
||
\setlength{\cccolw}{100mm}
|
||
|
||
% 下划线:把「值 + 尾部空格」一起划上,复现原文件里可填写的空档
|
||
\newcommand{\ccuv}[1]{\underline{#1}}
|
||
|
||
% \ccfieldrow{左标签}{左值}{右标签}{右值}
|
||
% 标签不加下划线,值加;原文件里值前后带空格,用以撑出填空长度
|
||
\newcommand{\ccfieldrow}[4]{%
|
||
\par\noindent
|
||
\makebox[\cccolw][l]{#1\ccuv{#2}}%
|
||
#3\ccuv{#4}%
|
||
\par}
|
||
|
||
% 单栏字段(任课教师、面向专业两行只占左半)
|
||
\newcommand{\ccfieldone}[2]{%
|
||
\par\noindent
|
||
#1\ccuv{#2}%
|
||
\par}
|
||
|
||
%======================================================================
|
||
% 4. 标题
|
||
%
|
||
% P0 校名+院名 小标宋 15pt / 14pt,居中
|
||
% P1 副标题 小标宋 14pt,居中
|
||
% P10 大标题 小标宋 15pt,居中,段后 240 twips = 12pt
|
||
% P11/P26/P39/P43/P46 一~五级标题:黑体 14pt
|
||
% —— 但 P46「五、学习要求…」的 run 是 黑体 14pt,
|
||
% 段落 rPr 却写 12pt + 下划线 + 红色(C00000)。这是原文件的
|
||
% 遗留脏属性,实际渲染按 run 的 14pt 黑体走,故本包按 14pt 黑体。
|
||
%======================================================================
|
||
\newcommand{\ccschool}{%
|
||
\par\begingroup\centering
|
||
{\ccbiaosong\ccszxv 中国海洋大学\par}%
|
||
{\ccbiaosong\ccszxiii ××学部××学院\par}%
|
||
\endgroup}
|
||
|
||
\newcommand{\ccsubtitle}{%
|
||
\par\begingroup\centering
|
||
{\ccbiaosong\ccszxiii 本科课程教学执行大纲、教学日历\par}%
|
||
\endgroup}
|
||
|
||
\newcommand{\ccmaintitle}[1]{%
|
||
\par\begingroup\centering
|
||
\vspace*{0pt}%
|
||
{\ccbiaosong\ccszxv #1\par}%
|
||
\vspace*{12pt}% % spacing after=240 twips
|
||
\endgroup}
|
||
|
||
% 一~五级标题:黑体 14pt,段前 120 twips = 6pt
|
||
% \ccsec{一、课程基本信息}
|
||
\newcommand{\ccsec}[1]{%
|
||
\par\begingroup
|
||
\vspace*{6pt}% % spacing before=120 twips
|
||
\noindent{\cchei\ccszxiii #1\par}%
|
||
\endgroup}
|
||
|
||
% 不带段前的标题(四、教材及参考资料 用 firstLine 708 缩进)
|
||
\newcommand{\ccsecind}[1]{%
|
||
\par\begingroup
|
||
\vspace*{6pt}%
|
||
\noindent\hspace*{12.50mm}{\cchei\ccszxiii #1\par}% 708 twips = 12.50mm
|
||
\endgroup}
|
||
|
||
%======================================================================
|
||
% 5. 正文段落
|
||
%
|
||
% 正文(P12 起)统一:
|
||
% <w:ind w:firstLine="480" w:firstLineChars="200"/> 首行缩进 2 字
|
||
% 字体 方正仿宋_GB2312 12pt
|
||
% 无 spacing 设定 ⇒ 单倍行距
|
||
%
|
||
% 480 twips = 8.47mm,正好是 12pt 汉字的两个字宽(12pt×2 = 24pt = 8.47mm)
|
||
% ⇒ 用 2em 更稳,与字号自动匹配。
|
||
%======================================================================
|
||
\newcommand{\ccp}[1]{\par\noindent\hspace*{2em}#1\par}
|
||
|
||
% 无缩进段(用于表后、空行等)
|
||
\newcommand{\ccpz}[1]{\par\noindent #1\par}
|
||
|
||
% 空行:\ccblank{n} 产生 n 个 12pt 空行
|
||
\newcommand{\ccblank}[1]{%
|
||
\par\begingroup\ccszxii
|
||
\@tempcnta=0
|
||
\loop\ifnum\@tempcnta<#1\relax \mbox{}\par\advance\@tempcnta by 1 \repeat
|
||
\endgroup}
|
||
|
||
%======================================================================
|
||
% 6. 表 0 —— 成绩综合评分体系
|
||
%
|
||
% docx:
|
||
% tblW 0 auto(实际由 gridCol 撑开) gridCol = 7479 + 1418 = 8897 twips
|
||
% tblLayout fixed jc center
|
||
% tblBorders 六边 sz=4 → 0.5pt
|
||
% tblCellMar left/right 108 twips = 1.905mm,top/bottom 0
|
||
% 每行 trHeight 454 exact = 22.70pt = 8.01mm
|
||
% trPr 里还有 <w:jc w:val="center"/>(行内容居中)
|
||
% 字号 12pt 方正仿宋
|
||
%
|
||
% 8897 twips = 156.93 mm,版心 159.63 mm ⇒ 不超版心,可用 colsep 还原内边距
|
||
%
|
||
% ⚠️ 行高 454 twips 是 exact(固定),换算 22.70pt = 8.01mm。
|
||
% tabularray 的 ht= 是最小值语义,与 exact 略有差别;本表内容都是
|
||
% 单行文字,实际高度就等于 ht,故等价。
|
||
%======================================================================
|
||
\newcommand{\ccscoretblw}{156.93mm}
|
||
\newcommand{\ccscorecA}{131.921mm} % 7479 twips
|
||
\newcommand{\ccscorecB}{25.012mm} % 1418 twips
|
||
\newcommand{\ccborder}{0.5pt} % sz=4 → 0.5pt
|
||
\newcommand{\cccellsm}{1.905mm} % tblCellMar 108 twips
|
||
|
||
% 列宽:content 宽 = gridCol − 2·colsep − 线宽分摊
|
||
%
|
||
% 与表 1 同一个坑:tabularray 的 wd= 是【内容宽】,
|
||
% 每条 vline 自身还占 0.5pt = 0.17639mm。2 列 3 条线,每列承担 1.5 条 ⇒ 0.2646mm。
|
||
% ⇒ wd = gridCol − 3.81 − 0.2646 = gridCol − 4.0746mm
|
||
% A: 131.921 − 4.0746 = 127.846
|
||
% B: 25.012 − 4.0746 = 20.937
|
||
% Σ(wd + 2·colsep) + 3×0.176 = 148.783 + 7.62 + 0.529 = 156.932 ≈ 156.93 ✔
|
||
\newcommand{\ccscoreAwd}{127.846mm}
|
||
\newcommand{\ccscoreBwd}{20.937mm}
|
||
|
||
% ⚠️ 行高:docx 是 trHeight 454 exact = 22.70pt = 8.01mm。
|
||
% tabularray 的 ht= 含 hline 线宽预算,实测给 8.01mm 画出来是 8.19mm
|
||
% (每行多 0.18 = 一条 0.5pt 横线)。故减掉 0.176mm。
|
||
\newcommand{\ccscorerowht}{7.834mm}
|
||
|
||
\newenvironment{ccscoretable}{%
|
||
\par\begingroup\ccszxii\ccfang
|
||
\begin{tblr}[label=none]{
|
||
colspec={Q[c,m,wd=127.846mm] Q[c,m,wd=20.937mm]},
|
||
colsep=1.905mm, rowsep=0pt, stretch=0,
|
||
hline{1-Z}={\ccborder}, vline{1-Z}={\ccborder},
|
||
row{1-Z}={ht=7.834mm},
|
||
}%
|
||
}{%
|
||
\end{tblr}\par\endgroup}
|
||
|
||
%======================================================================
|
||
% 7. 表 1 —— 教学日历
|
||
%
|
||
% docx:
|
||
% tblW 9385 dxa gridCol = 846,1134,1877,850,2835,1843 = 9385 twips
|
||
% tblLayout autofit jc center
|
||
% tblBorders sz=4 0.5pt
|
||
% tblCellMar 108 twips 1.905mm
|
||
% R0 trHeight 917 atLeast = 16.17mm,表头 11pt 粗
|
||
% R1~R13 无 trHeight,行高由内容决定,数据 9pt 宋体
|
||
% R14 trHeight 1825 atLeast = 32.19mm(任课老师签字)
|
||
% R15 trHeight 1073 atLeast = 18.93mm(审核意见)
|
||
%
|
||
% ⚠️⚠️ 9385 twips = 165.54 mm,而版心只有 159.63 mm —— 超宽 5.91 mm!
|
||
% docx 里它靠 jc=center 硬居中、两边各溢约 3 mm,压进左右页边距。
|
||
% Word 允许表格比版心宽,照原样复刻,不做缩放(缩放会让长文字提前折行)。
|
||
% 本包做法:列宽照抄 gridCol,用 \hspace* 把表左边界推到实际的 27.4mm。
|
||
%
|
||
% ⚠️⚠️ 这张表【总高 334 mm】,版心只有 267 mm —— 必须跨页!
|
||
% 这就是原 docx 排成 5 页的原因。表内 16 行,R1~R13 无 trHeight,
|
||
% 行高由内容(9pt 宋体多行)决定,实测各段行高见 README。
|
||
% docx 没有 tblHeader(跨页不重复表头)、没有 cantSplit(允许行内断开),
|
||
% 故本包用 longtblr,且清空表头/表尾模板,行为与 Word 一致。
|
||
%======================================================================
|
||
\newcommand{\cctblw}{165.54mm} % 9385 twips,与 docx 完全一致
|
||
|
||
% 原始 gridCol(mm)= twips / 1440 × 25.4
|
||
\newcommand{\cccA}{14.922mm} % 846
|
||
\newcommand{\cccB}{20.002mm} % 1134
|
||
\newcommand{\cccC}{33.108mm} % 1877
|
||
\newcommand{\cccD}{14.993mm} % 850
|
||
\newcommand{\cccE}{50.006mm} % 2835
|
||
\newcommand{\cccF}{32.508mm} % 1843
|
||
|
||
% content 宽 = gridCol − 2·colsep − 线宽分摊
|
||
%
|
||
% ⚠️ tabularray 的 wd= 是【内容宽】,但每条 vline 自身还占 0.5pt = 0.17639mm。
|
||
% 6 列共 7 条竖线,若全摊到 6 列上,每列承担 7/6 条 ⇒ 0.2058mm。
|
||
% ⇒ wd = gridCol − 3.81 − 0.2058 = gridCol − 4.0158mm
|
||
%
|
||
% 实测校验(改前 wd 按 gridCol−3.856 给,结果表宽 166.493 差 +0.95):
|
||
% 每列宽 = wd + 2·colsep + 0.176 = 11.066+3.81+0.176 = 15.052 ✔ 与量到的完全一致
|
||
% 改后 Σ(wd+2·colsep) + 7×0.176 = 141.443+22.86+1.232 = 165.535 ≈ 165.54 ✔
|
||
\newcommand{\ccAwd}{10.906mm} % 14.922 − 4.0158
|
||
\newcommand{\ccBwd}{15.986mm} % 20.002 − 4.0158
|
||
\newcommand{\ccCwd}{29.092mm} % 33.108 − 4.0158
|
||
\newcommand{\ccDwd}{10.977mm} % 14.993 − 4.0158
|
||
\newcommand{\ccEwd}{45.990mm} % 50.006 − 4.0158
|
||
\newcommand{\ccFwd}{28.492mm} % 32.508 − 4.0158
|
||
|
||
%----------------------------------------------------------------------
|
||
% 单元格包装
|
||
%
|
||
% ⚠️ 合并格 {c} 是不折行的 LR 模式,长文字会撑宽列 —— 必须包定宽 parbox。
|
||
% 合并格内容可用宽 = Σ所跨各列 wd + 2·colsep·(n−1)
|
||
% R14/R15 是 g=6 的合并格:
|
||
% Σ wd = 10.906+15.986+29.092+10.977+45.990+28.492 = 141.443
|
||
% + 2·1.905·5 = 19.050
|
||
% = 160.493 mm
|
||
%----------------------------------------------------------------------
|
||
\newcommand{\ccspanall}{160.493mm} % R14/R15 合并格可用宽
|
||
|
||
% 表内单格(9pt 宋体,按 docx 原样:C0/C1/C3 居中,C2/C4/C5 左对齐)
|
||
\newcommand{\ccl}[1]{\parbox{\linewidth}{\raggedright #1}}
|
||
\newcommand{\ccc}[1]{\parbox{\linewidth}{\centering #1}}
|
||
|
||
% 表宽 165.54mm > 版心 159.63mm,docx 里 jc=center 让它居中,
|
||
% 左边界落在 (210 − 165.54)/2 = 22.23mm,比版心左 27.52mm 还靠左 5.29mm。
|
||
%
|
||
% ⚠️ longtblr 生成的是一整块 \halign 盒子,【\hspace* 对它无效】(会被吞掉)。
|
||
% 正确做法是 \leftskip:它把段落每一行的起点整体左移。
|
||
% \hsize = 165.54mm → 让表内得下,不报 Overfull
|
||
% \leftskip = −5.29mm → 整块左移,落到 22.23mm
|
||
\newlength{\cctblshift}
|
||
\setlength{\cctblshift}{5.29mm}
|
||
|
||
% ⚠️ 不能用 \NewTblrEnviron + \SetTblrInner:预展开会报
|
||
% "Unexpandable command \ccfang inside column type"。
|
||
% 直接写 \begin{longtblr} 环境最稳。
|
||
%
|
||
% ⚠️ longtblr 默认会在跨页处印 "( Continued )"、印 "表N:" 题注、
|
||
% 页尾印 "Continued on next page"。而原 docx 没有 tblHeader、
|
||
% 没有题注、没有任何续页提示。
|
||
%
|
||
% 清干净需要动【两组】东西,只清一组不够:
|
||
% (a) 内容模板 *-text:contfoot-text / conthead-text / caption-tag / caption-sep
|
||
% (模板实例里调的是 \UseTblrTemplate{...}{default},
|
||
% 只把 conthead 设成 empty 而留着 conthead-text,仍会印出 "( Continued )")
|
||
% (b) 模板实例:caption / conthead / contfoot
|
||
% 实测只做 (b) 时第 5 页仍会出现 "表0:" 与 "(Continued)"。
|
||
%
|
||
% ⚠️⚠️ conthead-text / contfoot-text 不能设成 empty!那会报
|
||
% "! Use of \??? doesn't match its definition.
|
||
% LaTeX3 Error: Erroneous variable \l__tblr_template_conthead_text_tl"
|
||
% (因为 normal 实例会 \tl_use 这个变量,empty 变体里没定义它)。
|
||
% 正确做法:用 \DefTblrTemplate 重新定义成「内容为空」的 normal 模板。
|
||
\DefTblrTemplate{conthead-text}{normal}{}
|
||
\DefTblrTemplate{contfoot-text}{normal}{}
|
||
\SetTblrTemplate{conthead-text}{normal}
|
||
\SetTblrTemplate{contfoot-text}{normal}
|
||
\SetTblrTemplate{caption-tag}{empty}
|
||
\SetTblrTemplate{caption-sep}{empty}
|
||
\SetTblrTemplate{caption-text}{empty}
|
||
\SetTblrTemplate{caption}{empty}
|
||
\SetTblrTemplate{conthead}{empty}
|
||
\SetTblrTemplate{contfoot}{empty}
|
||
|
||
\newenvironment{cctable}{%
|
||
\par\begingroup
|
||
\hsize=\cctblw \linewidth=\cctblw
|
||
\leftskip=-\cctblshift \rightskip=0pt \parindent=0pt
|
||
\begin{longtblr}[
|
||
label=none,
|
||
% ⚠️⚠️ presep/postsep/headsep/footsep 是【outer】键,只能写在这个方括号里。
|
||
% 写进下面的花括号(inner spec)里不会生效,反而会把 "0pt" 当表内容
|
||
% 印在表格第一行 —— 实测表头上出现了一串 "0pt0pt0pt0pt" 垃圾字。
|
||
presep=0pt, postsep=0pt, headsep=0pt, footsep=0pt,
|
||
]{
|
||
colspec={
|
||
Q[c,m,wd=10.906mm] Q[c,m,wd=15.986mm] Q[l,m,wd=29.092mm]
|
||
Q[c,m,wd=10.977mm] Q[l,m,wd=45.990mm] Q[l,m,wd=28.492mm]
|
||
},
|
||
colsep=1.905mm, rowsep=0pt, stretch=0,
|
||
hline{1-Z}={\ccborder}, vline{1-Z}={\ccborder},
|
||
% ⚠️ 表级默认字号必须写 cells={font=...},不能只写 font=。
|
||
% tabularray 的 inner 已知键里【没有 font】,单独写 font=\ccszix
|
||
% 会被当成未知键静默忽略(不会报错!),表内就退回到文档的 12pt。
|
||
% docx 里表 1 绝大多数格是 sz18 = 9pt。
|
||
cells={font=\ccszix},
|
||
% 下列三行照 docx 的 trHeight atLeast 复刻:
|
||
% R0 917 twips = 16.17mm(表头)
|
||
% R14 1825 twips = 32.19mm(任课老师签字)
|
||
% R15 1073 twips = 18.93mm(审核意见)
|
||
row{1}={ht=16.17mm},
|
||
row{15}={ht=32.19mm},
|
||
row{16}={ht=18.93mm},
|
||
}%
|
||
}{%
|
||
\end{longtblr}\par\endgroup}
|
||
|
||
%======================================================================
|
||
% 8. 签字栏(第一页末尾)
|
||
%
|
||
% docx P53~P62:全部 14pt 方正仿宋,段前 120 twips = 6pt
|
||
% P55 任课老师(签字):
|
||
% P57 教学院长审核意见:
|
||
% P60 教学院长签字:
|
||
% P62 「年 月 日」首行缩进 708 twips = 12.50mm,前面 41 个半角空格
|
||
%
|
||
% ⚠️ 原文件这里不是表格,是纯段落 + 空格凑出来的空白。
|
||
% 本包改为等价的 \vspace 与右对齐,结构更干净、位置一致。
|
||
%======================================================================
|
||
\newcommand{\ccsignlab}[1]{%
|
||
\par\begingroup\ccfang\ccszxiii
|
||
\vspace*{6pt}\noindent #1\par\endgroup}
|
||
|
||
\newcommand{\ccdateblank}{%
|
||
\par\begingroup\ccfang\ccszxiii
|
||
\vspace*{6pt}%
|
||
\noindent\hspace*{12.50mm}%
|
||
\makebox[90mm][r]{年\hspace{2em}月\hspace{2em}日}%
|
||
\par\endgroup}
|
||
|
||
%======================================================================
|
||
% 9. 教学日历页标题
|
||
%
|
||
% docx P64:小标宋 14pt 加粗,居中,行距 360 auto(= 1.5 倍)
|
||
%======================================================================
|
||
\newcommand{\ccdaytitle}[1]{%
|
||
\par\begingroup\centering
|
||
{\ccbiaosong\ccszxiii #1\par}%
|
||
\endgroup}
|
||
|
||
\newcommand{\ccnewpage}{\par\newpage}
|
||
|
||
%======================================================================
|
||
% 10. 表尾「合计」行后的说明性小字(10.5pt)
|
||
%======================================================================
|
||
\newcommand{\ccsmall}{\ccszxxi}
|
||
|
||
\RequirePackage{ifthen}
|
||
\makeatletter
|
||
\providecommand{\@tempcnta}{}
|
||
\makeatother
|
||
\endinput |