LaTeX使用pgf-pie读取CSV绘制饼图数据缺失编译报错问题
问题原因分析
1. csvreader缺失记录的原因
csvsimple包默认解析CSV时不会自动识别引号包裹的字段内的分隔符,你CSV里"Lemons,Limes"这条记录的Name字段包含逗号,默认按全局逗号切割字段时,该行会被识别为3个字段,和表头的2个字段数量不匹配,csvsimple就会直接跳过该行,所以输出时丢失了这条记录。
要修复这个问题,调用\csvreader时需要加上respect quotes参数,让解析器识别引号包裹的字段,忽略字段内部的逗号。
2. \pie命令内嵌csvreader编译报错/挂起的原因
pgf-pie的\pie命令在解析参数时,要求传入的数值/标签列表是已经完全展开的纯文本格式,不支持在参数内部嵌套\csvreader这类带内部执行逻辑、需要逐行处理的宏命令。当你把\csvreader直接放在\pie的参数中时,\pie的参数解析逻辑和\csvreader的宏执行逻辑冲突,就会出现宏定义匹配错误,甚至陷入解析死循环导致编译挂起。
修复方案
正确的处理逻辑是提前用\csvreader把CSV数据读取并拼接成符合\pie要求的宏变量,再把这个预先生成的宏变量传给\pie即可,修复后代码如下:
\documentclass{article} \usepackage{csvsimple} \usepackage{pgf-pie} \usepackage{etoolbox} % 用于宏拼接 \begin{document} \begin{filecontents*}{fruit.csv} Name,Quantity "Apples",30 "Pears",25 "Lemons,Limes",40.5 "Peaches",34.5 "Cherries",20 \end{filecontents*} % 预定义空宏存储饼图数据 \def\piedata{} % 带引号识别读取CSV,拼接数据到宏 \csvreader[respect quotes]{fruit.csv}{Name = \Name, Quantity = \Quantity}{ \xappto\piedata{\expandonce\Quantity/\expandonce\Name,} } % 输出验证数据 \piedata \begin{tikzpicture} % 直接传入预生成的宏数据 \expandafter\pie\expandafter[polar, explode=0.1]{\piedata} \end{tikzpicture} \end{document}
内容的提问来源于stack exchange,提问作者B. A. Sylla
相关产品推荐
相关产品推荐

