使用 pgfplotstable 进行表格排版

使用 pgfplotstable 进行表格排版

我有两个关于 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}

我想:

  1. 将 A 列的内容与小数点分隔符对齐(显然我已经尝试过了,dec sep align但它搞乱了postproc cell content(它在小数点分隔符“。”之前添加了“ s” - 例如:21 s.1 s),除此之外它对齐得很好,
  2. 使用工程符号打印 B 列的数字(十的幂必须是三的倍数)- 例如:$200\:\cdot\:10^{3}$而不是$2\:\cdot\:10^{5}$
  3. 对 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}

相关内容