Files

215 lines
7.9 KiB
TeX
Raw Permalink Normal View History

\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