使用pgfplotstable
库从包含数字和字母数字值的数据文件中定义表时,在编译这个简短的 MWE 示例时出现此错误“!包 PGF 数学错误:无法将输入‘B’解析为浮点数”。不明白这个例子有什么问题。
\documentclass{article}
%
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots,pgfplotstable,makecell,booktabs}
\begin{document}
\begin{table}
\pgfplotstabletypeset[%
columns/0/.style={column name=\makecell{Col1\\{}},
string type},
columns/1/.style={column name=\makecell{Col2\\{}},
column type=r,fixed},
columns/2/.style={column name=\makecell{$GD$\\{}},
column type=r,sci,zerofill},
columns/3/.style={column name=\makecell{$\Delta$\\{}},
column type=r,sci,zerofill},
every head row/.style={
before row={\toprule}, % have a rule at top
after row={\midrule} % rule under units
},
skip first n=1
]
{test_data.txt} % filename/path to file
\end{table}
\end{document}
test_data.txt
文件是:
Iter X Y Z
A 12.2 13.4 14.5
B 114.5 345.6 456.5
C 45 5 5
答案1
这skip first n
意味着跳过数据文件的第一行,但由于第一列包含非数字条目,因此 A 行被读取为带有列名的标题行。当您有一个包含列名的表时,您不能在设置列样式时使用列索引,即columns/<integer>/.style
。手册中说:
如果您的表没有列名,您可以简单地使用整数索引而不是
<column name>
引用列。如果您有列名,则无法使用索引设置列样式
因为你有列名,column/0/.style
会影响列姓名 0
, 和不是索引0
。没有这样的列,因此第一列没有得到键string type
,并且B
在那里找到的被解析为数字。但事实并非如此。
可能的修复:
- 添加
header=false
。这意味着 A 行将不会被解析为标题行,并且您可以使用索引来引用列。 - 删除
skip first n=1
,并使用Iter
、、X
和Y
(Z
即从第一行读取的列名)代替整数索引。 - 删除
skip first n=1
并改用display columns/<integer index>/.style
。(显示列作用于输出列而不是输入列。)
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplotstable,makecell,booktabs}
\begin{document}
\pgfplotstabletypeset[%
columns/0/.style={column name=\makecell{Col1\\{}},
string type},
columns/1/.style={column name=\makecell{Col2\\{}},
column type=r,fixed},
columns/2/.style={column name=\makecell{$GD$\\{}},
column type=r,sci,zerofill},
columns/3/.style={column name=\makecell{$\Delta$\\{}},
column type=r,sci,zerofill},
every head row/.style={
before row={\toprule}, % have a rule at top
after row={\midrule} % rule under units
},
every last row/.style={after row=\bottomrule},
header=false, % <---- add this
skip first n=1
]
{test_data.txt}
\bigskip
\pgfplotstabletypeset[%
columns/Iter/.style={column name=\makecell{Col1\\{}}, % <-- Iter
string type},
columns/X/.style={column name=\makecell{Col2\\{}}, % <-- X
column type=r,fixed},
columns/Y/.style={column name=\makecell{$GD$\\{}}, % <-- Y
column type=r,sci,zerofill},
columns/Z/.style={column name=\makecell{$\Delta$\\{}}, % <-- Z
column type=r,sci,zerofill},
every head row/.style={
before row={\toprule}, % have a rule at top
after row={\midrule} % rule under units
},
every last row/.style={after row=\bottomrule}
% skip first n=1 % <-- remove
]
{test_data.txt}
\bigskip
\pgfplotstabletypeset[%
display columns/0/.style={column name=\makecell{Col1\\{}}, % <-- display columns
string type},
display columns/1/.style={column name=\makecell{Col2\\{}}, % <-- display columns
column type=r,fixed},
display columns/2/.style={column name=\makecell{$GD$\\{}}, % <-- display columns
column type=r,sci,zerofill},
display columns/3/.style={column name=\makecell{$\Delta$\\{}}, % <-- display columns
column type=r,sci,zerofill},
every head row/.style={
before row={\toprule}, % have a rule at top
after row={\midrule} % rule under units
},
every last row/.style={after row=\bottomrule}
%skip first n=1 % <-- remove
]
{test_data.txt} % filename/path to file
\end{document}