考虑一下这个MWE:
\documentclass{article}
\usepackage{amsmath}
\usepackage{booktabs}
\usepackage{siunitx}
\begin{document}
\begin{tabular}{l @{\hskip+0.5em} S[retain-unity-mantissa = false]}
\toprule
Force & \multicolumn{1}{c}{Relative Strength} \\
\midrule
Strong & 1 \\
Electromagnetic & 1e-3 \\
Weak & 1e-8 \\
Gravity & 1e-37 \\
\bottomrule
\end{tabular}
\end{document}
产生
显然数字没有正确对齐。是我使用siunitx
不当还是这是一个错误?如果是这样,有人能想出解决办法吗?
答案1
这确实超出了范围siunitx
(因为没有小数部分)。当然应该解决这个问题,但目前最好的解决方案可能是低级解决方案。例如,如果我们可以假设我们可以通过拾取分隔符来获取单元格内容,\\
那么
\documentclass{article}
\usepackage{array,booktabs}
\newlength\mylength
\AtBeginDocument{\settowidth\mylength{$10^{-37}$}}
\newcommand*\autoexp{}
\def\autoexp\ignorespaces#1\\{\autoexpaux#1e\stop\\}
\newcommand\autoexpaux{}
\def\autoexpaux#1e#2\stop{%
\setbox0=\hbox to \mylength{%
$
\ifx\relax#2\relax
#1
\else
\ifnum#1=1 %
\else
\times
\fi
\autoexpauxii#2\stop
\fi
$%
\hfil
}%
\hfil\box0\hfil
}
\newcommand\autoexpauxii{}
\def\autoexpauxii#1e#2\stop{10^{#1}}
\begin{document}
\begin{tabular}{@{}l>{\autoexp}l@{}}
\toprule
Force & \multicolumn{1}{l}{Relative Strength\hspace*{-\tabcolsep}} \\
\midrule
Strong & 1 \\
Electromagnetic & 1e-3 \\
Weak & 1e-8 \\
Gravity & 1e-37 \\
\bottomrule
\end{tabular}
\end{document}
会起作用。这里的想法是抓取单元格内容,然后进行快速解析:如果有部分e
,则使用该部分,但删除任何前导部分1
,如果没有,则e
直接使用它。所有内容都被装箱成宽度等于(硬编码)最宽列的宽度,然后该框被正确放置在标题下方。
可以进行改进,例如更稳健地收集细胞,允许使用不同形式的数字,ETC。,但最好还是由我在siunitx
这里修复。
答案2
这种情况在包中没有处理siunitx
,因为很难说应该发生什么。如果你要对齐数字,你应该将个位数与个位数对齐,将十位数与十位数对齐,将百位数与百位数对齐……对于指数符号,这会变得更加复杂,因为你将幂与普通数字混合在一起。我想,最好的解决方案是写10^0
在第一行,因为这样看起来最一致。在每种情况下,你都必须手动输入。
这是您的版本,位于1
第二行(没有像您的评论中那样左对齐,因为这看起来确实令人困惑):
% arara: pdflatex
\documentclass{article}
\usepackage{booktabs}
\usepackage{siunitx}
\begin{document}
\begin{tabular}{l @{\hskip+0.5em} S[table-format = 2.0, table-space-text-post =\textsuperscript{$-37$}]}
\toprule
Force & {Relative Strength} \\
\midrule
Strong & 1 \\
Electromagnetic & 10\textsuperscript{$-3$} \\
Weak & 10\textsuperscript{$-8$} \\
Gravity & 10\textsuperscript{$-37$} \\
\bottomrule
\end{tabular}
\end{document}