db.txt
我有一个这样的CSV 文件( ):
30.0, 0.0, 0.0
60.0, 1.9098, 5.8779
90.0, 6.9098, 9.5106
120.0, 13.09, 9.5106
150.0, 18.09, 5.8779
180.0, 20.0, 0.0
我需要排版。我的问题与小数点的错误对齐和小数位数有关(每列必须是常数):
\renewcommand*{\dtlrealalign}{r}
\DTLloaddb[
noheader,
keys={x,y,theta},
headers={
\shortstack{$\boldsymbol{\theta_{2,i}}$},
\shortstack{X},
\shortstack{Y}
}
]{db}{db.txt}
\begin{table}[t]
\caption{Database file}
\centering
\DTLdisplaydb{db}
\end{table}
请问有什么建议吗?
答案1
您可以使用pgfplotstable
来实现这一点。如果您加载array
包,您可以设置 的选项dec sep align
以pgfplotstabletypeset
获得小数点对齐。可以通过设置 来用零填充数字fixed zerofill
,可以使用 来设置小数位数precision
,可以针对所有列或针对单个列使用 来设置display column/<index>/precision=<digits>
。
\documentclass{article}
\usepackage{filecontents} % For the example data
\usepackage{pgfplotstable}
\usepackage{array} % For aligining at decimal point
\begin{filecontents}{testdata.csv}
theta, x, y
30.0, 0.0, 0.0
60.0, 1.9098, 5.8779
90.0, 6.9098, 9.5106
120.0, 13.09, 9.5106
150.0, 18.09, 5.8779
180.0, 20.0, 0.0
\end{filecontents}
\begin{document}
\pgfplotstableread[col sep=comma]{testdata.csv}{\table}
\pgfplotstabletypeset[
dec sep align, % Align at decimal point
fixed zerofill, % Fill numbers with zeros
precision=4, % Set number of decimals
display columns/0/.style={precision=1}, % Change for first column (column 0)
] {\table}
\end{document}
或者,您可以使用pgfplotstable
和siunitx
包来对齐列。我在这里将它与 booktabs 和正确格式化的列标题结合使用:
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepackage{booktabs}
\begin{filecontents}{testdata.csv}
theta, x, y
30.0, 0.0, 0.0
60.0, 1.9098, 5.8779
90.0, 6.9098, 9.5106
120.0, 13.09, 9.5106
150.0, 18.09, 5.8779
180.0, 20.0, 0.0
\end{filecontents}
\begin{document}
\pgfplotstableread[col sep=comma]{testdata.csv}{\table}
\pgfplotstabletypeset[
dec sep align=S, % Use the siunitx `S` column type for aligning at decimal point
fixed zerofill, % Fill numbers with zeros
precision=4, % Set number of decimals
display columns/0/.style={
precision=1, % Change for first column (column index 0)
column name=$\theta_{2,i}$
},
display columns/1/.style={column name=$X$},
display columns/2/.style={column name=$Y$},
every head row/.style={before row=\toprule, after row=\midrule},
every last row/.style={after row=\bottomrule},
] {\table}
\end{document}
答案2
datatool
使用包和包执行此操作也没有问题siunitx
。这是以这种方式完成的示例:
\documentclass{article}
\usepackage{datatool}
\usepackage{siunitx}
\usepackage{booktabs} % for nicer tables
\usepackage{caption} % improve caption spacing (among other things)
\usepackage{bm}
\renewcommand*\dtldisplaystarttab{\toprule}
\renewcommand*\dtldisplayendtab{\tabularnewline\bottomrule}
\renewcommand*\dtldisplayafterhead{\midrule}
\begin{document}
\DTLloaddb
[
noheader,
keys={x,y,theta},
headers={
\shortstack{$\boldsymbol{\theta_{{2,i}}}$},
\shortstack{X},
\shortstack{Y}}
]
{db}{db.txt}
\begin{table}[t]
\sisetup{
parse-numbers = false,
table-number-alignment = left,
table-figures-integer = 4,
table-figures-decimal = 4,
input-decimal-markers = .
}
\renewcommand*\dtlrealalign{S}
\caption{Database file}
\centering
\DTLdisplaydb{db}
\end{table}
\end{document}