![pgfplotstable - 如何获取列中的数字以冒号格式化并在冒号处对齐](https://linux22.com/image/378642/pgfplotstable%20-%20%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%88%97%E4%B8%AD%E7%9A%84%E6%95%B0%E5%AD%97%E4%BB%A5%E5%86%92%E5%8F%B7%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%B9%B6%E5%9C%A8%E5%86%92%E5%8F%B7%E5%A4%84%E5%AF%B9%E9%BD%90.png)
我目前有一个 pgfplotstable longtable,其中前两列的值以度为单位(例如 5.678),但我想以小时:分钟:秒的形式显示它们。转换不是我的问题;我的文本文件会有正确的数字。我的问题是如何最好地制作表格(或格式化 txt 文件以便制作表格更容易),以便我可以在单元格内容中包含冒号并根据第一个冒号对齐。我的一些想法是:
1)使用 dec sep={:} 并实际用句点(hours.mins.sec)格式化我的 txt 文件,但这会失败(我假设是因为数字中有多个小数而不是只有一个)并且最后一个小数需要是真正的小数而不是冒号的占位符,所以我认为这不起作用。
2)格式化我的txt文件,以便将值分成小时列,分钟列和秒列,然后使用多列{3}{结盟} 然后也许可以添加 postproc 单元格内容来添加冒号,但我是初学者,所以我认为我不知道如何正确地做到这一点。此外,列之间的间距看起来也不正确。
有谁有其他想法吗?我需要一些大帮助!谢谢!
我的 MWE(对于我当前的表格 - 我尝试过的任何方法都不能被视为“工作”示例):
\documentclass{article}
\usepackage{booktabs} % For \toprule, \midrule and \bottomrule
\usepackage{siunitx} % Formats the units and values
\usepackage{pgfplotstable} % Generates table from .csv
\usepackage{longtable} % To display tables on several pages
\usepackage{array}
\usepackage{bm}
\usepackage{hyperref}
% Setup siunitx:
\sisetup{
% Rounds numbers
round-mode = places,
% to 4 places
round-precision = 3,
}
\pgfplotsset{compat=1.14} %was giving me backwards compatibility errors
\begin{document}
%%% Code from Dr. Christian for not using headers
\pgfkeysifdefined{/pgfplots/table/output empty row/.@cmd}{
\pgfplotstableset{
empty header/.style={
every head row/.style={output empty row},
}
}
}
\pgfplotstableset{
begin table=\begin{longtable},
end table=\end{longtable},
}
\pgfplotstabletypeset[
empty header,
col sep=space,
every head row/.append style={
before row={%
\caption{The caption}
\label{tab:DataTable}
\\ \toprule
% the dec sep align options makes two tabular columns, so we need multicolumn for the header
\multicolumn{2}{c}{\textbf{RA}} & \multicolumn{2}{c}{\textbf{Dec}} & \multicolumn{2}{c}{\textbf{S}} \\
\multicolumn{2}{c}{\bfseries hh:mm:ss} & \multicolumn{2}{c}{\bfseries deg:min:sec} & \multicolumn{2}{c}{\textbf{mJy}}
\\ \midrule
\endfirsthead
%
% split this over two lines, so that it doesn't make the table too wide
\multicolumn{6}{l}{{\bfseries \tablename\ \thetable{} -- continued from}} \\
\multicolumn{6}{l}{{\bfseries previous page}}
\\ \toprule
\multicolumn{2}{c}{\textbf{RA}} & \multicolumn{2}{c}{\textbf{Dec}} & \multicolumn{2}{c}{\textbf{S}}
\\ \midrule
\endhead
%
\midrule
\multicolumn{6}{c}
{{Continued on next page}}
\\ \bottomrule
\endfoot
%
\midrule
\multicolumn{6}{r}{}
\\ \bottomrule
\endlastfoot
}
},
display columns/0/.style={
dec sep align,
fixed, fixed zerofill,
precision=2
},
display columns/1/.style={
dec sep align,
fixed, fixed zerofill,
precision=2
},
display columns/2/.style={
dec sep align,
fixed, fixed zerofill,
precision=2
}
]{data.txt}
\end{document}
我的当前表的示例文件:
1.00 2.00 3.456
4.00 5.00 4.567
7.00 8.00 5.678
上述建议 1 的示例文件(每个值中除最后一个小数点外的所有小数点都需要更改为冒号):
01.00.0.00 02.00.0.00 3.456
04.00.0.00 05.00.0.00 4.567
07.00.0.00 08.00.0.00 5.678
上述建议 #2 的示例文件:
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
记住,我只想更改前两列。
欢迎大家提出任何想法。再次感谢!
答案1
我会选择建议#2,@{:}
在需要时用其作为分隔符。
我还添加了一些\phantom
s 来调整对齐。
\documentclass[a5paper]{article}
\usepackage{array}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.15}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{siunitx}
\usepackage{filecontents}
\begin{filecontents}{data.txt}
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
01 00 0.00 02 00 0.00 3.456
04 00 0.00 05 00 0.00 4.567
07 00 0.00 08 00 0.00 5.678
\end{filecontents}
\begin{document}
\pgfplotstableset{
begin table=\begin{longtable},
end table=\end{longtable},
}
\pgfplotstableset{
every head row/.style={output empty row},
every head row/.append style={before row={%
\caption{The caption}
\label{tab:DataTable}\\
\toprule
\multicolumn{3}{c}{\textbf{RA}} & \multicolumn{3}{c}{\textbf{Dec}} & \multicolumn{1}{c}{\textbf{S}} \\
\multicolumn{3}{c}{\bfseries hh:mm:ss} & \multicolumn{3}{c}{\bfseries deg:min:sec} & \multicolumn{1}{c}{\textbf{mJy}}
\\
\midrule
\endfirsthead
\multicolumn{7}{c}{\tablename\ \thetable{} -- continued from}\\
\multicolumn{7}{c}{previous page}\\[1ex]
\toprule
\multicolumn{3}{c}{\textbf{RA}} & \multicolumn{3}{c}{\textbf{Dec}} & \multicolumn{1}{c}{\textbf{S}} \\
\multicolumn{3}{c}{\bfseries hh:mm:ss} & \multicolumn{3}{c}{\bfseries deg:min:sec} & \multicolumn{1}{c}{\textbf{mJy}}
\\
\midrule
\endhead
\midrule
\multicolumn{7}{r}{Continued on next page}\\
\endfoot
\bottomrule
\endlastfoot
},
},
}
\pgfplotstabletypeset[col sep=space,
columns/0/.style={string type,column type=r,column type/.add={>{\phantom{.}}}{@{:}}},
columns/1/.style={string type,column type=c,column type/.add={}{@{:}}},
columns/2/.style={string type,column type=l},
columns/3/.style={string type,column type=r,column type/.add={>{\phantom{0.}}}{@{:}}},
columns/4/.style={string type,column type=c,column type/.add={}{@{:}}},
columns/5/.style={string type,column type=l},
columns/6/.style={string type,column type={S[table-format=1.2, round-mode=places,
round-precision=2]}}
]{data.txt}
\end{document}
第一页:
第二页: