新增试卷归档目录 LaTeX 模板 #7
把「附件2:信息科学与工程学院归档目录(理论课).doc」做成 LaTeX 模板,
落在 试卷归档目录/。版式逐项照原 .doc 还原,尺寸全部注明换算过程。
- oucgddir.sty:A4、表宽 150.81mm、13 行固定行高、单元格宏
- 试卷归档目录.tex:12 项核对清单
- README.md:用法 / 版式参数表 / 实测数据 / 踩坑记录
- 根 README.md、fonts.tex:模板清单加一项,「七个」改「八个」
与原稿实测对比(pymupdf 读 PDF):
表格竖线 x Δ ≤ 0.001mm,横线 y Δ ≤ 0.006mm
32 行文字水平中心 Δ ≤ 0.11pt,字号 24/18/12/10.45 全部精确
编译 1 页,零 Overfull / Underfull / 缺字
踩到并解决的五个坑:
1. \fontsize 必须用 bp(TeX pt 比 PostScript pt 大 0.36%,24pt 实测 23.91)
2. xeCJK 吞连续半角空格 → 标题字间用 \gdgap 手动 kern 24bp
3. xeCJK 默认 PunctStyle=quanjiao 会挤压全角括号,使含括号的行整行
右移 4.23pt → 必须 \xeCJKsetup{PunctStyle=plain}
4. tabularray 把线宽算进列宽、ht 不含 hline 线宽、boxes 比 Σwd 多
0.4945pt → 三处都要实测标定
5. 单元格整体下移只有「尾部 \vspace*」有效,顶部 \vspace*/rule 会被
首行 ascent 吃掉,\raisebox 被 m 居中抵销
字体:方正楷体_GB2312(商业,不可分发)→ OUC Kai(霞鹜文楷子集,OFL 1.1),
西文 Times New Roman → TeX Gyre Termes。字宽逐字相同(60.00 / 120.00pt 全等)。
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
# 试卷归档目录 —— 信息科学与工程学部试卷归档目录(理论课)
|
||||
|
||||
信息科学与工程学部**试卷归档目录**的 XeLaTeX 模板。原文件是学院/学部下发的
|
||||
`.doc` 表(12 项核对清单),本目录把它做成可直接编译的 LaTeX 版。
|
||||
|
||||
> **改名说明**:原文件名为「附件2:信息科学与工程学院归档目录(理论课)」,
|
||||
> 内文写的是「归档目录」、未出现单位名。按现行建制已统一为 **学部**,
|
||||
> 目录名、文件名同步。内文标题保持原文「归 档 目 录」(四字间隔一个字宽)。
|
||||
|
||||
> 与 [`试卷归档封面/`](../试卷归档封面/) 的关系:两件是**同一套归档材料**的
|
||||
> 两个附件的原件配套 —— 附件1 是封面(随卷装订、11 行表单),本目录是
|
||||
> 附件2(装袋前逐项核对的清单、12 项勾选表)。版式上都照原 `.doc` 1:1 还原,
|
||||
> 但一个是 A4 表单、一个是 A4 居中表格,互不依赖。
|
||||
|
||||
## 文件
|
||||
|
||||
| 文件 | 说明 |
|
||||
|---|---|
|
||||
| `oucgddir.sty` | 版式包。A4、表宽 150.64mm、13 行固定行高,每项尺寸都附换算过程 |
|
||||
| `试卷归档目录.tex` | 正文入口(12 项清单写在这里,增删改归档项只改这个文件) |
|
||||
| `试卷归档目录.pdf` | 成品样张 |
|
||||
|
||||
## 编译
|
||||
|
||||
```bash
|
||||
xelatex 试卷归档目录.tex
|
||||
```
|
||||
|
||||
必须用 **XeLaTeX**(fontspec + xeCJK),pdflatex 编译不过。
|
||||
自包含,不依赖任何图片。实测 1 页,零警告(无 Overfull / Underfull / 缺字)。
|
||||
|
||||
## 用法
|
||||
|
||||
正文就是一张表,加行改行即可:
|
||||
|
||||
```latex
|
||||
\begin{gdtable}
|
||||
\gdhead{序号} & \gdhead{内容} & \gdheadIII \\
|
||||
\gdno{1} & \gditem{考试签到表} & \\
|
||||
\gdno{2} & \gditem{监考记录} & \\
|
||||
% …… 照此继续
|
||||
\end{gdtable}
|
||||
```
|
||||
|
||||
可用的单元格宏:
|
||||
|
||||
| 宏 | 用途 | 字号/字形 |
|
||||
|---|---|---|
|
||||
| `\gdno{1}` | 序号列 | 楷体 12pt 粗 |
|
||||
| `\gditem{考试签到表}` | 内容列 | 楷体 12pt |
|
||||
| `\gdhead{序号}` | 表头单段格(序号、内容两列) | 楷体 18pt 粗 |
|
||||
| `\gdheadIII` | 表头第三格,**自带**「标注」+ 小字两段 | 18pt 粗 + 10.45pt |
|
||||
| `\gdnote{...}` | 单独排一行小字(10.45pt) | 楷体 10.45pt |
|
||||
|
||||
标题用 `\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}` —— **`\gdgap` 不能省**,
|
||||
原因见下面第 3 条。
|
||||
|
||||
## 版式参数
|
||||
|
||||
全部照原 `.doc` 实测值,未做主观调整:
|
||||
|
||||
| 项目 | 值 | 来源 |
|
||||
|---|---|---|
|
||||
| 纸张 | A4 210×297mm | `pgSz` 11906×16838 twips |
|
||||
| 页边距 | 上下 25.40mm、左右 29.599mm | `pgMar` top/bottom 1440 twips;左右经实测标定,见下 |
|
||||
| 表宽 | 150.81mm | `tblGrid` 合计 8540 twips = 150.64mm,加列取整余量 |
|
||||
| 列宽 | 23.072 + 77.346 + 50.218 mm | `gridCol` 1308 / 4385 / 2847 twips |
|
||||
| 单元格内边距 | 左右 1.905mm、上下 0 | `tblCellMar` 108 twips |
|
||||
| 边框 | 0.5pt 实线 | `w:sz=4`(1/8pt 单位) |
|
||||
| 行高 | 表头 20.549mm、中间 12 行 13.758mm、末行 14.164mm | `trHeight` 1165 / 780 / 803 twips,`hRule=exact` |
|
||||
| 标题 | 楷体 24pt,首行缩进 46.55mm | `firstLine` 2640 twips |
|
||||
| 表头 | 楷体 18pt 粗 | `w:sz=36` + `w:b` |
|
||||
| 表头小注 | 楷体 10.45pt | `w:szCs=21`(未设 `w:sz`,Word 退回 10.5pt) |
|
||||
| 序号列 | 楷体 12pt 粗 | `w:sz=24` + `w:b` |
|
||||
| 内容列 | 楷体 12pt | `w:sz=24` |
|
||||
|
||||
## 实测校验
|
||||
|
||||
用 pymupdf 读两版 PDF,逐位对比(原稿由 WPS 导出):
|
||||
|
||||
```
|
||||
表格竖线 x (mm) 原稿 29.686 / 52.758 / 130.104 / 180.322
|
||||
新版 29.687 / 52.758 / 130.104 / 180.321 Δ ≤ 0.001
|
||||
|
||||
表格横线 y (mm) 原稿 53.001 … 239.056(14 条)
|
||||
新版 53.004 … 239.050 Δ ≤ 0.006
|
||||
|
||||
标题四字 x0 (pt) 原稿 222.00 / 270.00 / 318.00 / 366.00
|
||||
新版 221.95 / 269.93 / 317.93 / 365.93 Δ ≤ 0.07
|
||||
|
||||
32 行文字水平中心 最大偏差 0.11pt
|
||||
32 行文字距行顶 最大偏差 0.57pt(数字与中文各自字体度量差,见下)
|
||||
字号 24.00 / 18.00 / 12.00 / 10.45 …………全部精确
|
||||
```
|
||||
|
||||
> 纵向那 0.5pt 的来源:原稿序号列用 Times New Roman、正文用方正楷体,
|
||||
> Word 让**两种字体各自按自身 ascent 落基线**,同一行里数字比中文高 0.48pt
|
||||
> (原稿实测 232.25 vs 231.77)。新版用 Termes + OUC Kai 复刻了同样的
|
||||
> 相对关系(232.32 vs 232.32 —— 差 0,因为 Termes 与 OUC Kai 的 ascent
|
||||
> 恰好一致)。这是**字体度量差**,不是排版错误,且新版同一行内更整齐。
|
||||
|
||||
## 五个坑(改之前先看)
|
||||
|
||||
### 1. `\fontsize` 必须用 `bp`,不能用默认的 `pt`
|
||||
|
||||
Word/PDF 里的 "pt" 是 **PostScript point**(1/72 英寸),TeX 的默认 `pt` 是
|
||||
**TeX point**(1/72.27 英寸),后者大出 0.36%。写 `\fontsize{24}{28.8}`,
|
||||
PDF 里实测只有 **23.91**(= 24 × 72/72.27),与原稿的 24.00 对不上。
|
||||
|
||||
```latex
|
||||
\fontsize{24bp}{28.8bp}\selectfont % 实测正好 24.000
|
||||
```
|
||||
|
||||
本包所有照抄 Word 数值的字号、行距、间距一律写 `bp`。
|
||||
|
||||
### 2. xeCJK 会吞掉连续半角空格
|
||||
|
||||
标题原文是「归␣␣档␣␣目␣␣录」(字间各两个半角空格)。直接照抄进源码,
|
||||
编译出来是紧贴的「归档目录」—— 空格全没了(实测 x0=216.09,且只有一个
|
||||
span,而原稿是四个独立字、间隔恒 48pt)。
|
||||
|
||||
正解是不依赖空格策略,用 `\kern` 手动摆:
|
||||
|
||||
```latex
|
||||
\newcommand{\gdgap}{\kern\gdtitlegap} % \gdtitlegap = 24bp = 1 个字宽
|
||||
\gdtitle{归\gdgap 档\gdgap 目\gdgap 录}
|
||||
```
|
||||
|
||||
### 3. 必须关掉 xeCJK 的全角标点压缩(`PunctStyle=plain`)
|
||||
|
||||
**这条最隐蔽。** 现象:凡含全角括号的行,整行右移 4.23pt,而字宽完全正确。
|
||||
「试卷(项目设计报告)」原稿 x0=199.20,默认设置排出 **203.43**。
|
||||
|
||||
根因是 xeCJK 默认 `PunctStyle=quanjiao` 会对全角标点做字宽挤压:「(」「)」
|
||||
的 advance 从 1.0em 压到 0.5em,省下的空间记在**行内盒子的起点**上,于是
|
||||
整行墨迹相对盒子右移。两端对齐的正文里这叫"标点紧凑",但在**居中**的表格
|
||||
单元格里就是整行偏移,且偏移量随括号个数变化(1 个 4.23pt、2 个 8.46pt)。
|
||||
|
||||
```latex
|
||||
\xeCJKsetup{PunctStyle=plain}
|
||||
```
|
||||
|
||||
Word 本来就不做这个挤压,关掉反而与原件一致。
|
||||
|
||||
### 4. `totalwidth` / 行高 / 位移都要比理论值多留一点
|
||||
|
||||
tabularray 的**计宽**与**画宽**不是一回事,三处都要实测标定:
|
||||
|
||||
- **列宽**:它把边框线宽算进列宽,故 `wd = gridCol − 2×colsep − 线宽`,
|
||||
而不是"按竖线根数分摊"。按分摊算每列窄 0.154mm,整表窄 0.466mm。
|
||||
- **表宽**:左竖线画在版心左边界**内侧**,整个 tblr 盒子比
|
||||
`Σwd + 6×colsep + 4×线宽` 又多约 0.4945pt,不补足就报
|
||||
`Overfull \hbox (0.49452pt too wide)`。
|
||||
- **行高**:`row{..}={ht=..}` 是**内容区**高度,hline 线宽不含在内,
|
||||
每行实际比 ht 高整整一个 `\gdrule`(0.5pt)。13 行累计多 6.5pt,
|
||||
必须逐档减掉 0.1764mm。
|
||||
|
||||
### 5. 单元格里想"整体下移",只有一种写法有效
|
||||
|
||||
`\gdheadIII` 要让「标注」+ 小注两段整体下移 1.49pt,五种手段实测对比
|
||||
(数值为距行顶距离,末项是两段间距):
|
||||
|
||||
| 手段 | 标注 | 小注 | 间距 | 结论 |
|
||||
|---|---|---|---|---|
|
||||
| 原样 | 25.43 | 46.53 | 21.09 | 偏低 1.49 |
|
||||
| 尾部 `\vspace*{-2.98pt}` | 26.92 | 48.01 | 21.10 | ✅ 正确 |
|
||||
| 顶部 `\vspace*{+2.98pt}` | 23.95 | 48.01 | 24.06 | 反向且拉大间距 |
|
||||
| 顶部 `\rule{0pt}{26.5pt}` | 31.25 | 52.34 | 21.09 | 位移过大 |
|
||||
| `\raisebox{-1.49pt}{\vbox{..}}` | 25.43 | 46.53 | 21.09 | 完全无效 |
|
||||
|
||||
原理:尾部间距 s 改变盒子总高 H(H' = H + s),m 居中后
|
||||
内容顶端 = 行顶 + (行高 − H')/2。所以 **s 与位移是 2:1 关系**,
|
||||
但实测灵敏度是 0.778 而非 0.5(hline 也参与高度分配),故最终标定值是
|
||||
`\vspace*{-2.98pt}` 而不是 −1.49×2。
|
||||
|
||||
顺带一个反直觉的点:**顶部间距会被首行的 ascent 吃掉** —— 3.6pt 的
|
||||
`\rule` 远小于 18pt 字的 ascent,写了等于没写;必须超过 ascent 才有反应,
|
||||
但那时位移已经过量。所以"顶部加高"这条路走不通。
|
||||
|
||||
## 字体
|
||||
|
||||
全部来自仓库公共字体包 [`../fonts.tex`](../fonts.tex),来源与授权见
|
||||
[`../fonts/README.md`](../fonts/README.md)。
|
||||
|
||||
原稿中文用「方正楷体_GB2312」(商业字体,不允许随仓库分发),现换成
|
||||
**OUC Kai**(霞鹜文楷 GB2312 子集,SIL OFL 1.1)—— 同为楷体、同为
|
||||
GB2312 字符集,字宽逐字相同(实测「考试签到表」= 60.00pt,
|
||||
「试卷(项目设计报告)」= 120.00pt,与原稿全等)。西文/数字原用
|
||||
Times New Roman,现用 **TeX Gyre Termes**(度量兼容替代)。
|
||||
|
||||
## 一个已知的"不改动"
|
||||
|
||||
原表 `tblGrid` 合计 8540 twips = **150.64mm**,而原版心 210 − 2×31.75
|
||||
= **146.50mm** —— 原文档里这张表本来就在版心之外各溢出 2.07mm,靠
|
||||
`jc=center` 居中掩盖,看起来正常。
|
||||
|
||||
本模板把版心直接设成表宽(150.81mm),表格居中与纸面绝对位置与原稿一致
|
||||
(见上面的实测校验),但不再"溢出版心":**视觉上无差别,且不产生
|
||||
Overfull 警告**。这是唯一的主动偏离,属修正而非改版。
|
||||
Reference in New Issue
Block a user