我想使用 包含文本的某些单元格dec sep align
的功能。我尝试了以下方法:pgfplotstable
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{booktabs}
\begin{document}
\pgfplotstabletypeset[%
col sep=&, row sep=\\,header=false,
every head row/.style={before row={\toprule}, after row={\midrule}},
every last row/.style={after row=\bottomrule},
display columns/0/.style={column name={A}, string type, column type={l}},
display columns/1/.style={column name={B}, dec sep align={l}},
display columns/2/.style={column name={C}, dec sep align={l}},
every row 2 column 1/.style={string type},
every row 3 column 1/.style={string type},
]
{%
Xyzzy ! & 208.5 & 42.01 \\
Nothing & 7.91 & 42.1 \\
Happens & -- & 200.2 \\
\ldots & z & 4.54 \\
}
\end{document}
但结果却是这样的:
您知道为什么文本单元格与下一个单元格之间的分隔线会被吞没吗?我该如何纠正这种行为?我欢迎任何可以制作正确间距表格(小数点分隔符对齐)的建议,即使我必须放弃那个pgfplotable
特定的表格。但我宁愿坚持下去,这样我就可以保留大部分表格。
我放弃了之前的编辑,提出了另一个问题(看这里)因为担心把它们放在一起会让人感到困惑
答案1
将dec sep align
其列拆分为两个子列(小数点分隔符之前和之后的数字部分各一个)。通常,pgfplotstable
检查单元格中的数字是否有小数点分隔符,如果没有,则添加一个空单元格作为小数部分的占位符。当您设置为单个单元格时,不会进行该检查,也不会添加string type
占位符单元格(只是一个)。但是,仍然假设列始终包含两个单元格,因此将使用下一列的第一个单元格而不是占位符单元格。&
pgfplotstable
dec sep align
因此,我们必须手动添加一个空的占位符单元格。我们不能直接&
在表格中的字符串后面添加一个,因为这会使列计数偏离,所以我们必须更狡猾一些:有一个postproc cell content
键,它允许我们在处理完单元格后向其中添加内容。&
不过,在这里只添加一个也行不通,因为那会增加两个&
s(因为如上所述,pgfplotstable
仍然假设一列中有两个单元格dec sep align
,并且postproc cell content
这两个单元格都会执行该键)。幸运的是,有一个名为的宏\pgfplotstablepartno
包含当前“子单元格”的索引,它用于小数分隔符0
之前的部分和1
之后的部分。这可以在一个中用于\ifnum
仅添加一个&
。
用新的方式包装它,我们得到
\pgfkeys{
/pgfplots/table/string type in dec sep align/.style={
string type,
postproc cell content/.code={%
\ifnum\pgfplotstablepartno=0%
\pgfkeys{/pgfplots/table/@cell content/.add={}{&}}
\fi
}%
}
}
这允许我们将列中的单个单元格设置dec sep align
为string type in dec sep align
。这将产生所需的输出:
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{booktabs}
\begin{document}
\pgfkeys{
/pgfplots/table/string type in dec sep align/.style={
string type,
postproc cell content/.code={%
\ifnum\pgfplotstablepartno=0%
\pgfkeys{/pgfplots/table/@cell content/.add={}{&}}
\fi
}%
}
}
\pgfplotstabletypeset[%
col sep=&, row sep=\\,header=false,
every head row/.style={before row={\toprule}, after row={\midrule}},
every last row/.style={after row=\bottomrule},
display columns/0/.style={column name={A}, string type, column type={l}},
display columns/1/.style={column name={B}, dec sep align},
display columns/2/.style={column name={C}, dec sep align},
every row 2 column 1/.style={string type in dec sep align},
every row 3 column 1/.style={string type in dec sep align},
]
{%
Xyzzy ! & 208.5 & 42.01 \\
Nothing & 7.91 & 42.1 \\
Happens & -- & 200.2 \\
\ldots & z & 4.54 \\
}
\end{document}