使用xpinyin+pgfplotstable宏包结合CSV文件为名单加注拼音

表格 2019-09-05 17:37  浏览 :1705

在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代码(含注释),欢迎大家批评指正。

NameListPY.zip

发布评论
登录后方可评论!点击登录
全部评论 (2)
OsbertWang
1楼 · 2019-09-05 18:24

您可以将代码写入代码环境,直接贴在此处。不必再外链 paste.ubuntu.com

registor
2楼 · 2019-09-05 22:08

代码有点长,怕贴出来干扰大家,另,好像代码环境没有找到TeX格式,可否指点一下呢?