我想创建一个左对齐的表格,但忽略减号。例如,下面给出了一个正常的左对齐表格
\begin{tabular}{llll}
& a & b & c \\
A & -0.62645 & -0.82047 & 1.51178 \\
B & 0.18364 & 0.48743 & 0.38984 \\
C & -0.83563 & 0.73832 & -0.62124 \\
\end{tabular}
而以下代码返回的是我真正想要的
\begin{tabular}{llll}
& { }a & { }b & { }c \\
A & -0.62645 & -0.82047 & { }1.51178 \\
B & { }0.18364 & { }0.48743 & { }0.38984 \\
C & -0.83563 & { }0.73832 & -0.62124 \\
\end{tabular}
问:有没有更聪明的方法来做到这一点?
答案1
我会用dcolumn
包定义一种新的列类型,其小数点对齐方式为“左边两位,右边五位”(在这种情况下,将自动获得标题所需的对齐方式):
\documentclass{article}
\usepackage{dcolumn}
\newcolumntype{L}{D{.}{.}{2,5}}
\begin{document}
\begin{tabular}{lLLL}
& $a$ & $b$ & $c$ \\
A & -0.62645 & -0.82047 & 1.51178 \\
B & 0.18364 & 0.48743 & 0.38984 \\
C & -0.83563 & 0.73832 & -0.62124 \\
\end{tabular}
\end{document}
答案2
除了该dcolumn
包之外,还有一个siunitx
包,它提供了一个名为的列类型S
,允许在小数点标记上对齐。
以下 MWE 使用此列类型。请注意,S
列中的数字数据会自动进入数学模式——因此正确使用了“数学减号”符号。还请注意,标题行中的单元格使用专用的列类型(名为“ N
”)排版,其作用类似于文本模式l
列,只是条目会自动向右移动(不可见的)数学减号符号的量。
\documentclass{article}
\usepackage{siunitx,array}
\sisetup{table-format=-1.5, group-digits=false}
\newcolumntype{L}{>{\phantom{$-$}}l} % prefix some whitespace
\newcommand\mcL[1]{\multicolumn{1}{L}{#1}} % handy shortcut macro
\let\familydefault\sfdefault % optional: switch to a sans-serif font
\begin{document}
\begin{tabular}{lSSS}
& \mcL{a} & \mcL{b} & \mcL{c} \\
A & -0.62645 & -0.82047 & 1.51178 \\
B & 0.18364 & 0.48743 & 0.38984 \\
C & -0.83563 & 0.73832 & -0.62124 \\
\end{tabular}
\end{document}
生产:
答案3
忽略减号左对齐的一种方法是使用包裹collcell
处理表条目如下:
- 如果数字为负数,则将数字置于数学模式
- 如果数字是正数,则添加
\phantom{-}
并将数字置于数学模式 - 否则只需添加
\phantom{-}
。这是为了跳过列标题
通过这个我定义了一个新的列类型L
,这样你就不必为实际表格中的任何格式而烦恼了。所以,你只需写(这里手动留出空格只是为了方便阅读):
\begin{tabular}{lLLL}
& a & b & c \\
A & -0.62645 & -0.82047 & 1.51178 \\
B & 0.18364 & 0.48743 & 0.38984 \\
C & -0.83563 & 0.73832 & -0.62124
\end{tabular}
你会得到:
下面我已经使用了包裹xstring
解析内容,但可能有纯 TeX 方式可以做到这一点。我更喜欢它,xstring
因为它更容易阅读。
\documentclass{standalone}
\usepackage{xstring}
\usepackage{collcell}
\newcommand{\AddPhantomMinusIfNeeded}[1]{%
\IfDecimal{#1}{% Is a decimal, so if not negative add a \phantom{-}%
\IfBeginWith{#1}{-}{\ensuremath{#1}}{\ensuremath{\phantom{-}#1}}%
}{%
\ensuremath{\phantom{-}}#1% Not a decimal number so just leave it alone
}%
}%
\newcolumntype{L}{>{\collectcell\AddPhantomMinusIfNeeded}{l}<{\endcollectcell}}
\begin{document}
\begin{tabular}{lLLL}
& a & b & c \\
A & -0.62645 & -0.82047 & 1.51178 \\
B & 0.18364 & 0.48743 & 0.38984 \\
C & -0.83563 & 0.73832 & -0.62124
\end{tabular}
\end{document}
需要注意的是,如果所有单元格条目的位数相同,此解决方案将产生良好的结果。此处的其他解决方案更适合小数对齐的一般情况。
答案4
我认为没有多少更聪明有很多方法可以做到这一点,因为这取决于范围(您有多少个这样的表,或者它们有多大,以及您希望在多大程度上自动化这个过程)和一些美学。然而,有很多其他做法:
\documentclass{article}
\begin{document}
\begin{tabular}{lrrr}
& \multicolumn{1}{l}{$\phantom{-}$a} &
\multicolumn{1}{l}{$\phantom{-}$b} &
\multicolumn{1}{l}{$\phantom{-}$c} \\
A & $-0.62645$ & $-0.82047$ & $ 1.51178$ \\
B & $ 0.18364$ & $ 0.48743$ & $ 0.38984$ \\
C & $-0.83563$ & $ 0.73832$ & $-0.62124$ \\
\end{tabular}
\end{document}
以上使用数学模式排版您的数字tabular
。或者,您也可以在环境中排版整个表格array
,并仅在需要时切换到文本模式(例如,对于列/行索引)。为此,amsmath
提供\text{<stuff>}
,其中<stuff>
可以包含空格。
r
此外,上述建议的目的是对包含数字的列使用右对齐,并l
仅对列索引(第 1 行)切换为左对齐。这样,您只需要担心“标题”中的减号。此外,减号的对齐调整是通过 完成的,\phantom{<stuff>}
这样可以留出相当于 的空间,而<stuff>
无需实际排版。这在一般情况下很有用,在这种情况下,您希望为减号以外的其他内容留出空间,并且间距由字体和文本模式调整。
以下是另一种利用零宽度列分隔@{}
来消除连续列之间间隙的替代方法:
\documentclass{article}
\begin{document}
\begin{tabular}{l*{3}{r@{}l}}
& &a & &b & &c \\
A & $-$&$0.62645$ & $-$&$0.82047$ & &$1.51178$ \\
B & &$0.18364$ & &$0.48743$ & &$0.38984$ \\
C & $-$&$0.83563$ & &$0.73832$ & $-$&$0.62124$ \\
\end{tabular}
\end{document}