Files
laoyang 9c959c0a2f 点名册:课程信息六项改为定宽三栏对齐 #26
原来用 \hfill 均分,各栏起点随内容长短漂移,两行对不齐:
第 2 栏差 42pt、第 3 栏差 55pt。

改为定宽三栏:版心 269mm 三等分,每栏 89.67mm,
标签占 18mm,值占 63.67mm。上下两行冒号位置严格重合。

值超长自动折行,不会压到下一栏。

验证:两行冒号位置 90.7 / 344.9 / 599.1 完全一致,差值 0.0。
全库 17/17 通过,点名册 error 0、Overfull 0。
2026-11-03 22:09:02 +08:00

215 lines
7.9 KiB
TeX
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{oucroll}[2026/11/03 v1.0 OUC roll-call sheet]
%======================================================================
% oucroll.sty —— 点名册版式包
%
% 横版 A4,20 列表格:序号 / 学号 / 姓名 / 第1~17周
% 用法见同目录 README.md
%======================================================================
\RequirePackage{geometry}
\RequirePackage{fontspec}
\RequirePackage{xeCJK}
\RequirePackage{tabularray}
\RequirePackage{calc}
%======================================================================
% 一、页面:A4 横向
%======================================================================
\geometry{
paperwidth = 297mm,
paperheight = 210mm,
left = 14mm,
right = 14mm,
top = 12mm,
bottom = 16mm,
headheight = 0pt,
headsep = 0pt,
footskip = 8mm,
}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt}
\pagestyle{empty} % 点名册单页,不排页码
\input{../fonts.tex}
%======================================================================
% 二、字号
%======================================================================
\newcommand{\rollbasefont}{%
\linespread{1}\relax
\fontsize{10.5bp}{13bp}\selectfont}
\newcommand{\rolltitlefont}{\linespread{1}\relax\fontsize{20bp}{24bp}\selectfont}
\newcommand{\rollinfofont} {\linespread{1}\relax\fontsize{10.5bp}{15bp}\selectfont}
\newcommand{\rollheadfont} {\linespread{1}\relax\fontsize{8bp}{9.5bp}\selectfont}
\newcommand{\rollcellfont} {\linespread{1}\relax\fontsize{10bp}{12.5bp}\selectfont}
\newcommand{\rollweekfont} {\linespread{1}\relax\fontsize{7.5bp}{9bp}\selectfont}
%======================================================================
% 三、列宽
%
% 版心宽 269mm(297 − 14×2)。
% tabularray 的实际表宽 = Σwd + 2×colsep×列数 + 竖线宽×列数
% 20 列时:2×0.4×20 = 16.00mm,竖线 0.4pt×20 = 2.82mm,共 18.82mm
% 故 Σwd 只能取 269 − 18.82 = 250.18mm
%
% 序号 9 + 学号 26 + 姓名 20 = 55mm
% 余 195.18mm 分给 17 周,每周 11.4810mm
%======================================================================
\newcommand{\rollrule}{0.4pt}
\newcommand{\rollcolsep}{0.4mm}
\newcommand{\rollwno}{9mm} % 序号
\newcommand{\rollwid}{26mm} % 学号
\newcommand{\rollwname}{20mm} % 姓名
\newcommand{\rollwweek}{11.4734mm} % 每周
%======================================================================
% 四、课程信息
%
% \rollinfo{课程名称}{数值}
% 信息行按「标签 + 值」成对排版,一行放三项。
%======================================================================
\newcommand{\rollcourse}{} % 课程名称
\newcommand{\rollcno}{} % 课程号
\newcommand{\rollsno}{} % 选课号
\newcommand{\rollcredit}{} % 学分
\newcommand{\rollteacher}{} % 任课教师
\newcommand{\rollterm}{} % 学年学期
\newcommand{\rolldept}{} % 开课单位
\newcommand{\rollsetcourse}[1]{\renewcommand{\rollcourse}{#1}}
\newcommand{\rollsetcno}[1]{\renewcommand{\rollcno}{#1}}
\newcommand{\rollsetsno}[1]{\renewcommand{\rollsno}{#1}}
\newcommand{\rollsetcredit}[1]{\renewcommand{\rollcredit}{#1}}
\newcommand{\rollsetteacher}[1]{\renewcommand{\rollteacher}{#1}}
\newcommand{\rollsetterm}[1]{\renewcommand{\rollterm}{#1}}
\newcommand{\rollsetdept}[1]{\renewcommand{\rolldept}{#1}}
%======================================================================
% 五、标题
%======================================================================
\newcommand{\rolltitle}[1]{%
\par\begingroup\centering
{\heiti\rolltitlefont #1\par}%
\endgroup\vspace*{2mm}}
%======================================================================
% 六、课程信息区
%
% 两行 × 三栏,定宽对齐。
%
% ⚠️ 不能用 \hfill 均分:\hfill 只均分行内剩余空间,各栏起点会随
% 标签与值的长短前后漂移,六项在两行里对不上。
%
% ⚠️ 值用 \parbox 显式限宽,不用 tabular 的 p 列。
% p 列在 xeCJK 下遇到全角标点(如「(」)时断行判定不稳定,
% 实测同样列宽,有的内容断、有的不断。\parbox 加 \raggedright
% 断行行为可预期。
%======================================================================
\newlength{\rollcolw}
\setlength{\rollcolw}{89.6667mm} % 269mm / 3
\newlength{\rolllabw}
\setlength{\rolllabw}{18mm} % 标签宽,「学年学期」四字 × 10.5bp ≈ 14.8mm
\newlength{\rollvalw}
\setlength{\rollvalw}{63.6667mm} % 值宽 = 89.6667 − 18 − 8(栏间余量)
% 一栏:标签(定宽黑体)+ 冒号 + 值(定宽,超长自动换行)
%
% ⚠️ 值必须加 \sloppy。xeCJK 对全角标点(如「(」)前后有断行禁则,
% 正常断行惩罚下 TeX 宁可溢出也不在此处断,表现为文字压到下一栏。
% \sloppy 放宽 \tolerance,让它在下一个汉字边界断掉。
\newcommand{\rollfield}[2]{%
\makebox[\rolllabw][l]{\heiti #1}%
\parbox[t]{\rollvalw}{\raggedright\sloppy :#2}}
% 三栏一行
\newcommand{\rollinforow}[6]{%
\noindent
\rollfield{#1}{#2}\hspace*{8mm}%
\rollfield{#3}{#4}\hspace*{8mm}%
\rollfield{#5}{#6}\par}
\newcommand{\rollinfo}{%
\begingroup\rollinfofont
\rollinforow{课程名称}{\rollcourse}%
{课程号}{\rollcno}%
{选课号}{\rollsno}%
\vspace*{1.2mm}%
\rollinforow{学分}{\rollcredit}%
{任课教师}{\rollteacher}%
{学年学期}{\rollterm}%
\endgroup\vspace*{2.5mm}}
%======================================================================
% 七、周次表头
%
% 「第 1 周」写成「1」,表头下方一行标注「周次」,这样表头只占
% 一行高度,横向也省空间 —— 20 列挤在一行里,竖排会撑高表头。
%======================================================================
\newcommand{\rollweekhead}[1]{%
{\heiti\rollheadfont #1}}
%======================================================================
% 八、表格环境
%
% 20 列:3 固定 + 17 周
% 表头单行:序号 / 学号 / 姓名 / 1 / 2 / … / 17
%======================================================================
\newcounter{rollrow}
\newenvironment{rolltable}{%
\par\begingroup\rollcellfont
\begin{tblr}[label=none, expand=\rollrow]{
colspec={
Q[c,m,wd=\rollwno]
Q[c,m,wd=\rollwid]
Q[c,m,wd=\rollwname]
*{17}{Q[c,m,wd=\rollwweek]}
},
colsep=\rollcolsep, rowsep=0pt, stretch=0,
hline{1-Z}={\rollrule}, vline{1-Z}={\rollrule},
row{1}={ht=7.0mm},
row{2-Z}={ht=4.5mm},
}%
% ---- 表头 ----
{\heiti\rollheadfont 序号} &
{\heiti\rollheadfont 学号} &
{\heiti\rollheadfont 姓名} &
\rollweekhead{1} & \rollweekhead{2} & \rollweekhead{3} & \rollweekhead{4} &
\rollweekhead{5} & \rollweekhead{6} & \rollweekhead{7} & \rollweekhead{8} &
\rollweekhead{9} & \rollweekhead{10} & \rollweekhead{11} & \rollweekhead{12} &
\rollweekhead{13} & \rollweekhead{14} & \rollweekhead{15} & \rollweekhead{16} &
\rollweekhead{17} \\
}{%
\end{tblr}\par\endgroup}
%======================================================================
% 九、数据行
%
% \rollrow{序号}{学号}{姓名}
% 后面 17 个空格留给手填考勤。
%
% ⚠️ 必须用 \def 而不是 \newcommand:tblr 的 expand= 选项在读取
% 环境体时就展开,\newcommand 生成的宏不可展开,& 会被当成
% 「Misplaced alignment tab」报错。
%======================================================================
\def\rollrow#1#2#3{%
#1 & #2 & #3 &
& & & & & & & & & & & & & & & & \\
}
%======================================================================
% 十、脚注(可选)
%======================================================================
\newcommand{\rollfoot}[1]{%
\par\vspace*{2mm}%
\begingroup\rollinfofont{\heiti 说明:}#1\par\endgroup}
\AtBeginDocument{\rollbasefont}
\endinput