\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}{13bp}\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{\rollfield}[2]{% {\heiti #1}:#2} %====================================================================== % 五、标题 %====================================================================== \newcommand{\rolltitle}[1]{% \par\begingroup\centering {\heiti\rolltitlefont #1\par}% \endgroup\vspace*{2mm}} %====================================================================== % 六、课程信息区 % % 两行,每行三项,用 \hfill 撑开 %====================================================================== \newcommand{\rollinfo}{% \begingroup\rollinfofont \noindent \rollfield{课程名称}{\rollcourse}\hfill \rollfield{课程号}{\rollcno}\hfill \rollfield{选课号}{\rollsno}\par\vspace*{1.2mm} \noindent \rollfield{学分}{\rollcredit}\hfill \rollfield{任课教师}{\rollteacher}\hfill \rollfield{学年学期}{\rollterm}\par \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