在LaTeX排版中,对于表格的处理往往是一件较为繁琐的事情。本文结合一个考勤表中给姓名加注拼音的排版实例,使用pgfplotstable宏包,通过调用CSV逗号分隔值文件 (Comma-Separated Values,有时也称为字符分隔值,因为分隔字符也可以不是逗号) ,结合xpinyin宏包,实现了LaTeX表格排版与数据的分离。
一、准备数据文件
数据文件由标题行和数据行构成,用逗号进行分割各个字段,如:
idx,stno,name,class,1,2,3,4,5,6,7,8,9,10,11,12,notes 1,2019012800,许涵启,计算机类1905,,,,,,,,,,,,, ...... 30,2019012804,褚躞霖,计算机类1905,,,,,,,,,,,,, 32,,,,,,,,,,,,,,,, ...... 34,,,,,,,,,,,,,,,,
标号为1-12的列为考勤记录空白列,32-34为空白行,可根据需要进行删减。
其中,标题行各字段名称要与LaTeX代码中使用的名称保持一致。
注意:CSV文件中数据可以为空,但逗号不能省略
数据文件可以用Excel等软件生成:
注意选择另存为csv文件:
注意检查CSV文本文件是否为UTF8编码,否则,无法正确处理中文:
二、读入CSV文件
可以使用pgplotstable宏包的pgfplotstabletypeset读入数据文件进行表格排版。
在此,使用\\newcommand{\\xpynamelist}[1][namelist.csv]{...}将处理过程定义为一个自定义宏命令,并以CSV数据文件名称做1个参数传入该命令,以方便进行代码复用。
使用pgplotstable宏包的\\pgfplotstabletypeset[...]{#1}时,重要的是通过其可选参数对CSV文件中各列及各行的数据排版进行各类设置,其中,重要有:
1. 使用longtable宏包生成跨页表格(需要在导言区使用\\usepackage{longtable}):
begin table=\\begin{longtable}, end table=\\end{longtable},
2. 通过every head row/.style中的before row=和after row=参数设计表头和跨页表头
% 表头设计 every head row/.style={ before row={ % \\pgfplotstablecols为总列数 \\multicolumn{\\pgfplotstablecols}{c}{\\bf\\large \\LaTeX{}通天大学\\semester{}季学期学生课程考勤表}\\\\ \\multicolumn{\\pgfplotstablecols}{l}{课程名称: \\coursename{}\\hfill 课程代码:\\courseid{}\\hfill 课序号: \\courseidx{}\\hfill 任课教师:\\teacher{}}\\\\ \\hline % 计算平时考勤登记列数 \\pgfmathtruncatemacro{\\len}{\\pgfplotstablecols-4} % 将平时考勤登记列数存入\\colslen宏 \\global\\let\\colslen\\len \\multirow{2}{*}{序号}&\\multirow{2}{*}{学号}&\\multirow{2}{*}{姓名}&\\multirow{2}{*}{班级}&\\multicolumn{\\colslen}{c|}{平时考勤}\\\\ \\cline{5-\\pgfplotstablecols} }, after row={ % 生成跨页表头 \\endfirsthead %\\multicolumn{\\pgfplotstablecols}{l}{续前页}\\\\ \\multicolumn{\\pgfplotstablecols}{c}{\\bf\\large \\LaTeX{}通天大学\\semester{}季学期学生课程考勤表}\\\\ \\multicolumn{\\pgfplotstablecols}{l}{课程名称: \\coursename{}\\hfill 课程代码:\\courseid{}\\hfill 课序号: \\courseidx{}\\hfill 任课教师:\\teacher{}}\\\\ \\hline \\multirow{2}{*}{序号}&\\multirow{2}{*}{学号}&\\multirow{2}{*}{姓名}&\\multirow{2}{*}{班级}&\\multicolumn{\\colslen}{c|}{平时考 勤}\\\\ \\cline{5-\\pgfplotstablecols} % 计算平时考勤登记列数 \\pgfmathtruncatemacro{\\repcols}{\\pgfplotstablecols-5} % 将平时考勤登记列数存入\\colslen宏 \\global\\let\\repcnt\\repcols % 循环产生跨页表头标题行 &&&&\\xintiloop [1+1] \\xintiloopindex & \\ifnum\\repcnt>\\xintiloopindex\\space \\repeat 备注\\\\ \\hline \\endhead \\multicolumn{\\pgfplotstablecols}{|l|}{备注:出勤:$\\surd$\\ 缺勤:$\\times$\\ 迟 到:$\\bigtriangleup$\\ 早退:$\\bigcirc$\\ 事假: $\\bigtriangledown$\\ 病假:$\\oplus$}\\\\ \\hline %\\multicolumn{\\pgfplotstablecols}{r}{续下页} \\\\ \\endfoot \\endlastfoot }, },
其中,\\xintiloop命令来自xinttools宏包,用于根据考勤空白列列数实现标题行各列标题名称。
3. 对姓名列通过“postproc cell content”后处理参数加注拼音:
% 采用后处理方式加注拼音 postproc cell content/.append style={ /pgfplots/table/@cell content/.add={\\begin{pinyinscope}}{\\end{pinyinscope}}, },
其它细节,请参阅LaTeX代码中的注释。
三、多音字处理
xpinyin宏包的拼音数据中,对于多音字,选用的是常用读音。这可能无法满足需要,为此,可以有两种方案对多音字进行处理:
1. 用\\setpinyin{⟨汉字⟩}{⟨拼音⟩}命令全局设置多音字的首选读音,如:
\\setpinyin{解}{xie4} \\setpinyin{冼}{xian3} \\setpinyin{单}{shan4} ......
2. 在CSV数据文件中用\\xpinyin{⟨单个汉字⟩}{⟨拼音⟩}命令对指定的汉字局部设置读音,如:
9,2019012808,单\\xpinyin{单}{dan1},计算机类1905,,,,,,,,,,,,, 11,2019012808,\\xpinyin{尉}{yu4}迟敬德,计算机类1905,,,,,,,,,,,,,
关于xpinyin和pgplotstable宏包的使用说明,请使用texdoc命令进行查阅。
附件是CSV数据文件及LaTeX代码(含注释),欢迎大家批评指正。
您可以将代码写入代码环境,直接贴在此处。不必再外链 paste.ubuntu.com
代码有点长,怕贴出来干扰大家,另,好像代码环境没有找到TeX格式,可否指点一下呢?