在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格式,可否指点一下呢?