\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