我有两个关于 pgfplotstable 和使用 pgf 进行数字格式化的问题。请考虑以下代码:
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{amsmath}
\begin{document}
\pgfplotstableread{
A B C
1.1 12 1300000
21.1 200000 214300000
}\mytable
\pgfplotstabletypeset[columns={A, B, C},
columns/A/.style={postproc cell content/.append style={
/pgfplots/table/@cell content/.add={}{ s}}, fixed zerofill, precision=1
},
columns/C/.style={postproc cell content/.append style={
/pgfplots/table/@cell content/.add={}{ s${}^{-1}$}}, fixed zerofill, precision=1
}
]\mytable
\end{document}
我想:
- 将 A 列的内容与小数点分隔符对齐(显然我已经尝试过了,
dec sep align
但它搞乱了postproc cell content
(它在小数点分隔符“。”之前添加了“ s” - 例如:21 s.1 s),除此之外它对齐得很好, - 使用工程符号打印 B 列的数字(十的幂必须是三的倍数)- 例如:
$200\:\cdot\:10^{3}$
而不是$2\:\cdot\:10^{5}$
) - 对 C 列执行以下所有操作:附加内容、使用工程符号打印、在
\cdot
工程符号上对齐(如sci sep align
)
您知道实现这些目标的一些方法吗?
编辑
感谢 Jake 的回答,我几乎得到了我想要的东西,但是我还有最后一个与 siunitx 有关的问题。以下代码片段可以编译(请注意使其alias
编译,否则 siunitx 会失败。)
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepackage{booktabs}
\begin{document}
\pgfplotstableset{
alias/as/.initial=d,
}
\pgfplotstableread{
d
7000000
}\loadedtable
\pgfplotstabletypeset[columns={as},
columns/as/.style={
column name={$2 \times 3d$},
}
]\loadedtable
\end{document}
接下来的这篇文章没有:
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepackage{booktabs}
\begin{document}
\pgfplotstableset{
alias/as/.initial=d,
}
\pgfplotstableread{
d
7000000
}\loadedtable
\pgfplotstabletypeset[columns={as},
columns/as/.style={
column name={$2 \times 3d$},
column type={S[round-mode=places, round-precision=1, scientific-notation=engineering, table-format=5.1e1, exponent-product = \cdot]},
string type
}
]\loadedtable
\end{document}
如何避免 siunitx 解析标题?(我猜,这也使得使用带有字母“e”和“d”的列标识符成为可能)
答案1
您可以让它siunitx
负责对齐和格式化数字:从 2.4 版开始,siunitx
可以将数字格式化为工程符号。
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\begin{document}
\pgfplotstableread{
A B C
1.1 12 1300000
21.1 200000 214300000
}\mytable
\pgfplotstabletypeset[columns={A, B, C},
columns/A/.style={
column type={S[table-format=2.1]},
string type,
postproc cell content/.append style={
/pgfplots/table/@cell content/.add={}{\,s}
}
},
columns/B/.style={
column type={S[round-mode=figures, round-precision=3, scientific-notation=engineering, table-format=3e1]},
string type,
postproc cell content/.append style={
/pgfplots/table/@cell content/.add={}{\,\si{\per\second}}
}
},
columns/C/.style={
column type={S[round-mode=figures, round-precision=3, scientific-notation=engineering, table-format=5.2e1]},
string type,
postproc cell content/.append style={
/pgfplots/table/@cell content/.add={}{\,s}
}
},
]\mytable
\end{document}
我可以建议对您的表格设置进行一些小改动吗?我不会在每个值上重复单位符号,而是将其放入标题中。下面是一个如何实现的示例。我还使用该booktabs
包使表格更容易理解:
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepackage{booktabs}
\begin{document}
\pgfplotstableread{
A B C
1.1 12 1300000
21.1 200000 214300000
}\mytable
\pgfplotstabletypeset[columns={A, B, C},
columns/A/.style={
column type={S[table-format=2.1]},
string type
},
columns/B/.style={
column type={S[round-mode=figures, round-precision=3, scientific-notation=engineering, table-format=3e1]},
string type
},
columns/C/.style={
column type={S[round-mode=figures, round-precision=3, scientific-notation=engineering, table-format=3.2e1]},
string type
},
every head row/.style={
before row={\toprule},
after row={\si{\second} & \si{\per\second} & \si{\second}\\ \midrule}
},
every last row/.style={after row=\bottomrule}
]\mytable
\end{document}
要停止siunitx
尝试解析列名,请发出键multicolumn names
。这会将头行中的单元格包裹在 中\multicolumn{1}{c}{<column name>}
,从而保护它们。
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepackage{booktabs}
\begin{document}
\pgfplotstableread{
d
7000000
}\loadedtable
\pgfplotstabletypeset[
multicolumn names,
columns/d/.style={
column name=$\gamma \times \epsilon$,
column type={
S[
round-mode=places,
round-precision=1,
scientific-notation=engineering,
table-format=1.1e1,
exponent-product = \cdot
]
},
string type
}
]\loadedtable
\end{document}