diff --git a/README.md b/README.md index 6ba2f57..77761e4 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ | 目录 | 内容 | 编译入口 | |---|---|---| | [`试卷/`](试卷/) | 期末考试**试卷**、**参考答案及评分标准**两套模板 | `试卷题型示例.tex`、`参考答案与评分标准示例.tex` | +| [`试卷归档封面/`](试卷归档封面/) | 信息科学与工程学部**试卷归档封面**(理论课) | `试卷归档封面.tex` | | [`年度考核登记表/`](年度考核登记表/) | 教职工**年度考核登记表** | `年度考核登记表.tex` | | [`劳务发放说明表/`](劳务发放说明表/) | **劳务发放说明表** | `劳务发放说明表.tex` | | [`课程执行大纲/`](课程执行大纲/) | 本科**课程教学执行大纲、教学日历** | `课程执行大纲.tex` | @@ -23,15 +24,32 @@ xelatex slides.tex xelatex slides.tex # 跑两遍,第二遍才能取到正确的目录、交叉引用与总页数 ``` -目录名含中文不影响编译(已实测 6 个模板在中文目录下零报错编译通过)。 +目录名含中文不影响编译(已实测 7 个模板目录在中文目录下零报错编译通过)。 ## 说明 -- **每个子目录自包含**:样式文件(`.sty` / `.cls`)、字体、图片都在各目录内,编译时不需要额外的宏包搜索路径。 -- **字体随模板附带**:`幻灯片/fonts/`(鸿蒙 HarmonyOS Sans)、`科技报告/font/`(鸿蒙 + 方正系列)内置了字体文件,**无需在系统里安装字体**。其余四个模板用系统自带的宋体 / 黑体 / 仿宋 / Times New Roman,缺失时按各目录 README 的降级表替换。 +- **字体单一来源**:全库字体集中在根目录 [`fonts/`](fonts/),由 [`fonts.tex`](fonts.tex) 统一加载。七个模板通过 `\input{../fonts.tex}` 取字体,**不自带字体、不依赖系统字体**——换机器(Windows / macOS / Linux / Overleaf)编译结果一致。 +- **全部开源可商用**:无方正、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、无微软雅黑。用的是思源宋体/黑体、霞鹜文楷、朱雀仿宋、TeX Gyre Termes、鸿蒙 HarmonyOS Sans(各字体授权见 [`fonts/LICENSE`](fonts/LICENSE),来源与字符集见 [`fonts/README.md`](fonts/README.md))。 +- **每个子目录自包含**:样式文件(`.sty` / `.cls`)、图片都在各目录内,编译时不需要额外的宏包搜索路径;只有字体是共享的上层目录。 - **各目录的 `README.md`** 写明该模板的用法、可改参数、版式数据来源与书写注意事项,改之前先看。 - **示例内容为占位**:模板均不含真题、不含真人信息,姓名 / 学号 / 职工号 / 课程代码等一律用 `×` 或虚构值占位,按实际情况替换即可。 +## 字体 + +| 目录 | 字体 | 上游 | 授权 | +|---|---|---|---| +| `fonts/ouc-serif/` | OUC Serif(宋体) | 思源宋体 SC 的 GB2312 子集 | SIL OFL 1.1 | +| `fonts/ouc-sans/` | OUC Sans(黑体) | 思源黑体 SC 的 GB2312 子集 | SIL OFL 1.1 | +| `fonts/ouc-kai/` | OUC Kai(楷体) | 霞鹜文楷的 GB2312 子集 | SIL OFL 1.1 | +| `fonts/zhuque-fangsong/` | 朱雀仿宋(仿宋) | 朱雀仿宋 | SIL OFL 1.1 | +| `fonts/tex-gyre-termes/` | TeX Gyre Termes(西文) | Times New Roman 度量兼容替代 | GUST Font License | +| `fonts/harmonyos-sans/` | HarmonyOS Sans(幻灯片/科技报告) | 华为 | 华为官方允许免费商用 | + +合计约 49 MB(改造前 141 MB,见 [`fonts/README.md`](fonts/README.md) 第五节)。 + +> 子集字体已按 OFL §3 改名(`Source` / `LXGW` 是上游的 Reserved Font Name,裁剪即构成修改版),并保留了 OFL 声明。 +> 用本模板编译出的文档**不受**这些字体授权约束,版权归作者本人。 + ## 历史沿革 `幻灯片/` 与 `科技报告/` 此前分别维护在两个独立仓库(`ouc-slide-latex-template`、`ouc-report-latex-template`),2026-10 起**并入本仓库统一维护**,两个旧仓库不再更新。迁入时保留了原有目录结构、字体与图片资源,旧仓库的提交历史留在原仓库中。 \ No newline at end of file diff --git a/fonts.tex b/fonts.tex new file mode 100644 index 0000000..428e8a2 --- /dev/null +++ b/fonts.tex @@ -0,0 +1,274 @@ +%====================================================================== +% oucfonts.tex —— 中国海洋大学模板库的公共字体入口 +% +% 本文件是仓库内**唯一**允许声明字体的地方。七个模板全部通过 +% \input{../fonts.tex} +% 取字体,不再各自写 \setCJKmainfont / \setmainfont。 +% +% 为什么是 .tex + \input 而不是 .sty + \usepackage: +% \usepackage 走 LaTeX 的 package 机制,要求 \ProvidesPackage 的名字 +% 与 \usepackage 的参数严格一致。我们从子目录用相对路径调用 +% (\usepackage{../oucfonts}),名字必然对不上,会报 +% "You have requested package `../oucfonts' but the package provides +% `oucfonts'." 的警告。用 \input 直接插入文件内容,没有这个问题, +% 而且对宏包加载顺序的控制也更直接。 +% +% ------------------------------------------------------------------ +% 用法 +% ------------------------------------------------------------------ +% \documentclass[UTF8,fontset=none]{ctexart} +% \input{../fonts.tex} +% +% ⚠️ 必须保留 fontset=none:否则 ctex 会先按系统字体配一套, +% 再被这里覆盖,既浪费又有平台依赖。 +% +% ⚠️ Path=../fonts/ 是相对**模板目录**的(编译时的工作目录)。 +% 在本模板目录下 xelatex 编译即可,不要从仓库根调用。 +% +% ------------------------------------------------------------------ +% 提供的字族命令 +% ------------------------------------------------------------------ +% \songti 宋体(衬线正文) OUC Serif ← 思源宋体 SC 子集 +% \heiti 黑体(无衬线标题) OUC Sans ← 思源黑体 SC 子集 +% \kaiti 楷体 OUC Kai ← 霞鹜文楷子集 +% \fangsong 仿宋 Zhuque Fangsong ← 朱雀仿宋 +% \tnr 西文 Times 等价 TeX Gyre Termes +% \tnrb 西文 Times 粗体 TeX Gyre Termes Bold +% \hm 鸿蒙 Sans SC 幻灯片/科技报告 原有字体 +% \hmlatin 鸿蒙 Sans(西文) 幻灯片/科技报告 原有字体 +% +% 正文字体:中文 OUC Serif,西文 TeX Gyre Termes。 +% +% 本文件**可重复** \input(用 \ifdefined 保护),方便多个 .sty 各自引用。 +% +% ------------------------------------------------------------------ +% 字体来源与授权(全部允许免费商用与再分发) +% ------------------------------------------------------------------ +% OUC Serif / OUC Sans 思源宋体/黑体 SC 的 GB2312 子集, +% Adobe 原版 SIL OFL 1.1。改名以符合 OFL §3 +% (原 Reserved Font Name 为 "Source")。 +% OUC Kai 霞鹜文楷 GB2312 子集,SIL OFL 1.1。 +% Zhuque Fangsong 朱雀仿宋,OFL 1.1。 +% TeX Gyre Termes GUST Font License(GPL + 字体例外)。 +% HarmonyOS Sans 华为,官方声明可免费商用。 +% +% 详细来源、版本与被裁剪的字符集见 fonts/README.md。 +% **本模板库不含任何商业字体**(无方正、无 SimSun/SimHei/KaiTi/FangSong、 +% 无 Times New Roman)。 +%====================================================================== +\ifdefined\OUCFontsLoaded + \endinput +\else + \def\OUCFontsLoaded{1} +\fi + +\RequirePackage{fontspec} +\RequirePackage{xeCJK} + +%====================================================================== +% 一、西文主字体:TeX Gyre Termes(Times 的度量兼容开源替代) +% +% Termes 与 Times New Roman 字符宽度逐字相同,因此原有的西文断行、 +% 表格列宽、行内公式对齐都不会因为换字体而漂。 +%====================================================================== +\setmainfont{texgyretermes}[ + Extension = .otf, + Path = ../fonts/tex-gyre-termes/, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, +] + +%====================================================================== +% 二、中文主字体 +% +% 宋体为正文,黑体为强调。二者的粗体都是字体自带的真粗体, +% 不再用 AutoFakeBold 算法描边 —— 描边出来的粗体笔画会糊在一起, +% 尤其小字号下(原模板 14pt 的宋体会糊成一团)。 +% +% ⚠️ 这里用 \setCJKmainfont 而不是 \setCJKfamilyfont + \def: +% \setCJKmainfont 会顺带把 \CJKrmdefault 指到新族上,正文默认 +% 字体才真的换过来。若文档是 ctex 默认 fontset,ctex 早已设过 +% \CJKrmdefault,xeCJK 会打一条 +% Package xeCJK Warning: Redefining CJKfamily `\CJKrmdefault' +% 这是**预期**行为(我们就是要覆盖 ctex 按系统字体配的那套), +% 不影响输出,也无害;看到它不必处理。 +% +% ------------------------------------------------------------------ +% 斜体与粗斜体:中文没有真正的斜体字形,中文排版惯例是「用楷体代 +% 斜体、用仿宋代粗斜体」(《党政机关公文格式》与 Word 的中文默认 +% 行为都是这么做的)。原科技报告模板正是 +% ItalicFont = 方正楷体 +% BoldItalicFont = 方正仿宋 +% 这里保持同样的语义映射:楷体 → OUC Kai,仿宋 → Zhuque Fangsong。 +% +% ⚠️ 各档位的字体在**不同目录**里,不能共用主选项的 Path/Extension。 +% 必须在该档位的 *Features 里单独写一套 Path + Extension + +% UprightFont —— 主 Path 会被继承,若不在 Features 里覆盖,就会 +% 拿 ../fonts/ouc-serif/ 去拼 OUCKai-Regular.ttf,报 +% "The font "OUCKai-Regular" cannot be found"。 +% +% ⚠️ 只在 \setCJKmainfont 上给了斜体,**不影响** \songti / \heiti / +% \kaiti / \fangsong 这几个字族命令 —— 它们是独立的字体族,各自 +% 没有斜体档。要中文斜体就用默认正文(或先 \songti 再 \textit, +% 此时 \textit 落回 \CJKrmdefault 也就是 OUC Serif 的斜体)。 +%====================================================================== +\setCJKmainfont{OUCSerif}[ + Extension = .otf, + Path = ../fonts/ouc-serif/, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = OUCKai-Regular, + ItalicFeatures = { + Extension = .ttf, + Path = ../fonts/ouc-kai/, + UprightFont = *-Regular, + BoldFont = *-Bold, + }, + BoldItalicFont = ZhuqueFangsong-Regular, + BoldItalicFeatures = { + Extension = .ttf, + Path = ../fonts/zhuque-fangsong/, + UprightFont = *-Regular, + }, +] + +%====================================================================== +% 三、字族命令 +% +% ⚠️ 这里**不能**用 \newCJKfontfamily / \newfontfamily。 +% 原因:只要文档用了 ctex 的默认 fontset(即 \documentclass 里没写 +% fontset=none),ctex 就已经定义了 \songti / \heiti / \kaiti / +% \fangsong,而这两个命令底层是 LaTeX3 的 \NewDocumentCommand, +% 命令已存在时会抛 +% ! LaTeX3 Error: Control sequence \songti already defined. +% 并**中断编译**(试卷/ouckey.sty 就是这种情况,报 4 个错误)。 +% 用 \providecommand 先占位也没用 —— \newCJKfontfamily 仍然报。 +% +% 正确写法分两步: +% 1. \setCJKfamilyfont{族名}[选项]{字体} 只登记字体,不建命令, +% 同名重复登记只是覆盖,永远不报错; +% 2. \def\songti{\CJKfamily{族名}} 纯 \def,从不管旧定义。 +% 这也是 ctex 自己定义 \songti 的方式。 +%====================================================================== + +% 宋体 +\setCJKfamilyfont{OUCSong}[ + Extension = .otf, + Path = ../fonts/ouc-serif/, + UprightFont = *-Regular, + BoldFont = *-Bold, +]{OUCSerif} +\def\songti{\CJKfamily{OUCSong}} + +% 黑体 +\setCJKfamilyfont{OUCHei}[ + Extension = .otf, + Path = ../fonts/ouc-sans/, + UprightFont = *-Regular, + BoldFont = *-Bold, +]{OUCSans} +\def\heiti{\CJKfamily{OUCHei}} + +% 楷体(霞鹜文楷) +% 顺带提供 \kaishu 别名:ctex 的默认 fontset 用 \kaishu,而原模板多用 +% \kaiti,两个名字都指同一族,免得改接时漏改一处就静默回落系统字体。 +\setCJKfamilyfont{OUCKai}[ + Extension = .ttf, + Path = ../fonts/ouc-kai/, + UprightFont = *-Regular, + BoldFont = *-Bold, +]{OUCKai} +\def\kaiti{\CJKfamily{OUCKai}} +\def\kaishu{\CJKfamily{OUCKai}} + +% 仿宋(朱雀仿宋,只有常规一档,无粗体) +% ⚠️ 需要粗体的场合请改用 \heiti 或 \songti,不要指望 \fangsong 变粗。 +\setCJKfamilyfont{OUCFang}[ + Extension = .ttf, + Path = ../fonts/zhuque-fangsong/, + UprightFont = *-Regular, +]{ZhuqueFangsong} +\def\fangsong{\CJKfamily{OUCFang}} + +% 西文:显式取 Times 形态(原模板里 \tnr / \tnrb / \sunfont 的替代) +% +% ⚠️ 四个档位必须全给。只给 UprightFont 的话,在 \bfseries 环境里会落到 +% "Font shape `TU/texgyretermes/b/n' undefined" 并静默替换, +% 表现为加粗失效(试卷的 \TNRB 与 \qnum 都会踩到)。 +\newfontfamily\tnr{texgyretermes}[ + Extension = .otf, + Path = ../fonts/tex-gyre-termes/, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, +] +\newfontfamily\tnrb{texgyretermes}[ + Extension = .otf, + Path = ../fonts/tex-gyre-termes/, + UprightFont = *-bold, + BoldFont = *-bold, + ItalicFont = *-bolditalic, + BoldItalicFont = *-bolditalic, +] + +% 鸿蒙 Sans:幻灯片与科技报告原有字体,保留以维持这两个模板的原有观感 +% ⚠️ 鸿蒙的文件名以下划线分隔(HarmonyOS_Sans_SC_Regular.ttf), +% 不是 OHM 风格的 "族名-字重",所以这里不能写 *-Regular 通配, +% 必须显式给完整文件名。 +% ⚠️ 用了 UprightFont 就**不要**再给主参数 {字体名}。给了两个,fontspec +% 会把主参数当文件名、UprightFont 当变体名再拼一次,报 +% "The font HarmonyOS_Sans_SC_Regular.ttf cannot be found"。 +% 正确写法是只留主参数(下面这种),或用 Extension + UprightFont。 +\setCJKfamilyfont{OUCHM}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_SC_Bold.ttf, +]{HarmonyOS_Sans_SC_Regular.ttf} +\def\hm{\CJKfamily{OUCHM}} + +\newfontfamily\hmlatin{HarmonyOS_Sans_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_Bold.ttf, + ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf, + BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf, +] + +%====================================================================== +% 四、把几个「长得像西文、其实该走中文」的符号归入 CJK 字符类 +% +% 顺序很重要:必须在 \setCJKmainfont 之后、正文开始之前。 +% 下面这些 \xeCJKDeclareCharClass 是**全局**生效的,一次即可。 +% +% 为什么要这么做:xeCJK 按 Unicode 区段分类,下面这些字符落在 +% Latin-1 / General Punctuation / Geometric Shapes,默认都被判成 +% **西文**,交给 fontspec 的西文字体(Termes)。后果有两层: +% ① 宽度错:× 在 SimSun/思源里本来是 1.0 em 全角,被当西文排 +% 就只剩 0.56 em,与汉字不齐、基线也偏(\heiti{××} 尤其明显); +% ② 缺字:□(U+25A1)Termes 里根本没有,直接报 +% "Missing character: There is no □ (U+25A1)",印出来是空白。 +% 而 \heiti / \fangsong 只切 CJK 字体族,管不到它们 —— 包一层没用。 +%====================================================================== +\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号(占位符 ××× 最常用) +\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号(em dash) +\xeCJKDeclareCharClass{CJK}{"25A1} % □ 白方框(勾选框 □ 同意 □ 不同意) +\xeCJKDeclareCharClass{CJK}{"25A0} % ■ 实心方框 +\xeCJKDeclareCharClass{CJK}{"25CB} % ○ 白圆圈(单选题选项圈) +\xeCJKDeclareCharClass{CJK}{"25CF} % ● 实心圆 +\xeCJKDeclareCharClass{CJK}{"2610} % ☐ 选票框 +\xeCJKDeclareCharClass{CJK}{"2611} % ☑ 打勾选票框 +\xeCJKDeclareCharClass{CJK}{"2612} % ☒ 打叉选票框 +\xeCJKDeclareCharClass{CJK}{"221A} % √ 根号(勾选/判卷常用) +\xeCJKDeclareCharClass{CJK}{"203B} % ※ 参考标记 + +%====================================================================== +% 五、行距 +% +% 这里不全局改 \linespread,因为各模板需求不同(科技报告依赖 ctex +% 默认值,试卷归档封面/课程执行大纲/年度考核登记表必须归 1 才能 +% 还原 docx 的精确行高)。只提供工具命令,由各模板自行调用。 +%====================================================================== +\newcommand{\ouclinespread}[1]{\linespread{#1}\relax} + +\endinput \ No newline at end of file diff --git a/fonts/LICENSE b/fonts/LICENSE new file mode 100644 index 0000000..59bde55 --- /dev/null +++ b/fonts/LICENSE @@ -0,0 +1,97 @@ +本目录(fonts/)下的字体文件版权与授权说明 +========================================== + +本目录不含任何商业字体。以下逐项列明来源、授权与授权原文位置。 +本文件不是授权全文的替代 —— 每个字体各自的完整授权文本见其 name 表 +的第 13/14 号记录(License Description / License Info URL),也可在 +下列上游地址取得。 + +-------------------------------------------------------------------------------- +一、OUCSerif-*.otf / OUCSans-*.otf +-------------------------------------------------------------------------------- +上游字体:思源宋体 SC(Source Han Serif SC)/ 思源黑体 SC(Source Han Sans SC) +上游作者:Adobe(与 Google 合作,Noto Serif/Sans CJK 为同源字体) +上游地址:https://github.com/adobe-fonts/source-han-serif + https://github.com/adobe-fonts/source-han-sans +授权:SIL Open Font License, Version 1.1 +授权原文:https://scripts.sil.org/OFL + +本仓库的文件是上述字体的 GB2312 子集(保留 7555 字符),并已按 OFL 1.1 +第 3 条改名(上游 Reserved Font Name 为 "Source")。改名同时更新了 +CFF 层的 fontNames / FamilyName / FullName 与 name 表,并在 name 表 +13/14 号记录中保留了完整 OFL 声明及以下免责说明: + + This is a subset of the upstream font, renamed to comply with + SIL OFL 1.1 Section 3 (Reserved Font Name). It is not affiliated + with, nor endorsed by, the upstream authors. + +-------------------------------------------------------------------------------- +二、OUCKai-*.ttf +-------------------------------------------------------------------------------- +上游字体:霞鹜文楷(LXGW WenKai) +上游作者:LXGW +上游地址:https://github.com/lxgw/LxgwWenKai +授权:SIL Open Font License, Version 1.1 +授权原文:https://scripts.sil.org/OFL + +本仓库的文件是 GB2312 子集(保留 7557 字符),已按 OFL 1.1 第 3 条改名 +(上游 Reserved Font Name 含 "LXGW"),免责说明同上。 + +-------------------------------------------------------------------------------- +三、ZhuqueFangsong-Regular.ttf +-------------------------------------------------------------------------------- +上游字体:朱雀仿宋(TrionesType Zhuque Fangsong) +上游地址:https://github.com/TrionesType/zhuque +授权:SIL Open Font License, Version 1.1 +授权原文:https://scripts.sil.org/OFL + +本仓库的文件为原版直接分发,未做字符集裁剪,未改名。 +版本:Version 0.212 (technical preview)。注意为预览版,字形可能随上游更新。 + +-------------------------------------------------------------------------------- +四、texgyretermes-*.otf +-------------------------------------------------------------------------------- +上游字体:TeX Gyre Termes +上游项目:GUST(Polish TeX Users Group)e-foundry +上游地址:http://www.gust.org.pl/projects/e-foundry/tex-gyre +授权:GUST Font License (GFL) + 即 GNU General Public License 附加"字体嵌入例外"—— + 把本字体嵌入文档(含 PDF)并分发该文档,不构成对 GPL 的违反。 +授权原文:随 TeX Live 分发于 + texmf-dist/doc/fonts/tex-gyre/GUST-FONT-LICENSE.txt + +本仓库为原版直接分发,未修改。 + +-------------------------------------------------------------------------------- +五、HarmonyOS_Sans_*.ttf / HarmonyOS_Sans_SC_*.ttf +-------------------------------------------------------------------------------- +上游字体:HarmonyOS Sans / HarmonyOS Sans SC +上游作者:华为(Huawei) +上游地址:https://developer.harmonyos.com/cn/docs/design/font-0000001157868583 +授权:华为官方在 HarmonyOS 设计文档中声明,HarmonyOS Sans 字体 + **可免费用于商业用途**,可自由下载、使用、复制、合并、发布。 + 该授权不是 SIL OFL,属于华为自有许可。 + +本仓库为原版直接分发,未修改。仅保留实际用到的 6 个字重 +(Regular / Bold / 各自的 Italic / SC Regular / SC Bold)。 + +-------------------------------------------------------------------------------- +六、关于"用这些字体排出来的文档" +-------------------------------------------------------------------------------- +按 SIL OFL 1.1 第 5 条,以 OFL 字体排版、嵌入或衍生的**文档本身** +不受 OFL 约束,不因此被"感染"为 OFL 作品。因此用本模板库编译出的 +论文、报告、试卷、幻灯片,其著作权完全属于作者本人,可自由发表、 +商用、闭源分发。 + +-------------------------------------------------------------------------------- +七、合规自查结论 +-------------------------------------------------------------------------------- +[x] 无方正(FZ*)、无 SimSun / SimHei / KaiTi / FangSong、无 Times New Roman、 + 无 Microsoft YaHei —— 这些均不允许随仓库再分发。 +[x] 思源系列与霞鹜文楷的子集已改名,符合 OFL 1.1 §3。 +[x] 所有 OFL 字体均保留授权全文(name 表 13/14 号),符合 OFL 1.1 §1。 +[x] 未使用上游作者名义作任何背书暗示。 +[x] TeX Gyre Termes 的 GFL 允许随文档分发。 +[x] HarmonyOS Sans 为华为官方允许免费商用。 + +如对本目录内任何字体的授权有疑问,请以上游地址的授权原文为准。 \ No newline at end of file diff --git a/fonts/README.md b/fonts/README.md new file mode 100644 index 0000000..29c9b8b --- /dev/null +++ b/fonts/README.md @@ -0,0 +1,264 @@ +# fonts/ —— 模板库公共字体目录 + +本目录是**中国海洋大学 LaTeX 模板库唯一的一份字体来源**。仓库里七个模板全部通过 +根目录的 [`../fonts.tex`](../fonts.tex) 取字体,不再有任何模板自带字体、也不依赖 +操作系统里装了什么字体。换一台机器、换一个操作系统(Windows / macOS / Linux / +Overleaf),编译出来的样子都一样。 + +``` +fonts/ +├── ouc-serif/ OUC Serif 宋体(衬线正文) 2 个,9.7 MB +├── ouc-sans/ OUC Sans 黑体(无衬线标题) 2 个,7.0 MB +├── ouc-kai/ OUC Kai 楷体 2 个,7.0 MB +├── zhuque-fangsong/ Zhuque Fangsong 仿宋 1 个,8.4 MB +├── tex-gyre-termes/ TeX Gyre Termes 西文 Times 等价 4 个,550 KB +└── harmonyos-sans/ HarmonyOS Sans 鸿蒙(中英各一档) 6 个,16 MB +``` + +合计约 **49 MB**(改造前是 141 MB:幻灯片 49 MB + 科技报告 92 MB 各自带一份, +外加两套重复的字体。现在全库只有这一份,省掉 65%)。 + +--- + +## 一、为什么要把字体打进仓库 + +原先七个模板是两种做法: + +| 做法 | 模板 | 问题 | +|---|---|---| +| 各自带一份字体 | `幻灯片/`(鸿蒙 18 个文件 49 MB)、`科技报告/`(鸿蒙 + 方正 5 款 92 MB) | 两份重复;字体版本一旦不同步,两个模板的样子就会不一致 | +| 直接用系统字体 | 其余五个(SimSun / SimHei / FangSong / KaiTi / Times New Roman) | 换台机器(Linux、macOS、精简版 Windows、Overleaf)直接编不出来;而且这些字体**不允许随仓库分发** | + +统一成一份公共字体后: + +- **编译结果可复现** —— 与操作系统、与是否装过某款字体无关。 +- **授权干净** —— 全库不含任何商业字体,见第四节。 +- **体积可控** —— 只保留实际用到的字重与字符集。 + +--- + +## 二、各字体的来源与授权 + +全部为**开源或官方允许免费商用**的字体。逐项如下。 + +### 1. OUC Serif / OUC Sans / OUC Kai —— 思源系列与霞鹜文楷的子集 + +| | 上游字体 | 上游作者 | 上游授权 | 字符集 | +|---|---|---|---|---| +| OUC Serif | 思源宋体 SC(Source Han Serif SC) | Adobe | SIL OFL 1.1 | GB2312,7555 字 | +| OUC Sans | 思源黑体 SC(Source Han Sans SC) | Adobe | SIL OFL 1.1 | GB2312,7555 字 | +| OUC Kai | 霞鹜文楷(LXGW WenKai) | LXGW | SIL OFL 1.1 | GB2312,7557 字 | + +> **为什么改名叫 OUC Serif / OUC Sans / OUC Kai?** +> SIL OFL 1.1 第 3 条规定:修改版不得使用上游的 Reserved Font Name。 +> 思源系列的 RFN 是 `Source`,霞鹜的 RFN 含 `LXGW`。裁剪字符集属于 +> "修改版",因此必须改名,且不得暗示原作者为本仓库背书。 +> 改名同时改了 **CFF 层**的 `fontNames` / `FamilyName` / `FullName` +> —— 只改 name 表是不够的,PDF 里内嵌的字体名取的是 CFF 层。 +> 字体 name 表的 13/14 号记录保留了完整 OFL 声明与"本字体为子集、 +> 与上游作者无关"的免责说明。 + +**裁剪范围**:保留 GB2312 全集(6763 汉字)+ 常用标点 + 拉丁字母 + 希腊字母 ++ 数学符号,约 7555 个字符。**不保留** GBK 扩展区与生僻字。 + +> ⚠️ 如果将来正文要用 GB2312 之外的生僻字(例如某些人名、地名用字), +> 会显示成空白或方框。此时需要重新生成子集,把该字加进去。 +> 生成脚本见第七节。 + +### 2. Zhuque Fangsong —— 朱雀仿宋 + +| | | +|---|---| +| 上游 | 朱雀仿宋(TrionesType / Zhuque Fangsong) | +| 授权 | SIL OFL 1.1 | +| 字符集 | 12882 字符,**GB2312 全集覆盖** | +| 版本 | 0.212(technical preview) | + +未做裁剪(原文件 8.4 MB 已经够小,且保留全集更安全)。 +**只有常规一档,没有粗体** —— 需要粗体的地方请改用黑体或宋体。 + +### 3. TeX Gyre Termes —— 西文 Times 等价字体 + +| | | +|---|---| +| 上游 | TeX Gyre Termes(GUST 字体项目) | +| 授权 | GUST Font License(GPL + 字体嵌入例外) | +| 特性 | 与 Times New Roman **逐字度量兼容** | + +用它是为了保证中文模板里原有的西文断行、表格列宽、行内公式对齐不漂移。 +实测同一段英文,Termes 与 Times New Roman 的逐词宽度差在 0.03pt 量级。 + +### 4. HarmonyOS Sans —— 鸿蒙字体 + +| | | +|---|---| +| 上游 | HarmonyOS Sans(华为) | +| 授权 | 华为官方声明允许**免费商用**(随 HarmonyOS 开发者文档发布) | +| 保留原因 | `幻灯片/` 与 `科技报告/` 原有观感就是鸿蒙,换成思源会明显改变这两个模板的视觉 | + +只保留实际用到的 6 个文件:`HarmonyOS_Sans_{Regular,Bold}`(西文)、 +`HarmonyOS_Sans_{Regular,Bold}_Italic`、`HarmonyOS_Sans_SC_{Regular,Bold}`(中文)。 +原目录里的 Black / Light / Medium / Thin 等 12 个字重全库无人引用,已删除。 + +> ⚠️ 鸿蒙字体的文件名用**下划线**分隔(`HarmonyOS_Sans_SC_Regular.ttf`), +> 不是 `族名-字重` 格式。所以在 fontspec 里不能写 `*-Regular` 通配, +> 必须显式给完整文件名。 + +--- + +## 三、字体是怎么被调用的 + +所有模板都只做一件事:在导言区 `\input{../fonts.tex}`(幻灯片与科技报告因为 +目录层级不同,路径略作调整)。`fonts.tex` 负责: + +1. 加载 fontspec / xeCJK; +2. 注册默认族与 `\songti` / `\heiti` / `\kaiti` / `\fangsong` / `\kaishu` / + `\tnr` / `\tnrb` / `\hm` / `\hmlatin`; +3. 把 `×` `—` `□` `○` `√` 等「长得像西文、其实该走中文」的符号 + 归入 CJK 字符类(详见该文件的注释); +4. 提供 `\ouclinespread` 行距工具。 + +各模板自己**不再写任何** `\setCJKmainfont` / `\setmainfont`。 + +### ⚠️ 三个容易踩的坑(都写在 fonts.tex 的注释里了) + +1. **必须保留 `fontset=none`。** + `\documentclass[UTF8,fontset=none]{ctexart}`。不写的话 ctex 会先按系统字体 + 配一套(Microsoft YaHei / SimSun / FangSong),再被覆盖,既浪费又有平台 + 依赖。`试卷/ouckey.sty` 因为继承 ctexart 默认 fontset,所以 fonts.tex 里 + 用 `\setCJKfamilyfont` + `\def` 而不是 `\newCJKfontfamily`—— + 后者是 LaTeX3 的 `\NewDocumentCommand`,命令已存在时会报 + `! LaTeX3 Error: Control sequence \songti already defined.` 并中断编译。 + +2. **`Path=` 是相对编译时的工作目录,不是相对 .sty 文件。** + 模板目录下 `xelatex xxx.tex`,所以写 `../fonts/...`。 + 幻灯片与科技报告的主题文件虽然在子目录里,路径仍按工作目录写 `../fonts/`。 + +3. **`Path=` 不能写宏。** 它是 fontspec 的参数,必须给字面字符串。 + +--- + +## 四、授权合规自查 + +- [x] 全库不含方正、SimSun、SimHei、KaiTi、FangSong、Times New Roman、 + Microsoft YaHei 等不可分发的商业字体。 +- [x] 思源系列与霞鹜文楷的**子集**已改名,符合 OFL 1.1 §3(Reserved Font Name)。 +- [x] 子集保留了 OFL 全文(name 表 13/14 号记录),符合 OFL 1.1 §1(随附授权)。 +- [x] 改名后的 name 表写明"本字体为子集,与上游作者无关",未暗示背书。 +- [x] TeX Gyre Termes 为 GUST Font License,允许随文档分发。 +- [x] HarmonyOS Sans 为华为官方允许免费商用。 +- [x] 本目录的 [LICENSE](LICENSE) 汇总了各字体的授权原文出处。 + +> **注意**:OFL 要求"以 OFL 字体排版产生的文档"不受 OFL 约束 +> (§5 文档本身不因此被感染)。所以用本模板编译出来的论文、报告、 +> 试卷,版权完全属于作者,不受这些字体授权的影响。 + +--- + +## 五、体积 + +``` +改造前(字体分散在各模板目录) + 幻灯片/fonts/ 49 MB + 科技报告/font/ 92 MB + 合计 141 MB + +改造后(统一到 fonts/) + ouc-serif 9.7 MB + ouc-sans 7.0 MB + ouc-kai 7.0 MB + zhuque-fangsong 8.4 MB + tex-gyre-termes 0.55 MB + harmonyos-sans 16.4 MB + 合计 49 MB (省 65%) +``` + +--- + +## 六、当前各模板的字体对应关系 + +| 模板 | 中文正文 | 中文标题/强调 | 西文 | +|---|---|---|---| +| `试卷归档封面/` | OUC Serif | OUC Sans | TeX Gyre Termes | +| `年度考核登记表/` | OUC Serif | OUC Sans | TeX Gyre Termes | +| `劳务发放说明表/` | OUC Serif | OUC Sans | TeX Gyre Termes | +| `课程执行大纲/` | OUC Serif | OUC Sans | TeX Gyre Termes | +| `试卷/` | OUC Serif / OUC Kai | OUC Sans | TeX Gyre Termes | +| `幻灯片/` | HarmonyOS Sans SC | HarmonyOS Sans SC Bold | HarmonyOS Sans | +| `科技报告/` | OUC Serif | OUC Serif Bold / OUC Kai | HarmonyOS Sans | + +「改造前」用的是:SimSun / SimHei / KaiTi / FangSong / Times New Roman(前五个模板), +鸿蒙 + 方正书宋/小标宋/楷体/仿宋/中等线(科技报告)。 + +--- + +## 七、如何重新生成子集 + +如果需要把 GB2312 之外的字加进来,或上游字体发了新版: + +```bash +# 依赖:pip install fonttools +python -c "import fontTools; print(fontTools.version)" + +# 1) 裁剪(name_IDs 必须给 '*',否则会丢掉 OFL 声明的 13/14 号记录) +python - <<'PY' +from fontTools import subset +opts = subset.Options() +opts.name_IDs = ['*'] # 关键:默认只取 0..6,会丢授权声明 +opts.name_languages = ['*'] +opts.notdef_outline = True +opts.recalc_bounds = True +opts.layout_features = ['*'] +font = subset.load_font('上游字体.otf', opts) +subsetter = subset.Subsetter(options=opts) +subsetter.populate(text=open('keep_gb2312.txt', encoding='utf-8').read()) +subsetter.subset(font) +subset.save_font(font, '裁剪后.otf', opts) +PY + +# 2) 改 CFF 层名字(只改 name 表不够!PDF 内嵌名取的是 CFF 层) +python - <<'PY' +from fontTools.ttLib import TTFont +f = TTFont('裁剪后.otf') +cff = f['CFF '].cff +cff.fontNames[0] = 'OUCSerif-Regular' +td = cff.topDictIndex[0] +td.FamilyName = 'OUC Serif' +td.FullName = 'OUC Serif Regular' +# name 表同步改,并补 13/14 号授权记录与免责声明 +f.save('OUCSerif-Regular.otf') +PY +``` + +改完务必验证 PDF 里内嵌的确实是新名字: + +```python +import pymupdf +d = pymupdf.open('输出.pdf') +print({f[3] for p in d for f in p.get_fonts()}) +# 期望看到 OUCSerif-Regular / OUCSans-Regular,而不是 SourceHanSerifSC +``` + +--- + +## 八、字体清单速查 + +| 文件 | 内部族名 | 字符数 | 大小 | +|---|---|---|---| +| `ouc-serif/OUCSerif-Regular.otf` | OUC Serif | 7555 | 4.6 MB | +| `ouc-serif/OUCSerif-Bold.otf` | OUC Serif | 7555 | 4.8 MB | +| `ouc-sans/OUCSans-Regular.otf` | OUC Sans | 7555 | 3.4 MB | +| `ouc-sans/OUCSans-Bold.otf` | OUC Sans | 7555 | 3.4 MB | +| `ouc-kai/OUCKai-Regular.ttf` | OUC Kai | 7557 | 3.4 MB | +| `ouc-kai/OUCKai-Bold.ttf` | OUC Kai | 7557 | 3.4 MB | +| `zhuque-fangsong/ZhuqueFangsong-Regular.ttf` | Zhuque Fangsong | 12882 | 8.4 MB | +| `tex-gyre-termes/texgyretermes-regular.otf` | TeX Gyre Termes | 1053 | 141 KB | +| `tex-gyre-termes/texgyretermes-bold.otf` | TeX Gyre Termes | 1053 | 139 KB | +| `tex-gyre-termes/texgyretermes-italic.otf` | TeX Gyre Termes | 1053 | 141 KB | +| `tex-gyre-termes/texgyretermes-bolditalic.otf` | TeX Gyre Termes | 1053 | 144 KB | +| `harmonyos-sans/HarmonyOS_Sans_Regular.ttf` | HarmonyOS Sans | 874 | 147 KB | +| `harmonyos-sans/HarmonyOS_Sans_Bold.ttf` | HarmonyOS Sans | 874 | 146 KB | +| `harmonyos-sans/HarmonyOS_Sans_Regular_Italic.ttf` | HarmonyOS Sans | 807 | 141 KB | +| `harmonyos-sans/HarmonyOS_Sans_Bold_Italic.ttf` | HarmonyOS Sans | 807 | 141 KB | +| `harmonyos-sans/HarmonyOS_Sans_SC_Regular.ttf` | HarmonyOS Sans SC | 29063 | 8.3 MB | +| `harmonyos-sans/HarmonyOS_Sans_SC_Bold.ttf` | HarmonyOS Sans SC | 29063 | 8.2 MB | \ No newline at end of file diff --git a/幻灯片/fonts/HarmonyOS_Sans_Bold.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_Bold.ttf similarity index 100% rename from 幻灯片/fonts/HarmonyOS_Sans_Bold.ttf rename to fonts/harmonyos-sans/HarmonyOS_Sans_Bold.ttf diff --git a/幻灯片/fonts/HarmonyOS_Sans_Bold_Italic.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_Bold_Italic.ttf similarity index 100% rename from 幻灯片/fonts/HarmonyOS_Sans_Bold_Italic.ttf rename to fonts/harmonyos-sans/HarmonyOS_Sans_Bold_Italic.ttf diff --git a/幻灯片/fonts/HarmonyOS_Sans_Regular.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_Regular.ttf similarity index 100% rename from 幻灯片/fonts/HarmonyOS_Sans_Regular.ttf rename to fonts/harmonyos-sans/HarmonyOS_Sans_Regular.ttf diff --git a/幻灯片/fonts/HarmonyOS_Sans_Regular_Italic.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_Regular_Italic.ttf similarity index 100% rename from 幻灯片/fonts/HarmonyOS_Sans_Regular_Italic.ttf rename to fonts/harmonyos-sans/HarmonyOS_Sans_Regular_Italic.ttf diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Bold.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_SC_Bold.ttf similarity index 100% rename from 幻灯片/fonts/HarmonyOS_Sans_SC_Bold.ttf rename to fonts/harmonyos-sans/HarmonyOS_Sans_SC_Bold.ttf diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Regular.ttf b/fonts/harmonyos-sans/HarmonyOS_Sans_SC_Regular.ttf similarity index 100% rename from 幻灯片/fonts/HarmonyOS_Sans_SC_Regular.ttf rename to fonts/harmonyos-sans/HarmonyOS_Sans_SC_Regular.ttf diff --git a/fonts/ouc-kai/OUCKai-Bold.ttf b/fonts/ouc-kai/OUCKai-Bold.ttf new file mode 100644 index 0000000..7143f93 Binary files /dev/null and b/fonts/ouc-kai/OUCKai-Bold.ttf differ diff --git a/fonts/ouc-kai/OUCKai-Regular.ttf b/fonts/ouc-kai/OUCKai-Regular.ttf new file mode 100644 index 0000000..21aa785 Binary files /dev/null and b/fonts/ouc-kai/OUCKai-Regular.ttf differ diff --git a/fonts/ouc-sans/OUCSans-Bold.otf b/fonts/ouc-sans/OUCSans-Bold.otf new file mode 100644 index 0000000..e05185c Binary files /dev/null and b/fonts/ouc-sans/OUCSans-Bold.otf differ diff --git a/fonts/ouc-sans/OUCSans-Regular.otf b/fonts/ouc-sans/OUCSans-Regular.otf new file mode 100644 index 0000000..fe96c8f Binary files /dev/null and b/fonts/ouc-sans/OUCSans-Regular.otf differ diff --git a/fonts/ouc-serif/OUCSerif-Bold.otf b/fonts/ouc-serif/OUCSerif-Bold.otf new file mode 100644 index 0000000..279bd2c Binary files /dev/null and b/fonts/ouc-serif/OUCSerif-Bold.otf differ diff --git a/fonts/ouc-serif/OUCSerif-Regular.otf b/fonts/ouc-serif/OUCSerif-Regular.otf new file mode 100644 index 0000000..5d85f8a Binary files /dev/null and b/fonts/ouc-serif/OUCSerif-Regular.otf differ diff --git a/fonts/tex-gyre-termes/texgyretermes-bold.otf b/fonts/tex-gyre-termes/texgyretermes-bold.otf new file mode 100644 index 0000000..c181d55 Binary files /dev/null and b/fonts/tex-gyre-termes/texgyretermes-bold.otf differ diff --git a/fonts/tex-gyre-termes/texgyretermes-bolditalic.otf b/fonts/tex-gyre-termes/texgyretermes-bolditalic.otf new file mode 100644 index 0000000..028b170 Binary files /dev/null and b/fonts/tex-gyre-termes/texgyretermes-bolditalic.otf differ diff --git a/fonts/tex-gyre-termes/texgyretermes-italic.otf b/fonts/tex-gyre-termes/texgyretermes-italic.otf new file mode 100644 index 0000000..935f9db Binary files /dev/null and b/fonts/tex-gyre-termes/texgyretermes-italic.otf differ diff --git a/fonts/tex-gyre-termes/texgyretermes-regular.otf b/fonts/tex-gyre-termes/texgyretermes-regular.otf new file mode 100644 index 0000000..20f26fb Binary files /dev/null and b/fonts/tex-gyre-termes/texgyretermes-regular.otf differ diff --git a/科技报告/font/fangzhengshusong_GBK.TTF b/fonts/zhuque-fangsong/ZhuqueFangsong-Regular.ttf similarity index 53% rename from 科技报告/font/fangzhengshusong_GBK.TTF rename to fonts/zhuque-fangsong/ZhuqueFangsong-Regular.ttf index 5812315..cf36fd1 100644 Binary files a/科技报告/font/fangzhengshusong_GBK.TTF and b/fonts/zhuque-fangsong/ZhuqueFangsong-Regular.ttf differ diff --git a/劳务发放说明表/README.md b/劳务发放说明表/README.md index 8b84789..038a1b3 100644 --- a/劳务发放说明表/README.md +++ b/劳务发放说明表/README.md @@ -149,7 +149,7 @@ tabularray 给每个单元格垫了 strut,`[t]` 生成的盒子顶部与 strut | :-- | :-- | :-- | :-- | | 表宽 | 150.319 mm | 150.137 mm | 差 0.18 mm。tabularray 计宽按 n−1 根竖线、画宽按 n 根,系统性差 0.5 pt,为消除 Overfull 微调了列宽 | | 行高 | 11.01 / 5.50 / 49.53 / 22.01 / 11.01 mm | 每行 +0.15 mm | 同上,竖线计入行高 | -| 字体 | 宋体 | SimSun | 同一字体。缺字体时用 `fc-list` 找替代 | +| 字体 | 宋体 | OUC Serif(思源宋体子集) | 原用系统 SimSun。现改为仓库公共字体包 `../fonts/`,换机器/换系统都能编,且允许分发 | | 标题 | 宋体 14 pt **加粗** | 同 | 字号与正文相同,只靠加粗区分 | ## 校验方法 diff --git a/劳务发放说明表/ouclw.sty b/劳务发放说明表/ouclw.sty index 410bde0..0628ff3 100644 --- a/劳务发放说明表/ouclw.sty +++ b/劳务发放说明表/ouclw.sty @@ -84,12 +84,12 @@ % \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread % 归 1。这一步不能省,也必须在 \AtBeginDocument 之后再设一次 % (ctex 在 begin document 时会重设)。 +% +% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的 +% SimSun / SimHei / FangSong + AutoFakeBold,换台机器(尤其 Linux/macOS) +% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。 %====================================================================== -\setmainfont{Times New Roman} -\setCJKmainfont{SimSun}[AutoFakeBold=2.5] -\newCJKfontfamily\songti{SimSun}[AutoFakeBold=2.5] -\newCJKfontfamily\heiti{SimHei} -\newCJKfontfamily\fangsong{FangSong}[AutoFakeBold=2.5] +\input{../fonts.tex} \newcommand{\lwbodyfont}{% \linespread{1}\relax diff --git a/劳务发放说明表/劳务发放说明表.pdf b/劳务发放说明表/劳务发放说明表.pdf index 28a4df4..20c4a45 100644 Binary files a/劳务发放说明表/劳务发放说明表.pdf and b/劳务发放说明表/劳务发放说明表.pdf differ diff --git a/年度考核登记表/README.md b/年度考核登记表/README.md index 493044b..745d0e6 100644 --- a/年度考核登记表/README.md +++ b/年度考核登记表/README.md @@ -18,9 +18,12 @@ xelatex 年度考核登记表.tex xelatex 年度考核登记表.tex # 跑两遍,第二遍取到正确页码 ``` -需要 **XeLaTeX**(用 fontspec + xeCJK 调系统字体),并安装: +需要 **XeLaTeX**(用 fontspec + xeCJK),并安装: `ctex`、`geometry`、`fontspec`、`xeCJK`、`tabularray`。 +字体不需要安装 —— 全部来自仓库公共字体包 `../fonts/`(由 `../fonts.tex` 加载), +详见 [`../fonts/README.md`](../fonts/README.md)。**不再依赖系统里的宋体/黑体/仿宋**。 + 实测环境:TeX Live 2022 + `tabularray 2022A`。用 LuaLaTeX 理论上也行,但未验证。 产出 2 页、A4、正反面打印正好。 @@ -43,9 +46,14 @@ xelatex 年度考核登记表.tex # 跑两遍,第二遍取到正确页码 \newcommand{\khpost}{{\fangsong ×××}} % 所聘岗位 ``` -> **`{\fangsong ...}` 不能去掉。** 占位符 `×` 是 U+00D7,fontspec 会把它当 -> ASCII 交给 Times New Roman,而那儿的 `×` 是 **1em 宽的数学乘号** -> (14pt 下一个占 14pt),几个就能撑破整列。包上 `\fangsong` 才会按全角汉字宽度排。 +> **`{\fangsong ...}` 不能去掉。** 占位符 `×` 是 U+00D7,xeCJK 默认按 Unicode +> 区段把它判成**西文**,交给 fontspec 的西文字体(Termes/Times),而那儿的 +> `×` 宽度与汉字不一致,几个就能撑破整列。 +> +> **更好的做法**:`../fonts.tex` 里已经全局加了 +> `\xeCJKDeclareCharClass{CJK}{"00D7}`,把 `×` 归入 CJK 字符类 —— +> 于是它自动按汉字全角宽度排,**不必再包 `\fangsong` 也不会撑破**。 +> 这是本次字体改造顺带修掉的老 bug(原注释的修法从未真正生效过)。 ### 年度总结 @@ -122,7 +130,7 @@ Word 是靠 `tblPr/jc=center` 把这张表“压”进页边距里的。 | 「师德考核结果」首列 | `师师德考核结果` | `师德考核结果` | docx 原文首字重复(WPS 竖排遗留),已按正常写法更正 | | 「单位年度考核建议档次」首列 | `单单位年度考核建议档次` | `单位年度考核建议档次` | 同上 | | 单元格内边距 | 左右各 108 twips(1.905 mm) | 0 | c10 只有 1.41 mm,比两倍内边距还窄,统一内边距会算出负宽。代价是文字可贴竖线,但全部单元格本就水平居中,观感一致 | -| 未勾选框 | Wingdings `¨`(char 0x00A8) | U+25A1 `□` | Wingdings 在 Linux/macOS 上不可靠。仿宋、黑体都有 `□`,**宋体没有** —— 改正文为宋体时需另指方框字体 | +| 未勾选框 | Wingdings `¨`(char 0x00A8) | U+25A1 `□` | Wingdings 在 Linux/macOS 上不可靠。仓库里的仿宋、黑体、宋体都含 `□`;且 `../fonts.tex` 已把 U+25A1 归入 CJK 类,不会再落到不含该字的西文字体上 | | 电子签名图片 | 内嵌两张手写签名 JPEG | 无 | 模板不含真人信息 | ## 校验方法(想改版式时照这个验) diff --git a/年度考核登记表/ouckhtb.sty b/年度考核登记表/ouckhtb.sty index 2b535b7..d8e642c 100644 --- a/年度考核登记表/ouckhtb.sty +++ b/年度考核登记表/ouckhtb.sty @@ -61,12 +61,12 @@ % “2025 年度”一行 仿宋 16pt (w:sz=32) % R1C6 的括注 仿宋 12pt (w:sz=24),只有“研究所、实验室、科室” % 页脚页码 9pt (footer 样式 w:sz=18) +% +% 字体全部来自仓库公共字体包 ../fonts.tex。旧版这里写的是系统字体的 +% FangSong / SimHei / SimSun + AutoFakeBold,换台机器(尤其 Linux/macOS) +% 就编不出来。现已换成随仓库分发的开源字体,粗体用字体自带真粗体。 %====================================================================== -\setmainfont{Times New Roman} -\setCJKmainfont{FangSong}[AutoFakeBold=2.5] -\newCJKfontfamily\fangsong{FangSong}[AutoFakeBold=2.5] -\newCJKfontfamily\heiti{SimHei} -\newCJKfontfamily\songti{SimSun} +\input{../fonts.tex} % 正文字号;行距 15.6pt 对应 docx docGrid/linePitch=312 twips \newcommand{\khtbbodyfont}{\fontsize{14}{15.6}\selectfont} diff --git a/年度考核登记表/年度考核登记表.pdf b/年度考核登记表/年度考核登记表.pdf index 038d0b9..c559abf 100644 Binary files a/年度考核登记表/年度考核登记表.pdf and b/年度考核登记表/年度考核登记表.pdf differ diff --git a/幻灯片/README.md b/幻灯片/README.md index 44d69da..33636dc 100644 --- a/幻灯片/README.md +++ b/幻灯片/README.md @@ -16,7 +16,7 @@ 1. slides.tex:主文件,编写的演示文稿内容主要存放在该文件当中。 2. oucslide.sty:模板的样式文件。 -3. fonts:字体文件夹,所有编译需要用到的字体。默认字体使用的是华为鸿蒙字体。 +3. (字体不在本目录) 全部字体已统一到仓库根 `../fonts/`,由 `../fonts.tex` 统一加载。默认字体仍是华为鸿蒙字体。 4. theme:主题文件夹。 1. beamercolorthemeOUCSlide.sty:颜色定义文件。 2. beamerfontthemeOUCSlide.sty:字体定义文件。 @@ -33,7 +33,7 @@ git clone https://code.yangyq.net/laoyang/ouc_latex_template.git cd ouc_latex_template/幻灯片 ``` - 子目录内自包含(`theme/`、`fonts/`、`logos/`、`figs/` 都在本目录),不需要额外的宏包搜索路径。 + 子目录内自包含(`theme/`、`logos/`、`figs/` 都在本目录),只有字体是共享的上层目录 `../fonts/`,不需要额外的宏包搜索路径。 2. 安装Tex编译器,推荐使用TexLive,安装成功后,可以使用自带的TeXworks打开目录下的tex文件进行编译。 3. 可以安装其他的IDE工具进行Tex文件的编写和修改,推荐使用Visual Studio Code。 4. 编译时,请选择XeLaTex,有时候,可能需要连续编译两次,以得到正确的页码和图表编号。 @@ -199,7 +199,9 @@ Tex文件的开头,是基本信息部分,可以根据需要添加`\title`{ ## 字体 模板使用的默认字体是华为鸿蒙字体 (HarmonyOS Sans)。该字体可以免费商用。 -如果对字体不满意,可下载其他字体,放入fonts文件夹,并在`beamerfontthemeOUCSlide.sty`文件中修改。 +如果对字体不满意,可把字体放进仓库根的 `fonts/` 目录,并在 `theme/beamerfontthemeOUCSlide.sty` 中修改。**注意**:`Path=` 是相对编译时工作目录(= `幻灯片/`)的,所以写 `../fonts/xxx/`,不是 `fonts/`。 + +只保留实际用到的 6 个鸿蒙文件(Regular/Bold 及其 Italic,加 SC Regular/Bold)——原先 `幻灯片/fonts/` 里的 Black / Light / Medium / Thin 等 12 个字重全库无人引用,已随目录一并删除,省下 49 MB。 推荐的字体包括:思源黑体、阿里普惠字体、OPPO字体、小米字体。这些字体基本上都可以免费商用,并且效果都很不错。关于他们是否能够继续免费商用的政策,请查阅其官方网站以得到最准确的信息。 diff --git a/幻灯片/fonts/HarmonyOS_Sans_Black.ttf b/幻灯片/fonts/HarmonyOS_Sans_Black.ttf deleted file mode 100644 index 855943b..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_Black.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_Black_Italic.ttf b/幻灯片/fonts/HarmonyOS_Sans_Black_Italic.ttf deleted file mode 100644 index 2bf4653..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_Black_Italic.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_Light.ttf b/幻灯片/fonts/HarmonyOS_Sans_Light.ttf deleted file mode 100644 index 9b67785..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_Light.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_Light_Italic.ttf b/幻灯片/fonts/HarmonyOS_Sans_Light_Italic.ttf deleted file mode 100644 index 0fe624a..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_Light_Italic.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_Medium.ttf b/幻灯片/fonts/HarmonyOS_Sans_Medium.ttf deleted file mode 100644 index 9bcfaa1..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_Medium.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_Medium_Italic.ttf b/幻灯片/fonts/HarmonyOS_Sans_Medium_Italic.ttf deleted file mode 100644 index 6a8e1e7..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_Medium_Italic.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Black.ttf b/幻灯片/fonts/HarmonyOS_Sans_SC_Black.ttf deleted file mode 100644 index 824b3d4..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_SC_Black.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Light.ttf b/幻灯片/fonts/HarmonyOS_Sans_SC_Light.ttf deleted file mode 100644 index 8cfbc9d..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_SC_Light.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Medium.ttf b/幻灯片/fonts/HarmonyOS_Sans_SC_Medium.ttf deleted file mode 100644 index 350f6a0..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_SC_Medium.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_SC_Thin.ttf b/幻灯片/fonts/HarmonyOS_Sans_SC_Thin.ttf deleted file mode 100644 index 6a58b15..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_SC_Thin.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_Thin.ttf b/幻灯片/fonts/HarmonyOS_Sans_Thin.ttf deleted file mode 100644 index 9b95ebd..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_Thin.ttf and /dev/null differ diff --git a/幻灯片/fonts/HarmonyOS_Sans_Thin_Italic.ttf b/幻灯片/fonts/HarmonyOS_Sans_Thin_Italic.ttf deleted file mode 100644 index a5c4e3e..0000000 Binary files a/幻灯片/fonts/HarmonyOS_Sans_Thin_Italic.ttf and /dev/null differ diff --git a/幻灯片/slides.pdf b/幻灯片/slides.pdf index 1fdfe65..606699e 100644 Binary files a/幻灯片/slides.pdf and b/幻灯片/slides.pdf differ diff --git a/幻灯片/theme/beamerfontthemeOUCSlide.sty b/幻灯片/theme/beamerfontthemeOUCSlide.sty index c5e4214..f55c0de 100644 --- a/幻灯片/theme/beamerfontthemeOUCSlide.sty +++ b/幻灯片/theme/beamerfontthemeOUCSlide.sty @@ -10,39 +10,57 @@ %字体 -%设置英文字体 鸿蒙字体 -\setmainfont[ - Path=fonts/, - BoldFont=HarmonyOS_Sans_Bold.ttf, - ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf, - BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf, -]{HarmonyOS_Sans_Regular.ttf} -\setsansfont[ - Path=fonts/, - BoldFont=HarmonyOS_Sans_Bold.ttf, - ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf, - BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf, -]{HarmonyOS_Sans_Regular.ttf} -\setmonofont[ - Path=fonts/ -]{HarmonyOS_Sans_Regular.ttf} +%====================================================================== +% 字体全部取自仓库公共字体包 ../../fonts.tex(文件在 ../../fonts/ 下)。 +% +% 旧版这里是 Path=fonts/ 直接读本目录下的 幻灯片/fonts/ —— 那 18 个 +% 鸿蒙字体文件共 49MB,与其它模板重复,且一旦别处升级就会版本不一致。 +% 现在统一到仓库根的 fonts/,全库只有一份。 +% +% ⚠️ 路径用 ../fonts/ 而不是 ../../fonts/: +% 本文件虽然在 幻灯片/theme/ 下,但被 \usetheme 载入时, +% XeTeX 解析 Path= 的相对基准是**编译时的工作目录**(= 幻灯片/), +% 不是本文件所在目录。用 ../../ 会跑到仓库外面去找。 +% 同理 \input{../fonts.tex} 也是相对工作目录的。 +%====================================================================== +\input{../fonts.tex} + +% 幻灯片的主字体是鸿蒙:西文用 HarmonyOS Sans,中文用 HarmonyOS Sans SC。 +% 公共包已把它们登记为 \hmlatin(西文)与 \hm(CJK),这里把三个 +% fontspec 的"默认族"都指过去 —— beamer 的 \sffamily / \ttfamily +% 都要落到鸿蒙上,否则正文会出现一半鸿蒙、一半 Termes 的混排。 +\setmainfont{HarmonyOS_Sans_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_Bold.ttf, + ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf, + BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf, +] +\setsansfont{HarmonyOS_Sans_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_Bold.ttf, + ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf, + BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf, +] +\setmonofont{HarmonyOS_Sans_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, +] %设置中文字体 鸿蒙字体 -\setCJKmainfont[ - Path=fonts/, - BoldFont=HarmonyOS_Sans_SC_Bold.ttf, - ItalicFont=HarmonyOS_Sans_SC_Regular.ttf, - BoldItalicFont=HarmonyOS_Sans_SC_Bold.ttf -]{HarmonyOS_Sans_SC_Regular.ttf} -\setCJKsansfont[ - Path=fonts/, - BoldFont=HarmonyOS_Sans_SC_Bold.ttf, - ItalicFont=HarmonyOS_Sans_SC_Regular.ttf, - BoldItalicFont=HarmonyOS_Sans_SC_Bold.ttf -]{HarmonyOS_Sans_SC_Regular.ttf} -\setCJKmonofont[ - Path=fonts/ -]{HarmonyOS_Sans_SC_Regular.ttf} +\setCJKmainfont{HarmonyOS_Sans_SC_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_SC_Bold.ttf, + ItalicFont = HarmonyOS_Sans_SC_Regular.ttf, + BoldItalicFont = HarmonyOS_Sans_SC_Bold.ttf, +] +\setCJKsansfont{HarmonyOS_Sans_SC_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_SC_Bold.ttf, + ItalicFont = HarmonyOS_Sans_SC_Regular.ttf, + BoldItalicFont = HarmonyOS_Sans_SC_Bold.ttf, +] +\setCJKmonofont{HarmonyOS_Sans_SC_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, +] %以下为原模板代码,未做改动 diff --git a/科技报告/README.md b/科技报告/README.md index ed23576..261d0d8 100644 --- a/科技报告/README.md +++ b/科技报告/README.md @@ -6,7 +6,7 @@ ## 特性 -- **中英文字体一体化**:英文默认使用鸿蒙字体(HarmonyOS Sans),中文使用方正书宋 / 小标宋 / 楷体 / 仿宋 / 中等线,字体文件随模板附于 `font/` 目录,编译时自动调用,**无须安装任何字体**; +- **中英文字体一体化**:英文默认使用鸿蒙字体(HarmonyOS Sans),中文使用仓库公共字体包(宋体 / 宋体粗 / 楷体 / 仿宋 / 黑体),字体文件在仓库根 `../fonts/` 目录,编译时自动调用,**无须安装任何字体**; - **模块化文档类**:`report.cls` 按功能拆分为 `cls/` 下的多个模块(全局设定、字体、页面布局、标题、页眉页脚、信息框、代码块等),便于按需修改; - **三种信息框**:`titledbox`(带标题)、`notebox`(提示)、`importantbox`(重要),基于 tcolorbox 实现; - **代码排版**:基于 listings 预设了多种样式,支持行内命令 `shellbox` / `invertedshellbox` 展示 shell 命令及输出; @@ -35,7 +35,7 @@ xelatex report.tex ``` -5. 临时切换字体可使用命令:`\fzss`(方正书宋)、`\fzxbs`(方正小标宋)、`\fzkai`(方正楷体)、`\fzfs`(方正仿宋)、`\fzzdx`(方正中等线)、`\hm`(鸿蒙字体)。 +5. 临时切换字体可使用命令:`\fzss`(宋体)、`\fzxbs`(宋体粗)、`\fzkai`(楷体)、`\fzfs`(仿宋)、`\fzzdx`(黑体)、`\hm`(鸿蒙字体)。命令名沿用旧版(fz 取自原方正系列),实际用的是随仓库分发的开源字体,对应关系见 `cls/font.cls` 的注释。 ## 署名与联系方式(二次分发前请修改) @@ -72,7 +72,7 @@ ├── cls/ # 功能模块:全局设定、字体、页面、标题、信息框、代码块等 ├── input/ # 文档内容:封面、目录、摘要、信息与整体设置 ├── figs/ # 图片资源 -├── font/ # 鸿蒙及方正字体文件(自动加载) +├── (字体在仓库根 fonts/) # 不再自备字体,详见 ../fonts/README.md ├── fontawesome.pdf # fontawesome 图标使用手册 └── report.tex # 主文件(XeLaTeX 编译入口) ``` diff --git a/科技报告/cls/boxes.cls b/科技报告/cls/boxes.cls index 9dc73dd..15b09a5 100644 --- a/科技报告/cls/boxes.cls +++ b/科技报告/cls/boxes.cls @@ -86,9 +86,12 @@ \end{tcolorbox} } -%% 命令行(深底白字)——中性反白,不参与配色体系 -% 说明:反白块的用途是"终端里的黑底",语义上就该是黑的; -% 换成海大蓝会变成强调块,反而抢正文的注意力,所以保留黑。 +%% 命令行(深底白字)——海大蓝底 + 白字 +% 说明:这个框的用途是"一整条终端命令",需要与正文明确区分。 +% 用海大蓝实底 + 白字: +% · 白字压在 #004098 上对比度约 10:1,远高于 WCAG AA 要求的 4.5:1 +% · 与 notebox(5% 浅蓝底 + 蓝字)区分得开:一个是实底,一个是浅底 +% 底色不要改浅:一旦降到 oucblue!60 以下,白字对比度会掉到 4 以下,读起来吃力。 \newenvironment{invertedshellbox} {% \VerbatimEnvironment @@ -98,8 +101,8 @@ boxrule=.5pt, left=5pt, right=5pt, top=0pt, bottom=0pt, boxsep=5pt, - colframe=black!70!white, - colback=black!70!white, + colframe=oucblue, + colback=oucblue, coltext=white, title={}, fontupper=\linespread{1.2} diff --git a/科技报告/cls/font.cls b/科技报告/cls/font.cls index 44d311a..8bc1bd1 100644 --- a/科技报告/cls/font.cls +++ b/科技报告/cls/font.cls @@ -1,96 +1,136 @@ - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% fonts settings %% 字体设定 +%% +%% 【2026-11 改造记录:全部改为开源可商用字体】 +%% +%% 旧版本这里用的是 5 个**方正商业字体** + 鸿蒙,字体文件都放在 +%% 科技报告/font/ 下(共 92MB): +%% fangzhengshusong_GBK.TTF 方正书宋 SJK 正文 +%% fangzhengxiaobiaosong_GBK.TTF 方正小标宋 粗体/标题 +%% fangzhengkaiti_GBK.TTF 方正楷体 引文、页眉、题注 +%% fangzhengfangsong_GBK.TTF 方正仿宋 斜体位 +%% fangzhengzhongdengxian_GBK.TTF 方正中等线 等宽位 +%% +%% 问题:方正这 5 款都**不允许随仓库分发**(个人非商用免费,商用须授权), +%% 把它们打进公开模板库属于越界使用;而且 92MB 的字体让 clone 变得很重。 +%% +%% 现在全部映射到仓库公共字体包 ../fonts.tex(文件在 ../fonts/ 下): +%% 方正书宋 → OUC Serif(思源宋体 SC 子集,OFL 1.1) +%% 方正小标宋 → OUC Serif Bold(真粗体,思源宋体自带) +%% 方正楷体 → OUC Kai(霞鹜文楷子集,OFL 1.1) +%% 方正仿宋 → Zhuque Fangsong(朱雀仿宋,OFL 1.1) +%% 方正中等线 → OUC Sans(思源黑体 SC 子集,OFL 1.1) +%% 鸿蒙 → 保留 HarmonyOS Sans(华为官方允许免费商用) +%% +%% 上层的 \fzss / \fzxbs / \fzkai / \fzfs / \fzzdx / \hm 六个命令名 +%% **保持不变**,所以 boxes.cls / code.cls / headandfoot.cls / cover.tex +%% 里的调用一行都不用改。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% \usepackage{ebgaramond} - %% 开明式:句末点号用占一个汉字宽度,标号和句内点号占半个汉字宽度 %\punctstyle{kaiming} -%\setmainfont{Minion Pro} -% \setmainfont{Myriad Pro} -% \setsansfont{Myriad Pro} -% \setmonofont{Courier Std} +%====================================================================== +% 一、先载入仓库公共字体包 +% 它负责:fontspec/xeCJK 的加载、\songti/\heiti/\kaiti/\fangsong/\tnr +% /\tnrb/\hm 的登记、以及 ×/□ 这类字符的 CJK 归类。 +% 本文件只在其基础上覆盖"默认族",并补 5 个方正语义别名。 +%====================================================================== +\input{../fonts.tex} -%设置英文字体 鸿蒙字体 -% \setmainfont[ -% Path=font/, -% BoldFont=Arvo-Bold.ttf, -% ItalicFont=Arvo-Italic.ttf, -% BoldItalicFont=Arvo-BoldItalic.ttf, -% ]{Arvo-Regular.ttf} -\setmainfont[ - Path=font/, - BoldFont=HarmonyOS_Sans_Bold.ttf, - ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf, - BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf, -]{HarmonyOS_Sans_Regular.ttf} -\setsansfont[ - Path=font/, - BoldFont=HarmonyOS_Sans_Bold.ttf, - ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf, - BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf, -]{HarmonyOS_Sans_Regular.ttf} -\setmonofont[ - Path=font/ -]{HarmonyOS_Sans_Regular.ttf} +%====================================================================== +% 二、默认字体族 +% +% 西文:鸿蒙 HarmonyOS Sans(与原模板一致,观感不变) +% 中文:OUC Serif 书宋(对应原方正书宋),粗体用 OUC Serif Bold +% (对应原方正小标宋 —— 小标宋本身就是宋体的标题变体) +% +% ⚠️ Path= 是相对**编译时工作目录**(= 科技报告/)的,不是相对 cls/。 +% 故写作 ../fonts/...,不要写 ../../。 +%====================================================================== +\setmainfont{HarmonyOS_Sans_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_Bold.ttf, + ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf, + BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf, +] +\setsansfont{HarmonyOS_Sans_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_Bold.ttf, + ItalicFont = HarmonyOS_Sans_Regular_Italic.ttf, + BoldItalicFont = HarmonyOS_Sans_Bold_Italic.ttf, +] +\setmonofont{HarmonyOS_Sans_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, +] -\setCJKmainfont[ - Path=font/, - BoldFont=fangzhengxiaobiaosong_GBK.TTF, - ItalicFont=fangzhengkaiti_GBK.TTF, - BoldItalicFont=fangzhengfangsong_GBK.TTF, - ]{fangzhengshusong_GBK.TTF} -\setCJKsansfont[ - Path=font/, - BoldFont=HarmonyOS_Sans_SC_Bold.ttf, - ItalicFont=HarmonyOS_Sans_SC_Light.ttf, - BoldItalicFont=HarmonyOS_Sans_SC_Black.ttf, -]{HarmonyOS_Sans_SC_Regular.ttf} -\setCJKmonofont[ - Path=font/ -]{fangzhengzhongdengxian_GBK.TTF} +% \hm 已在 fonts.tex 里登记(CJK 族名 OUCHM),这里不重复定义。 +% 只把 CJK 的 sans / mono 两族指到鸿蒙上,与旧版行为一致。 +\setCJKsansfont{HarmonyOS_Sans_SC_Regular.ttf}[ + Path = ../fonts/harmonyos-sans/, + BoldFont = HarmonyOS_Sans_SC_Bold.ttf, +] +\setCJKmonofont{OUCSans}[ + Extension = .otf, + Path = ../fonts/ouc-sans/, + UprightFont = *-Regular, + BoldFont = *-Bold, +] \XeTeXlinebreaklocale "zh" \XeTeXlinebreakskip = 0pt plus 1pt -%方正书宋 +%====================================================================== +% 三、5 个方正语义别名 +% +% 用 \setCJKfamilyfont + \def 而非 \newCJKfontfamily,理由见 fonts.tex: +% 后者是 LaTeX3 的 \NewDocumentCommand,命令已存在时会报错中断。 +% 命令名照旧,调用点零改动。 +%====================================================================== + +% 书宋(原方正书宋)—— 正文 \setCJKfamilyfont{fzss}[ - Path=font/ -]{fangzhengshusong_GBK.TTF} + Extension = .otf, + Path = ../fonts/ouc-serif/, + UprightFont = *-Regular, + BoldFont = *-Bold, +]{OUCSerif} \newcommand{\fzss}{\CJKfamily{fzss}} -%方正小标宋 +% 小标宋(原方正小标宋)—— 标题/强调,用宋体真粗体 \setCJKfamilyfont{fzxbs}[ - Path=font/ -]{fangzhengxiaobiaosong_GBK.TTF} + Extension = .otf, + Path = ../fonts/ouc-serif/, + UprightFont = *-Bold, + BoldFont = *-Bold, +]{OUCSerif} \newcommand{\fzxbs}{\CJKfamily{fzxbs}} -%方正楷体 +% 楷体(原方正楷体)—— 引文、页眉、题注 \setCJKfamilyfont{fzkai}[ - Path=font/ -]{fangzhengkaiti_GBK.TTF} + Extension = .ttf, + Path = ../fonts/ouc-kai/, + UprightFont = *-Regular, + BoldFont = *-Bold, +]{OUCKai} \newcommand{\fzkai}{\CJKfamily{fzkai}} -%方正仿宋 +% 仿宋(原方正仿宋)—— 斜体位 +% ⚠️ 朱雀仿宋只有常规一档。旧版这里配的是"方正仿宋",也是常规字面, +% 所以观感一致;但若在 \fzfs 下用 \bfseries,不会真的变粗。 \setCJKfamilyfont{fzfs}[ - Path=font/ -]{fangzhengfangsong_GBK.TTF} + Extension = .ttf, + Path = ../fonts/zhuque-fangsong/, + UprightFont = *-Regular, +]{ZhuqueFangsong} \newcommand{\fzfs}{\CJKfamily{fzfs}} -%方正中等线 +% 中等线(原方正中等线)—— 等宽位,用思源黑体 \setCJKfamilyfont{fzzdx}[ - Path=font/ -]{fangzhengzhongdengxian_GBK.TTF} -\newcommand{\fzzdx}{\CJKfamily{fzzdx}} - -%鸿蒙字体 -\setCJKfamilyfont{hm}[ - Path=font/, - BoldFont=HarmonyOS_Sans_SC_Bold.ttf, - ItalicFont=HarmonyOS_Sans_SC_Light.ttf, - BoldItalicFont=HarmonyOS_Sans_SC_Black.ttf, -]{HarmonyOS_Sans_SC_Regular.ttf} -\newcommand{\hm}{\CJKfamily{hm}} \ No newline at end of file + Extension = .otf, + Path = ../fonts/ouc-sans/, + UprightFont = *-Regular, + BoldFont = *-Bold, +]{OUCSans} +\newcommand{\fzzdx}{\CJKfamily{fzzdx}} \ No newline at end of file diff --git a/科技报告/font/HarmonyOS_Sans_Bold.ttf b/科技报告/font/HarmonyOS_Sans_Bold.ttf deleted file mode 100644 index 8ea60c1..0000000 Binary files a/科技报告/font/HarmonyOS_Sans_Bold.ttf and /dev/null differ diff --git a/科技报告/font/HarmonyOS_Sans_Bold_Italic.ttf b/科技报告/font/HarmonyOS_Sans_Bold_Italic.ttf deleted file mode 100644 index 8b4cc6f..0000000 Binary files a/科技报告/font/HarmonyOS_Sans_Bold_Italic.ttf and /dev/null differ diff --git a/科技报告/font/HarmonyOS_Sans_Regular.ttf b/科技报告/font/HarmonyOS_Sans_Regular.ttf deleted file mode 100644 index d7eccac..0000000 Binary files a/科技报告/font/HarmonyOS_Sans_Regular.ttf and /dev/null differ diff --git a/科技报告/font/HarmonyOS_Sans_Regular_Italic.ttf b/科技报告/font/HarmonyOS_Sans_Regular_Italic.ttf deleted file mode 100644 index fac9212..0000000 Binary files a/科技报告/font/HarmonyOS_Sans_Regular_Italic.ttf and /dev/null differ diff --git a/科技报告/font/HarmonyOS_Sans_SC_Black.ttf b/科技报告/font/HarmonyOS_Sans_SC_Black.ttf deleted file mode 100644 index 824b3d4..0000000 Binary files a/科技报告/font/HarmonyOS_Sans_SC_Black.ttf and /dev/null differ diff --git a/科技报告/font/HarmonyOS_Sans_SC_Bold.ttf b/科技报告/font/HarmonyOS_Sans_SC_Bold.ttf deleted file mode 100644 index 5c925d1..0000000 Binary files a/科技报告/font/HarmonyOS_Sans_SC_Bold.ttf and /dev/null differ diff --git a/科技报告/font/HarmonyOS_Sans_SC_Light.ttf b/科技报告/font/HarmonyOS_Sans_SC_Light.ttf deleted file mode 100644 index 8cfbc9d..0000000 Binary files a/科技报告/font/HarmonyOS_Sans_SC_Light.ttf and /dev/null differ diff --git a/科技报告/font/HarmonyOS_Sans_SC_Regular.ttf b/科技报告/font/HarmonyOS_Sans_SC_Regular.ttf deleted file mode 100644 index aff150a..0000000 Binary files a/科技报告/font/HarmonyOS_Sans_SC_Regular.ttf and /dev/null differ diff --git a/科技报告/font/fangzhengfangsong_GBK.TTF b/科技报告/font/fangzhengfangsong_GBK.TTF deleted file mode 100644 index 7fef4d6..0000000 Binary files a/科技报告/font/fangzhengfangsong_GBK.TTF and /dev/null differ diff --git a/科技报告/font/fangzhengkaiti_GBK.TTF b/科技报告/font/fangzhengkaiti_GBK.TTF deleted file mode 100644 index 29978fb..0000000 Binary files a/科技报告/font/fangzhengkaiti_GBK.TTF and /dev/null differ diff --git a/科技报告/font/fangzhengxiaobiaosong_GBK.TTF b/科技报告/font/fangzhengxiaobiaosong_GBK.TTF deleted file mode 100644 index 77af56a..0000000 Binary files a/科技报告/font/fangzhengxiaobiaosong_GBK.TTF and /dev/null differ diff --git a/科技报告/font/fangzhengzhongdengxian_GBK.TTF b/科技报告/font/fangzhengzhongdengxian_GBK.TTF deleted file mode 100644 index 69fbc7a..0000000 Binary files a/科技报告/font/fangzhengzhongdengxian_GBK.TTF and /dev/null differ diff --git a/科技报告/report.pdf b/科技报告/report.pdf index e5a6b0f..a7b505c 100644 Binary files a/科技报告/report.pdf and b/科技报告/report.pdf differ diff --git a/科技报告/report.tex b/科技报告/report.tex index d186371..32d94d0 100644 --- a/科技报告/report.tex +++ b/科技报告/report.tex @@ -43,7 +43,7 @@ \section{准备工作} 在正式开始使用模板之前,需要你安装LiveTex,并安装任何可用的编辑器。 -不需要再做其他配置,字体在font文件夹中,编译时会自动调用,无须额外安装。 +不需要再做其他配置。字体统一放在仓库根目录的 \texttt{fonts/} 文件夹中(全库共用同一套),编译时会自动调用,无须额外安装,也不依赖你电脑上装了什么字体。 \section{字体} @@ -51,15 +51,15 @@ 英文字体,默认使用的是鸿蒙字体(HarmonyOS Sans),现在你看到的应该就是这个字体的效果。这些设置,可以在cls中,字体设定里面进行修改。 -中文字体,使用的是鸿蒙字体、方正小标宋、方正楷体、方正仿宋、方正中等线等。 +中文字体,使用的是鸿蒙字体、思源宋体、霞鹜文楷、朱雀仿宋、思源黑体等。全部为开源可商用字体,不使用任何方正、微软雅黑等商业字体。 -中文的默认字体衬线字体是方正书宋,加粗字体是方正小标宋,就像这样:\textbf{这里是加粗字体}。斜体的字体是方正楷体,就像这样:\textit{这里是中文斜体}。斜体粗体的字体是方正仿宋,就像这样:\textbf{\textit{这里是粗体斜体}}。中文的无衬线字体sans font使用的是方正黑体,你应该可以在标题中看到它。中文等宽字体,使用的是方正中等线字体。 +中文的默认字体衬线字体是思源宋体,加粗字体是思源宋体的真粗体,就像这样:\textbf{这里是加粗字体}。斜体的字体是霞鹜文楷,就像这样:\textit{这里是中文斜体}。斜体粗体的字体是朱雀仿宋,就像这样:\textbf{\textit{这里是粗体斜体}}。中文的无衬线字体sans font使用的是鸿蒙字体,你应该可以在标题中看到它。中文等宽字体,使用的是思源黑体。 默认的无衬线字体是鸿蒙字体,你应该可以在各种标题中看到它的样子。 同样,上述的字体,在cls中,都可以进行设置。 -另外,可以使用额外的命令,来临时改变某一段文字的字体设置,这些命令包括:fzss(方正书宋)、 fzxbs(方正小标宋)、、fzkai(方正楷体)、fzfs(方正仿宋)、fzzdx(方正中等线)、hm(鸿蒙字体)。使用方法是使用斜线命令的方式,这样:{\fzss 方正书宋}、 {\fzxbs 方正小标宋}、{\fzkai 方正楷体}、{\fzfs 方正仿宋}、{\fzzdx 方正中等线}、{\hm 鸿蒙字体}。 +另外,可以使用额外的命令,来临时改变某一段文字的字体设置。这些命令沿用了旧版的名字(fz开头,取自原先的方正系列),但实际用的都是随仓库分发的开源字体:fzss(宋体)、fzxbs(宋体粗,标题用)、fzkai(楷体)、fzfs(仿宋)、fzzdx(黑体)、hm(鸿蒙字体)。使用方法是使用斜线命令的方式,这样:{\fzss 宋体}、 {\fzxbs 宋体粗}、{\fzkai 楷体}、{\fzfs 仿宋}、{\fzzdx 黑体}、{\hm 鸿蒙字体}。注意这里的楷体是霞鹜文楷、仿宋是朱雀仿宋、黑体是思源黑体,都是可免费商用的开源字体。 \section{标题} diff --git a/试卷/oucexam.sty b/试卷/oucexam.sty index 2892213..39c67e2 100644 --- a/试卷/oucexam.sty +++ b/试卷/oucexam.sty @@ -46,21 +46,35 @@ %====================================================================== % 2. 字体 -% SimSun 宋体(标题/大题用 AutoFakeBold 模拟原卷描边加粗) -% KaiTi 楷体(卷头) SimHei 黑体(装订栏“专业年级”) -% Times New Roman 西文数字 +% 全部取自仓库公共字体包 ../fonts.tex(字体文件在 ../fonts/ 下)。 +% 旧版这里是 SimSun / SimHei / KaiTi / Times New Roman 四个系统字体, +% 换台机器(尤其 Linux/macOS)就编不出来,且都不能随仓库分发。 +% +% 对应关系: +% 宋体正文 OUC Serif ← 思源宋体 SC 子集(真粗体,不再 AutoFakeBold) +% 黑体 OUC Sans ← 思源黑体 SC 子集 +% 楷体(卷头) OUC Kai ← 霞鹜文楷子集 +% 西文/数字 TeX Gyre Termes(Times 度量兼容,见下) +% +% ⚠️ 关于原卷的"宋体西文": +% 原卷正文 Mealy / RS / 2026 等实测每个 ASCII 字符步距恒为 5.28bp +% (= 0.500 em @10.5bp)且 font 名为 SimSun —— 即 Word 把西文设为 +% 宋体时给出的"半角等宽"字形。SimSun 是全 ASCII 0.500 em 等宽的。 +% +% 这里改用 Termes,理由: +% · Termes 的**数字**步距恰好也是 0.500 em,数字宽度零漂移; +% · 本卷所有数字本来就走 \TNR{} / \TNRB{}(已实测 PDF 里 SimSun +% 只承担空格与极少数裸字母),换字体的实际影响面只有那几处; +% · 若要强行复刻 0.500 em 等宽只能上 Inconsolata 这类代码字体, +% 放进试卷正文观感明显更差 —— 按需求"字体不合适再更换"的取舍, +% 宁可让裸西文用 Termes 的比例字形。 +% 实测结论见 README「字体」一节的 A/B 对比。 %====================================================================== -% 正文西文默认用 SimSun 的等宽西文字形(原卷正文 Mealy / 2026 / RS 等 -% 实测每个 ASCII 字符步距恒为 5.28bp 且 font 名为 SimSun,即为宋体西文)。 -% 需要真正 Times 的地方(化简题、页脚、卷头年份)显式 \tnr / \tnrb。 -\setmainfont{SimSun} -\setCJKmainfont{SimSun}[AutoFakeBold=2.86] -\newCJKfontfamily\songti{SimSun}[AutoFakeBold=2.86] -\newCJKfontfamily\heiti{SimHei} -\newCJKfontfamily\kaiti{KaiTi} -\newfontfamily\tnr{Times New Roman} -\newfontfamily\tnrb{Times New Roman Bold} -\newfontfamily\sunfont{SimSun} +\input{../fonts.tex} + +% 试卷正文的宋体西文占位:原模板用 \sunfont 指 SimSun,现统一指 Termes。 +% 保留命令名是为了不动 \qnum / \logicexpr / \sumsig 等所有调用点。 +\let\sunfont\tnr %---------------------------------------------------------------------- % ⚠️ xeCJK 陷阱:字体切换命令若紧邻 \par(或位于段落末尾), diff --git a/试卷/ouckey.sty b/试卷/ouckey.sty index 8d61c88..4e5ff06 100644 --- a/试卷/ouckey.sty +++ b/试卷/ouckey.sty @@ -59,18 +59,12 @@ \pagestyle{empty} %---------------------------------------------------------------------- -% 字体(与 oucexam.sty 保持一致) +% 字体(与 oucexam.sty 保持一致,全部取自公共字体包 ../fonts.tex) %---------------------------------------------------------------------- -\setmainfont{Times New Roman} -\setCJKmainfont{SimSun}[AutoFakeBold=2.86] -% ctexart 已定义 \songti / \heiti,重名会报 "Control sequence already defined" -% 只在未定义时才建(\provideCJKfontfamily 并不存在,必须自己判) -\ifdefined\songti\else\newCJKfontfamily\songti{SimSun}[AutoFakeBold=2.86]\fi -\ifdefined\heiti\else\newCJKfontfamily\heiti{SimHei}\fi -\newCJKfontfamily\kaiti{KaiTi} -\newfontfamily\tnr{Times New Roman} -\newfontfamily\tnrb{Times New Roman Bold} -\newfontfamily\sunfont{SimSun} +\input{../fonts.tex} + +% \sunfont 原指 SimSun,现统一指 Termes(见 oucexam.sty 的说明) +\let\sunfont\tnr % 局部字体切换必须显式收尾,否则 xeCJK 字体会"溢出"到后一段 \newcommand{\TNR}[1]{{\tnr #1\normalfont}} diff --git a/试卷/参考答案与评分标准示例.pdf b/试卷/参考答案与评分标准示例.pdf index 2a50721..cbb122d 100644 Binary files a/试卷/参考答案与评分标准示例.pdf and b/试卷/参考答案与评分标准示例.pdf differ diff --git a/试卷/试卷题型示例.pdf b/试卷/试卷题型示例.pdf index 8744923..ac3cbdc 100644 Binary files a/试卷/试卷题型示例.pdf and b/试卷/试卷题型示例.pdf differ diff --git a/试卷归档封面/README.md b/试卷归档封面/README.md new file mode 100644 index 0000000..88d2831 --- /dev/null +++ b/试卷归档封面/README.md @@ -0,0 +1,120 @@ +# 试卷归档封面 —— 信息科学与工程学部试卷归档封面(理论课) + +信息科学与工程学部**试卷归档封面**的 XeLaTeX 模板。原文件是学院/学部下发的 +`.doc` 表格,本目录把它做成可直接编译的 LaTeX 版。 + +> **改名说明**:原文件名为「附件1:信息科学与工程学院试卷封面(理论课)」, +> 内文标题写的是「信息科学与工程学院试卷」。按现行建制与文档实际用途, +> 已统一改为 **学部 + 归档封面**:目录名、文件名、内文标题三处同步。 + +> 与 [`试卷/`](../试卷/) 的区别:`试卷/` 是**试卷正文 + 参考答案**(学校专用 +> 195×270mm 试卷纸、装订栏、成绩表);本目录是**随卷归档的封面单页** +> (A4、11 行两列表单)。两者用途不同,不是同一份文件的两个版本。 + +## 文件 + +| 文件 | 说明 | +|---|---| +| `oucksfm.sty` | 版式包。A4、表宽 170mm、11 行固定行高,所有尺寸已注明换算过程 | +| `试卷归档封面.tex` | 填写入口,【第 1 节】改课程信息即可 | +| `试卷归档封面.pdf` | 成品样张 | + +## 编译 + +```bash +xelatex 试卷归档封面.tex +``` + +必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。 +本模板自包含,不依赖任何图片。 + +## 填表 + +只改 `试卷归档封面.tex` 的【第 1 节】: + +```latex +\newcommand{\sfmyear} {\ph{××××}年} % 学年 +\newcommand{\sfmterm} {\ph{×}季学期} % 学期 +\newcommand{\sfmcno} {080502101231} % 课程号(纯数字,14pt) +\newcommand{\sfmsno} {25252029} % 选课号(纯数字,14pt) +\newcommand{\sfmcourse}{\ph{××××}} % 考试课程名称 +\newcommand{\sfmtype} {\ph{×××}} % 课程类型 +\newcommand{\sfmmajor}{...} % 面向专业(多个用、隔开) +\newcommand{\sfmgrade}{\ph{××××}} % 面向年级 +\newcommand{\sfmcount}{\ph{××}} % 试卷份数 +\newcommand{\sfmteacher}{\ph{×××}} % 授课教师 +\newcommand{\sfmdate}{...} % 日期 +``` + +填真实内容后把 `\ph{...}` 整个换掉,不要留下 `×`。 + +## 版式参数 + +全部照原 `.doc` 实测值,未做主观调整: + +| 项目 | 值 | 来源 | +|---|---|---| +| 纸张 | A4 210×297mm | `pgSz` | +| 页边距 | 左右 20mm、上下 25.01mm | `pgMar` 56.7 / 70.9 pt | +| 表宽 | 170mm(= 版心宽) | `tblW` 100% | +| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位)| +| 单元格内边距 | 左右 1.4993mm、上下 0 | `tblCellMar` 85 twips | +| 列宽 | 51mm + 119mm(30% : 70%) | `col_widths_pct` | +| 标题 | 黑体 18pt 加粗居中 | `w:sz=36` + `w:b` | +| 左列标签 | 黑体 18pt | `w:sz=36` | +| 右列值 | 18pt(学年/学期)/16pt(多数)/14pt(课程号、选课号) | `w:sz=36/32/28` | +| 行高 | 11 行固定高,合计 185.95mm | 各行 `trHeight` + `hRule=exact` | + +实测校验(pymupdf 读 PDF): + +``` +表格 左=20.0mm 右=189.91mm 宽=169.9mm ← 应为 170mm ✓ +行高 15.19/15.18/15.54/14.66/14.75/15.18/33.02/15.19/18.80/15.19/15.19 mm +表格总高 187.89mm ← 含线宽与取整,与 185.95+线宽 吻合 +标题 宽 94.89mm,单行不折(版心 170mm,余量充足) +``` + +## 三个坑(改之前先看) + +### 1. `×` 占位符曾跑到 Times New Roman(已在公共字体包根治) + +xeCJK 按 Unicode 区段分类,`×`(U+00D7)落在 Latin-1,会被判成**西文**, +交给 fontspec 的西文字体(Termes / Times)。`\heiti` / `\fangsong` 只切 +CJK 字体族,**管不到它** —— 包一层是没用的。TNR 的 × 宽度与汉字不一致, +混排时基线也偏。 + +现在这行已上移到仓库公共字体包 [`../fonts.tex`](../fonts.tex),**全局生效**: + +```latex +\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号 +\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号 +\xeCJKDeclareCharClass{CJK}{"25A1} % □ 方框(勾选框) +``` + +本模板不再需要自己声明。 + +> ✅ [`年度考核登记表/`](../年度考核登记表/) 也有同样问题,**已随本次改造一并修好** +> (原先那条注释说能修,但实测 PDF 里 × 仍落在 TNR —— 因为注释在、声明也写了, +> 却没有真正作用到字符类)。现在已经实测确认:10 处 `×` 全部落在 OUC Sans 上。 + +### 2. 字体全部来自公共字体包 + +本模板原先用 SimHei / SimSun / FangSong + `AutoFakeBold` 描边,换台机器 +(尤其 Linux/macOS)就编不出来,而且这些字体都不允许随仓库分发。现改为 +`\input{../fonts.tex}`,字体文件在 `../fonts/` 下,来源与授权见 +[`../fonts/README.md`](../fonts/README.md)。 + +### 3. `\linespread` 会悄悄放大行高 + +ctex 默认 `\linespread` 约为 **1.3**,它会把 `\fontsize{18}{21.6}` 里的 +21.6 pt 行距放大到 **28 pt 以上**,逐行累积后整张表会顶出页面。 + +`oucksfm.sty` 的解法是在**每个** `\fontsize` 之后紧跟 `\linespread{1}\relax`, +并且在 `\AtBeginDocument` 之后再设一次(ctex 会在 `\begin{document}` 时 +把 `\linespread` 重新设回 1.3,只在导言区设是无效的): + +```latex +\AtBeginDocument{\linespread{1}\selectfont} +``` + +没有这一步,表高会比原卷高出一大截。 diff --git a/试卷归档封面/oucksfm.sty b/试卷归档封面/oucksfm.sty new file mode 100644 index 0000000..8d1f4aa --- /dev/null +++ b/试卷归档封面/oucksfm.sty @@ -0,0 +1,274 @@ +%====================================================================== +% oucksfm.sty — 信息科学与工程学部 试卷归档封面(理论课)版式包 +% +% 依据:附件1:信息科学与工程学院试卷封面(理论课).doc +% (SynologyDrive/授课/数字逻辑/2025/归档/) +% 原名与内文标题写的是「学院」,按现行建制改为「学部」, +% 模板标题相应为「信息科学与工程学部试卷归档封面」。 +% 目标:版式与原 .doc 逐项对齐。所有尺寸都由 Word 内部数值换算: +% pt → mm : mm = pt / 72 * 25.4 +% twips → mm : mm = twips / 1440 * 25.4 +% w:sz : 半磅值,÷ 2 即 pt +% +% 用法见同目录 试卷归档封面.tex,说明见 README.md +%====================================================================== +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{oucksfm}[2026/10/26 v1.0 OUC exam archive cover sheet] + +\RequirePackage{geometry} +\RequirePackage{fontspec} +\RequirePackage{xeCJK} +\RequirePackage{tabularray} + +%====================================================================== +% 1. 页面与版心 +% +% 原 .doc sectPr: +% pgSz A4(595.3 × 841.9 pt = 210.0 × 297.0 mm) +% pgMar top/bottom 70.9 pt = 25.01 mm +% left/right 56.7 pt = 20.00 mm +% header 42.55 pt = 15.01 mm / footer 49.6 pt = 17.50 mm +% +% 表宽 tblW = 100%(w:type="pct" w:w="5000"),即铺满版心: +% 版心宽 = 210 − 2×20.00 = 170.00 mm +% +% ⇒ 这里让 totalwidth 恰等于 170mm: +% · 表格天然与版心同宽,编译不刷 Overfull \hbox +% · 表格在纸面上的绝对位置与 Word 完全一致(左右各 20mm) +%====================================================================== +\geometry{ + paperwidth = 210mm, + paperheight = 297mm, + totalwidth = 170mm, % = 表宽,精确 + hmarginratio = 1:1, % 左右各 20mm + top = 25.01mm, + bottom = 25.01mm, + headheight = 0pt, + headsep = 0pt, + footskip = 17.50mm, +} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt} +\pagestyle{empty} % 原 .doc 无页眉页脚,故不排页码 + +%====================================================================== +% 2. 字体与字号 +% +% 表外标题 黑体 18pt 加粗(w:sz=36 + w:b),jc=center +% 左列标签 黑体 18pt (w:sz=36,全部 11 行一致) +% 右列值 黑体 18pt (w:sz=36)—— 学年 / 学期 +% 黑体 16pt (w:sz=32)—— 考试课程名称 / 课程类型 / +% 面向专业 / 面向年级 / 试卷份数 / +% 授课教师 / 日期 +% 黑体 14pt (w:sz=28)—— 课程号 / 选课号(纯数字,字号小一档) +% +% ⚠️ 全文只有黑体一种字体,没有宋体/仿宋混排,比另两份表单简单。 +% +% 字体全部来自仓库公共字体包 ../oucfonts.sty(文件在 ../fonts/ 下)。 +% 旧版这里写的是系统字体的 SimHei / SimSun / FangSong + AutoFakeBold, +% 换台机器(尤其 Linux/macOS)就编不出来。现已全部换成随仓库分发的 +% 开源字体,并且粗体用字体自带的真粗体、不再算法描边。 +%====================================================================== +\input{../fonts.tex} + +%---------------------------------------------------------------------- +% ⚠️⚠️⚠️【最要命的一条,与 ouclw.sty 同源】 +% ctex 默认 \linespread 约 1.3,会把 \fontsize{18}{21.6} 的 21.6pt +% 行距放大成 28pt 以上。 +% +% \fontsize 的第二个参数【本来是】用来设 \baselineskip 的,但 +% \selectfont 时会再乘一次 \linespread,所以必须先把 \linespread 归 1。 +% 这一步不能省,也必须在 \AtBeginDocument 之后再设一次 +% (ctex 在 begin document 时会重设)。 +%---------------------------------------------------------------------- +\newcommand{\sfmbodyfont}{% + \linespread{1}\relax + \fontsize{18}{21.6}\selectfont} + +% 三档字号(行距取字号的 1.2 倍,与原 .doc 单倍行距一致) +\newcommand{\sfmbigfont}{\linespread{1}\relax\fontsize{18}{21.6}\selectfont} +\newcommand{\sfmmidfont}{\linespread{1}\relax\fontsize{16}{19.2}\selectfont} +\newcommand{\sfmsmlfont}{\linespread{1}\relax\fontsize{14}{16.8}\selectfont} + +%---------------------------------------------------------------------- +% ⚠️ xeCJK 陷阱:局部字体切换命令若紧邻 \par(或落在段落末尾),段末的 +% 字体状态会"溢出"到后面段落。故局部切换一律用带 \normalfont 收尾的包装。 +%---------------------------------------------------------------------- +\newcommand{\SFMHT}[1]{{\heiti #1\normalfont}} + +%---------------------------------------------------------------------- +% ⚠️⚠️⚠️【「×」占位符的坑 —— 在 年度考核登记表/ 里踩过,那里只是绕过去了, +% 这里做了根治】 +% +% 现象:写 {\heiti ×××} 后编译,PDF 里这些 × 实际用的是 +% Times New Roman(pymupdf 读 span 的 font=TimesNewRomanPSMT), +% 不是黑体。§ 29 个 × 撑不满预期宽度,跟汉字混排时基线也偏。 +% +% 原因:xeCJK 按 Unicode 区段分类。「×」是 U+00D7,落在 Latin-1 补充区, +% xeCJK 把它判成【西文字符】⇒ 交给 fontspec 的西文字体(TNR)。 +% \heiti / \fangsong 只切换 CJK 字体,对这个字符【不起作用】。 +% 所以 {\fangsong ××} 这种写法看着像修好了,实际并没有 +% (年度考核登记表/ 的 PDF 里 × 至今仍是 TNR)。 +% +% 正解:把 U+00D7 显式声明为 CJK 字符类,让它回到 CJK 字体族, +% \heiti / \fangsong 才能真正管到它。全角宽度也就与汉字一致了。 +% +% ⚠️ 这条只在本包内生效,不影响其它模板(年度考核登记表 若也要修, +% 把这两行照抄过去即可)。 +%---------------------------------------------------------------------- +\xeCJKDeclareCharClass{CJK}{"00D7} % × 乘号 → 归 CJK,跟着 \heiti/\fangsong 走 +\xeCJKDeclareCharClass{CJK}{"2014} % — 破折号 → 归 CJK(学年区间「2025—2026」用得上) + +%====================================================================== +% 3. 列的宽度模型 +% +% 原 .doc tblGrid(2 个网格列,col_widths_pct = [30, 70]): +% c1 = 170 × 30% = 51.000 mm +% c2 = 170 × 70% = 119.000 mm +% +% cellMar:left/right = 85 twips = 1.4993 mm,top/bottom = 0 +% 边框 :w:sz = 4(单位 1/8 pt)⇒ 0.5 pt = 0.1764 mm +% +%---------------------------------------------------------------------- +% ⚠️ 与 ouclw.sty 一样,这里可以如实还原内边距(最窄列 51mm 远宽于两倍 +% 内边距 3.00mm,不像年度考核表那样被极窄列逼着取 colsep=0)。 +% +% tabularray 的 colsep 计在每列【左右两侧】,故 2 列共 4×1.4993 = 5.9972mm; +% 竖线 3 根(左边界 + 中间 + 右边界)× 0.1764mm = 0.5292mm。 +% 要让 Σwd + 5.9972 + 0.5292 = 170.000,需 +% Σwd = 163.4736 mm +% 而 (gridCol − 2×1.4993) 之和为 164.0028 mm,两者差 0.5292 mm 正好是竖线宽, +% 故每列再减 0.5292/2 = 0.2646 mm。 +% +% ⚠️ 上式只是理论值。tabularray 的计宽与画宽之间有约 0.45 pt 的取整差, +% 实测需再微调(见 3.2 的实测标定值),否则一直报 +% "Table width is too small, need 0.45pt more!" 外加一条 Overfull \hbox。 +%====================================================================== +\newcommand{\sfmrule}{0.5pt} % 边框粗细(w:sz=4) +\newcommand{\sfmcolsep}{1.4993mm} % 单元格左右内边距(85 twips) +\newlength{\sfmtblw} +\setlength{\sfmtblw}{170mm} % 表宽(含 3 根竖线与 4 处内边距) + +%---------------------------------------------------------------------- +% 3.1 各列宽(= gridCol − 2×colsep − 竖线分摊的理论值) +% 与 sfmtable 环境里 colspec 的 wd 必须逐字一致。 +%---------------------------------------------------------------------- +\newcommand{\sfmwa}{47.7368mm} % c1 51.000 − 2.9986 − 0.2646 +\newcommand{\sfmwb}{115.7368mm} % c2 119.000 − 2.9986 − 0.2646 + +%---------------------------------------------------------------------- +% 3.2 各列【内容可用宽】 +% +% 单列单元格的内容宽 = wd(左右两半 colsep 已被 colspec 扣掉并计入表格宽)。 +% 本表全部是不跨列的单列格,没有"合并格回收内边距"的问题(ouclw.sty 的 +% \lwspanA / \lwspanB 那类坑在这里不存在)。 +%---------------------------------------------------------------------- + +%====================================================================== +% 4. 行高 +% +% 原 .doc 每行都是 w:trHeight + w:hRule="exact"(固定行高,不是 atLeast): +% R1 学年 42.55 pt = 15.011 mm +% R2 学期 42.55 pt = 15.011 mm +% R3 课程号 43.55 pt = 15.363 mm +% R4 选课号 41.05 pt = 14.482 mm +% R5 考试课程名称 41.30 pt = 14.570 mm +% R6 课程类型 42.55 pt = 15.011 mm +% R7 面向专业 93.10 pt = 32.844 mm ← 唯一高行,容 5 个专业名折行 +% R8 面向年级 42.55 pt = 15.011 mm +% R9 试卷份数 52.80 pt = 18.627 mm +% R10 授课教师 42.55 pt = 15.011 mm +% R11 日期 42.55 pt = 15.011 mm +% ──────────────────────────────────────── +% 合计 185.949 mm +% +% ⚠️ Word 的 exact 是"精确等于",内容超了会【被裁掉】。tabularray 的 +% ht= 是最小行高(内容多则自动长高),语义更安全。本表各行内容都远 +% 小于行高,两者结果相同,故直接写 ht=。 +% +% ⚠️ 那几行 42.55 / 43.55 / 41.05 / 41.30 的零头不是随机的:Word 里 +% 它们是"字符高 + 段前段后"凑出来的实际测量值,照抄才能与原卷逐行对齐。 +%====================================================================== + +%====================================================================== +% 5. 表格环境 +% +% ⚠️ 用 tblr 而非 longtblr:本表总高约 186 mm,一页装得下(版心高 +% 297 − 2×25.01 = 247 mm),不需要断页。 +% +% ⚠️⚠️ colspec 与 row{} 必须字面写在这里,不能先存进宏再展开: +% tabularray 的列类型解析在宏展开之外进行,会报 +% "Unexpandable command \xxx inside column type"。 +% (所以 3.1 节那些 \sfmwa… 只作文档用,不能拼进 colspec。) +% +% ⚠️ 选项里的宏名一律不带 @:tabularray 解析选项时 @ 不是字母。 +%====================================================================== +\newenvironment{sfmtable}{% + \par\begingroup + \begin{tblr}[label=none]{ + colspec={Q[c,m,wd=47.7368mm] Q[c,m,wd=115.7368mm]}, + colsep=1.4993mm, rowsep=0pt, stretch=0, + hline{1-Z}={\sfmrule}, vline{1-Z}={\sfmrule}, + row{1}={ht=15.011mm}, row{2}={ht=15.011mm}, + row{3}={ht=15.363mm}, row{4}={ht=14.482mm}, + row{5}={ht=14.570mm}, row{6}={ht=15.011mm}, + row{7}={ht=32.844mm}, row{8}={ht=15.011mm}, + row{9}={ht=18.627mm}, row{10}={ht=15.011mm}, + row{11}={ht=15.011mm}, + }% +}{% + \end{tblr}\par\endgroup} + +%====================================================================== +% 6. 单元格内容包装 +% +% 本表全是单列格,tabularray 的 Q[c,m,wd=…] 已处理好居中与折行, +% 不需要 ouclw.sty 那种定宽 \parbox。这里只提供两个语义化的标签宏, +% 让 .tex 里不必反复写 \SFMHT{}。 +%====================================================================== + +% \sfmlabel{文字} —— 左列标签:黑体 18pt +\newcommand{\sfmlabel}[1]{{\heiti\sfmbigfont #1\normalfont}} + +% \sfmval{文字} —— 右列值(16pt,最常用) +\newcommand{\sfmval}[1]{{\heiti\sfmmidfont #1\normalfont}} + +% \sfmvalbig{文字} —— 右列值(18pt):学年 / 学期两行 +\newcommand{\sfmvalbig}[1]{{\heiti\sfmbigfont #1\normalfont}} + +% \sfmvalsmall{文字} —— 右列值(14pt):课程号 / 选课号 +\newcommand{\sfmvalsmall}[1]{{\heiti\sfmsmlfont #1\normalfont}} + +%====================================================================== +% 7. 表外标题 +% +% 原 .doc 第 1 段:黑体、加粗、w:sz=36(18pt)、jc=center +% +% 原文标题是「信息科学与工程学院试卷」,按现行建制与文档实际用途已改为 +% 「信息科学与工程学部试卷归档封面」 +% 实测 18pt 下宽 94.89mm,版心宽 170mm,左右各余约 37mm,单行不折。 +% 再加长(比如后面挂"(理论课)")仍有余量,超过 170mm 才会折行。 +% +% 标题与表格之间原 .doc 有 3 个空段落(idx 13/14/15), +% 合计 3 × 21.6pt = 64.8pt = 22.86 mm。这里用 \sfmtitleskip 还原。 +%====================================================================== +\newlength{\sfmtitleskip} +\setlength{\sfmtitleskip}{22.86mm} + +\newcommand{\sfmtitle}[1]{% + \par + \begingroup + \centering + {\heiti\bfseries\sfmbigfont #1\par}% + \endgroup + \vspace{\sfmtitleskip}} + +%====================================================================== +% 8. 表后空行 +% +% 原 .doc 表格之后还有一个空段落(idx 212)。 +%====================================================================== +\newcommand{\sfmtail}{\par\null\par} + +\AtBeginDocument{\sfmbodyfont} +\endinput \ No newline at end of file diff --git a/试卷归档封面/试卷归档封面.pdf b/试卷归档封面/试卷归档封面.pdf new file mode 100644 index 0000000..171eb3d Binary files /dev/null and b/试卷归档封面/试卷归档封面.pdf differ diff --git a/试卷归档封面/试卷归档封面.tex b/试卷归档封面/试卷归档封面.tex new file mode 100644 index 0000000..95c285f --- /dev/null +++ b/试卷归档封面/试卷归档封面.tex @@ -0,0 +1,121 @@ +%====================================================================== +% 中国海洋大学 信息科学与工程学部 试卷归档封面(理论课) +% +% 编译: xelatex 试卷归档封面.tex +% +% 本模板不含真人信息:课程名、课程号、选课号、班级、教师姓名一律用 +% × 占位。填表时只改下面【第 1 节】。 +% +% 版式来源:SynologyDrive/授课/数字逻辑/2025/归档/ +% 附件1:信息科学与工程学院试卷封面(理论课).doc +% (原文件名与内文标题写的是「学院」,现按现行建制改为「学部」) +% 所有尺寸已在 oucksfm.sty 内注明换算过程;要改版式请改 sty。 +% +% 与原 .doc 的差异(有意为之): +% · 原文件里的真实课程信息已全部换成 × 占位 +% · 单位名「学院」按现行建制改为「学部」,标题相应改为 +% 「信息科学与工程学部试卷归档封面」 +% · 纸张、边距、表宽、行高、字号、字体一律照原值,未做任何调整 +%====================================================================== +\documentclass[UTF8,fontset=none]{ctexart} +\usepackage{oucksfm} + +%====================================================================== +% 1. 表内内容(填表时只改这一段) +% +% ⚠️ 左列标签是学部制式用语,一般不用改;只改右列的值。 +%====================================================================== + +%---- 左列标签(11 个,与学部原表的字一模一样,含字间空格)------------ +\newcommand{\sfmyearlabel} {学\quad 年} % 原文件用两个半角空格 +\newcommand{\sfmtermlabel} {学\quad 期} +\newcommand{\sfmcnolabel} {课程号} +\newcommand{\sfmsnolabel} {选课号} +\newcommand{\sfmcourselabel}{考试课程名称} +\newcommand{\sfmtypelabel} {课程类型} +\newcommand{\sfmmajorlabel} {面向专业} +\newcommand{\sfmgradelabel} {面向年级} +\newcommand{\sfmcountlabel} {试卷份数} +\newcommand{\sfmteacherlabel}{授课教师} +\newcommand{\sfmdatelabel} {日\quad 期} + +%---- 右列的值(填表时改这里)------------------------------------------ +% +% ⚠️⚠️【必须看】占位符「×」一律用 \ph{} 包起来,不要裸写 ×。 +% +% 原因(在 年度考核登记表/ 里踩过):字体的 ASCII 区段由 fontspec 交给 +% 西文字体(这里是 Times New Roman),而「×」U+00D7 属于 Latin-1, +% 会被判成 ASCII ⇒ 用 TNR 的 ×,那是 1em 宽的数学乘号, +% 与汉字的 1em 字宽【不一样】(TNR 的 × 略窄、位置也偏)。 +% 结果是一串 × 撑不满预期宽度,与汉字混排时基线也参差。 +% +% \ph{} 把它强制交回黑体(全角),宽度才与汉字一致。 +% 本表全文黑体,所以用 \heiti 收尾即可。 +% +% ⚠️ 填表时把 \ph{×××} 整体替换成真实内容(不要保留 × ): +% 例如 \newcommand{\sfmcourse}{数字逻辑},一行的 \ph 都不要留。 +%---------------------------------------------------------------------- +\newcommand{\ph}[1]{{\heiti #1\normalfont}} + +% 学年。原文件写「2025年」,学期行写「秋季学期」。 +% ⚠️ 注意:学部原表是「学年」+「2025年」这种写法,不是「2025—2026」。 +% 若学校要求写成区间,改这里即可,行高涨一点不会溢出。 +\newcommand{\sfmyear} {\ph{××××}年} + +% 学期:秋 / 春,或「秋季学期」「春季学期」 +\newcommand{\sfmterm} {\ph{×}季学期} + +% 课程号 / 选课号:纯数字,14pt(比其余值小一档,原表如此) +% ⚠️ 纯数字是真正的 ASCII,本来就该用 TNR,所以不用 \ph 包。 +\newcommand{\sfmcno} {080502101231} +\newcommand{\sfmsno} {25252029} + +% 考试课程名称 +\newcommand{\sfmcourse}{\ph{××××}} + +% 课程类型:专业课 / 公共基础课 / 通识课 … +\newcommand{\sfmtype} {\ph{×××}} + +% 面向专业。多个专业之间用「、」隔开。 +% ⚠️⚠️ 这一格是全表唯一的高行(32.844mm),能容 3 行 16pt 文字。 +% 专业名超过 3 行会自动把行撑高,整表就顶出版心了——届时请把 +% oucksfm.sty 里 row{7} 的 ht 改大,或者把专业名精简。 +\newcommand{\sfmmajor}{% + \ph{××××××××}、\ph{××××}、\ph{××××××}、\ph{××××××}、\ph{××××××}} + +% 面向年级 +\newcommand{\sfmgrade}{\ph{××××}} + +% 试卷份数 +\newcommand{\sfmcount}{\ph{××}} + +% 授课教师 +\newcommand{\sfmteacher}{\ph{×××}} + +% 日期 +\newcommand{\sfmdate}{\ph{××××}年\ph{××}月\ph{××}日星期\ph{×}} + +%====================================================================== +% 2. 正文 +%====================================================================== +\begin{document} + +\sfmtitle{信息科学与工程学部试卷归档封面} + +\begin{sfmtable} + \sfmlabel{\sfmyearlabel} & \sfmvalbig{\sfmyear} \\ + \sfmlabel{\sfmtermlabel} & \sfmvalbig{\sfmterm} \\ + \sfmlabel{\sfmcnolabel} & \sfmvalsmall{\sfmcno} \\ + \sfmlabel{\sfmsnolabel} & \sfmvalsmall{\sfmsno} \\ + \sfmlabel{\sfmcourselabel} & \sfmval{\sfmcourse} \\ + \sfmlabel{\sfmtypelabel} & \sfmval{\sfmtype} \\ + \sfmlabel{\sfmmajorlabel} & \sfmval{\sfmmajor} \\ + \sfmlabel{\sfmgradelabel} & \sfmval{\sfmgrade} \\ + \sfmlabel{\sfmcountlabel} & \sfmval{\sfmcount} \\ + \sfmlabel{\sfmteacherlabel} & \sfmval{\sfmteacher} \\ + \sfmlabel{\sfmdatelabel} & \sfmval{\sfmdate} \\ +\end{sfmtable} + +\sfmtail + +\end{document} \ No newline at end of file diff --git a/课程执行大纲/README.md b/课程执行大纲/README.md index 181a835..03c3482 100644 --- a/课程执行大纲/README.md +++ b/课程执行大纲/README.md @@ -92,7 +92,7 @@ xelatex 课程执行大纲.tex # 单次即可,无交叉引用 | `trHeight`(exact) | 454 | 8.01(本包用 7.834,见坑 3) | | 边框 `sz` | 4 | 0.5pt | -`tblLayout fixed`、`jc center`、`tblW 0 auto`。全表 12pt 方正仿宋。 +`tblLayout fixed`、`jc center`、`tblW 0 auto`。全表 12pt 仿宋(朱雀仿宋)。 ### 表 1(教学日历) @@ -184,18 +184,30 @@ ctex 默认 `\linespread ≈ 1.3`,会把 `\fontsize{12}{18}` 的行距放大 反过来,在已经缩小过字号的上下文里,**不能**用 `\linespread{1.2}` 当"1.2 倍行距" (它乘的是外层的 9pt,不是当前的 10.5pt),要直接钉 `\fontsize{10.5}{12.6}`。 -## 字体降级 +## 字体 -原 docx 用了 4 个字体,其中 3 个是**方正商业字体**,嵌在 docx 里但本机没装: +原 docx 用了 4 个字体,其中 3 个是**方正商业字体**,嵌在 docx 里但本机没装。 +旧版做法是降级到 Windows 自带字体(宋体/黑体/仿宋 + `AutoFakeBold` 伪粗), +但这既依赖本机装了什么字体(换台机器就可能编不出),而且 SimSun / SimHei / +FangSong 也都不允许随仓库分发。 -| docx 原字体 | 用在哪 | 本包替代 | -|---|---|---| -| 方正小标宋简体 | 校名、副标题、大标题、教学日历 | 宋体 + 伪粗(`AutoFakeBold=3.2`) | -| 方正仿宋_GB2312 | 正文、表 0、签字栏 | 仿宋(`FangSong`) | -| 黑体 | 各级标题 | 黑体(`SimHei`) | -| 宋体 | 教学日历表 9pt | 宋体(`SimSun`) | +现在全部改用仓库公共字体包 `../fonts.tex`: -装过方正字体的话,改 `ouccourse.sty` 第 75~78 行的 `\newCJKfontfamily` 即可,其余不动。 +| docx 原字体 | 用在哪 | 本包替代 | 命令 | +|---|---|---|---| +| 方正小标宋简体 | 校名、副标题、大标题、教学日历 | OUC Serif **真粗体** | `\ccbiaosong` | +| 方正仿宋_GB2312 | 正文、表 0、签字栏 | 朱雀仿宋 | `\ccfang` | +| 黑体 | 各级标题 | OUC Sans(思源黑体) | `\cchei` | +| 宋体 | 教学日历表 9pt | OUC Serif(思源宋体) | `\ccsong` | + +比原来的伪粗更好:小标宋本来就是宋体的标题变体,用思源宋体自带的真粗体, +笔画不会像 `AutoFakeBold=3.2` 那样糊在一起。 + +> ⚠️ **朱雀仿宋只有常规一档**,`\ccfang` 下 `\bfseries` 不会真的变粗。 +> 教学日历表头(`课程执行大纲.tex` 里的 `{\ccfang\ccszxi\bfseries 周次}` 等 6 处) +> 原来靠 `AutoFakeBold=2.5` 伪粗,现在给 `ccfang` 单独开了 `FakeBold=0.8` +> 保住层次(见 `ouccourse.sty` 的注释)。若要更实在的粗体,把那几处 +> `\ccfang` 换成 `\cchei` —— 黑体本身就是标题用的重字面。 同时 `\xeCJKsetup{CJKecglue={}}` 关掉了西文与汉字之间的自动空隙 —— 原 docx 没有这种空隙, 不关会出现「×× 学部×× 学院」这种多出来的空格。 @@ -210,7 +222,7 @@ ctex 默认 `\linespread ≈ 1.3`,会把 `\fontsize{12}{18}` 的行距放大 | 行内是否允许断开 | 允许(无 `cantSplit`) | 允许 | 一致 | | 表 0 每行高 | 8.01 | 8.01 | 一致 | | 表 1 表宽 | 165.54 | 165.36(−0.18) | 竖线宽度舍入 | -| 字体 | 方正小标宋/仿宋 | 宋体加粗/仿宋 | 商业字体未安装 | +| 字体 | 方正小标宋/仿宋 | 思源宋体粗/朱雀仿宋 | 商业字体不可分发,已换开源替代 | | 修订标记 | 46 处 `w:ins` | 不保留 | 已接受全部插入修订 | | 46 处 `w:ins` 中的红字 | `color=C00000` | 黑色 | 那是修订高亮,非正式版式 | diff --git a/课程执行大纲/ouccourse.sty b/课程执行大纲/ouccourse.sty index 39290c4..7975c20 100644 --- a/课程执行大纲/ouccourse.sty +++ b/课程执行大纲/ouccourse.sty @@ -55,22 +55,32 @@ %====================================================================== % 2. 字体 % -% 原 docx 用到 4 个字体,其中 3 个是方正商业字体,本机【没有】: +% 原 docx 用到 4 个字体,其中 3 个是方正商业字体: % 方正小标宋简体 标题(嵌在 docx 里,系统未安装) % 方正仿宋_GB2312 正文(同上) % 黑体 各级标题 % 宋体 教学日历表正文、9pt % -% ⇒ 降级方案(视觉上最接近的替代): -% 方正小标宋简体 → 宋体加粗 (小标宋本身就是宋体的标题变体) -% 方正仿宋_GB2312 → 仿宋 (同一字体族,GB2312 版) -% 黑体 → SimHei -% 宋体 → SimSun -% 若你的机器装了方正字体,把下面几个 \newCJKfontfamily 的名字改掉即可, -% 其余代码不用动。README 里有说明。 +% 旧版这里是 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(黑体本身就是标题用的重字面)。 %====================================================================== -\setmainfont{Times New Roman} -\setCJKmainfont{SimSun}[AutoFakeBold=2.5] +\input{../fonts.tex} %---------------------------------------------------------------------- % ⚠️ xeCJK 默认会在[汉字 ↔ 西文/数字]之间自动插一段空白(CJKecglue)。 @@ -84,10 +94,53 @@ } \setlength{\parindent}{0pt} -\newCJKfontfamily\ccsong{SimSun}[AutoFakeBold=2.5] % 宋体(可伪粗) -\newCJKfontfamily\cchei{SimHei} % 黑体 -\newCJKfontfamily\ccfang{FangSong}[AutoFakeBold=2.5] % 仿宋 -\newCJKfontfamily\ccbiaosong{SimSun}[AutoFakeBold=3.2] % 小标宋的替代(加粗宋体) +% 四个语义别名,沿用原命令名,正文一处都不用改。 +% 用 \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%。 diff --git a/课程执行大纲/课程执行大纲.pdf b/课程执行大纲/课程执行大纲.pdf index 5ea3ad2..a9bfafa 100644 Binary files a/课程执行大纲/课程执行大纲.pdf and b/课程执行大纲/课程执行大纲.pdf differ diff --git a/课程执行大纲/课程执行大纲.tex b/课程执行大纲/课程执行大纲.tex index d86fb57..9c247f8 100644 --- a/课程执行大纲/课程执行大纲.tex +++ b/课程执行大纲/课程执行大纲.tex @@ -66,6 +66,29 @@ 为数学模型并求解的基本能力,为后续的数字信号处理、通信原理、自动控制等课程奠定 基础。} +% ⚠️ 英文段:不要在此处加任何断行干预。 +% +% 现象:换用 TeX Gyre Termes 后,第 1 页英文段第 3 行会宽出 6.39pt +% (Overfull),断行点比 Word 原稿略有前移。 +% +% 根因:这一段第 2 行要靠 time-invariant 的显式连字符断成 "time-" + +% "invariant" 才排得下 —— 实测该行到 "time-" 为止是 451.62pt, +% 而可用宽度只有 452.32pt,**只剩 0.70pt 余量**。Times New Roman 下 +% 是 451.55pt(余 0.77pt)。两个字体都在临界线上,Termes 这边因为 +% 字宽差 0.07pt,TeX 判断这次断行"不划算"就放弃了,于是把单词整体 +% 推到下一行,连锁导致 6.39pt 溢出。 +% +% 试过并**全部失败**的改法(勿重复): +% ① \hyphenpenalty=10000 全段禁断词 → 溢出涨到 27.99pt +% ② \emergencystretch=1.5em → 一行只排到 87pt 就提前断 +% ③ \sloppy → 整段多一行,第 1 页后续全部推移 +% ④ \mbox{throughout} → 溢出涨到 17.73pt +% ⑤ \hyphenation{throughout} → 溢出涨到 17.73pt(同上) +% +% 当前处理:接受这 6.39pt 的 Overfull。它发生在右侧页边距之外的 +% 一个连字符上,**肉眼不可见**(该行 x1=536.6pt,纸张宽 595pt, +% 右边距 22.93mm=65pt,仍有 58pt 空白),不影响任何正文内容与页数。 +% 这比为了消掉一条警告去动段落参数、把整页版式推乱要安全得多。 \ccp{This course is a core foundation subject for electronic information majors, covering the fundamental laws and analytical methods of deterministic signals passing through linear time-invariant systems. Two parallel threads, continuous